Намалюйте шашку ASCII


25

Підсумок

Натхненний недавньою популярністю мистецьких викликів ASCII, метою цього виклику є намалювати шашку ASCII, як ту, на якій можна грати в шахи.

Напишіть програму, яка приймає додатне ціле число nяк аргумент, stdinвведення або як введення користувача та виводить контрольну дошку з nx nквадратами разом із рамкою, що має товщину 1 символ.

Кожен квадрат повинен містити 2х2 символи. Квадрати повинні відповідати звичайному чергуванню біло-чорного (спочатку білого, як у верхньому лівому куті) шаблону шахів. Білі квадрати повинні складатися з символів місця ( ), а чорні - з #символів фунта ( ).

Облямівка повинна бути зроблена з тире ( -) з плюсом ( +) на межі або перпендикулярній точці квадрата.

Вхідні дані

Позитивне ціле число, яке представляє кількість квадратів (розміри в квадратах), які потрібно намалювати на шахмі, при цьому кожен квадрат має 2х2 символи.

Приклад результатів

n=2

+--+--+
|  |##|
|  |##|
+--+--+
|##|  |
|##|  |
+--+--+

n=3

+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+

n=4

+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+

... і так далі.


Примітки

  • Додаткові місця та нові лінії є прийнятними.
  • Ви можете написати або всю програму, або функцію.
  • Немає провідних просторів.
  • Ваша програма повинна відображати правильні результати для n = 15.
  • Для менш відомих езотеричних мов і подібних надайте посилання на мову.
  • n=0повинні виробляти +. (необов’язково, але дуже рекомендується та рекомендується.)
  • Найкоротший код у байтах виграє, оскільки це код гольфу.

2
Ласкаво просимо до головоломки програмування та коду для гольфу! Приємна робота тут, особливо для вашого першого виклику. Я з нетерпінням чекаю більше ваших речей.
Олексій А.

Я думаю, "Ваша програма повинна відображати правильні результати для n = 15." означає "до n = 15"?
Джон Дворак

"Ваша програма повинна відображати правильні результати для n = 10." означає, що якщо ваша програма не може належним чином відобразити до n = 15, вона не повинна розміщуватися. Але це не означає, що ви повинні використовувати / зловживати цим і написати програму, яка може перевищувати n = 15.
кдрагон

Я upvote перевірених робочих відповідей, навіть якщо вони не виробляють +для n=0.
кдрагон

Вибачте, що ніколи не приймав переможця. Приймаю зараз.
кдрагон

Відповіді:


16

J, 24 байти

Анонімна функція:

2 2&$&.>@(' #'{~2|+/~@i.)

Використання:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+

1
&.>є на один коротший, ніж each. Варто зазначити, що він працює лише у тому випадку, якщо BoxFormвстановлено ASCII.
randomra

10

Пітон 2, 79

N=3*input()+1
for i in range(N):print('+||- #- #+||-# -# '*N)[3**i%7/2%3:3*N:3]

Для кожного ряду вибираємо один із шаблонів

+--+--+--+--+--+
|  |##|  |##|  |
|##|  |##|  |##|

і друкує 3*n+1з нього символів. Шаблон вибирається шляхом повторення своїх перших 6 символів, вибраних трюком переплетення рядків, який також служить для отримання фрагмента правильної довжини.

Правильний візерунок вибирається виходячи зі значення індексу рядків iпо модулю 6 арифметичним виразом, 3**i%7/2%3який дає повторюваний шаблон [0,1,1,0,2,2]. Я знайшов це, використовуючи той факт, що x**i%7має період 6, а потім пробуючи різні значення xта різні постпроцесори, щоб отримати правильну схему.



9

CJam, 43 42 байт

ri3*)_2m*{_3f%:!2b\3f/:+2%(e|"#|-+ "=}%/N*

Спробуйте в Інтернеті .

Кожна координата відображається на картці, наприклад, у верхньому лівому куті (0, 0) -> "+". Конкретно ми проводимо розрахунок

[(y%3 == 0)*2 + (x%3 == 0)] or [(x//3 + y//3) % 2 - 1]

і відповідно індексувати у рядок "#|-+ ".


6

Сітківка , 106 байт

1
$_0$_x
1(?=1*0)
+--
1(?=1*x)
s
(0s.*?0)s
$1o
(s\D*?)s
$1o
s
|  
o
|##
\D*?x
$0$0
0
+n
x
|n
(.*?n).*
$0$1

Приймає інформацію як одинакову (на основі цієї мета-дискусії ).

Кожен рядок повинен мати свій власний файл і його nслід змінити на новий рядок у файлах. Це недоцільно, але ви можете запустити код як один файл із -sпрапором, зберігаючи nмаркери. Ви можете змінити n's на нові рядки у висновку для читабельності, якщо бажаєте. Наприклад:

> echo -n 111|retina -s checkerboard|tr n '\n'
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+

Подальше гольф і деякі пояснення з’являються пізніше.


4

JavaScript (ES6), 117

n=>Array(n*3+1).fill("+--".repeat(n)+"+").map((v,i)=>v.replace(/./g,(k,x)=>i%3?"|  |##|  "[x%6+(i%6>2)*3]:k)).join`
`

Фрагмент:

<input type="range" min=2 max=15 step=1 value=1 id="i" oninput="o.textContent=f(this.value)"><pre id="o"></pre><script>function f(n){ return Array.apply(0,Array(n*3+1)).map(function(){return "+--".repeat(n)+"+"}).map(function(v,i){ return v.replace(/./g,function(k,x) { return i%3?"|  |##|  "[x%6+(i%6>2)*3]:k}) }).join("\n") };o.textContent=f(2)</script>

Анонімна функція. Запуски з повним набором +--+--+--...ліній, а також на відповідних лініях, замінює +для |і -для або #в залежності від обставин.

Вираз, який визначає символ заміни "| |##| "[x%6+(i%6>2)*3],, ймовірно, може бути подано далі в гольф, але я виявив, що, використовуючи довший, надлишковий рядок, економиться більше символів, ніж складний обчислення.


Гарне використання ES6! Ефект від слайдера в фрагменті є приємним доповненням. Чи можете ви надати пояснення та версію, що не має волі?
кдрагон


3

CoffeeScript з ES6, 106 байт

f=(n,y=z='+--'[r='repeat'](n)+'+\n')->y+=('|##|  '[r](n).substr(i%2*3,n*3)+'|\n')[r](2)+z for i in[1..n];y

JavaScript (ES6), 111 байт

Нові рядки є значущими і рахуються як 1 байт кожен.

Явне повернення зробило це трохи довше:

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

Демо

На момент написання повідомлення, Firefox - єдиний великий браузер, сумісний з ES6.

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

// Demonstration related things
document.getElementById('O').innerHTML = f(document.getElementById('n').value);

document.getElementById('n').addEventListener('change', function () {
  document.getElementById('O').innerHTML = f(this.value);
});
<p><input id=n type=number min=0 step=1 value=6></p>
<pre><output id=O></output></pre>


3

Пітон 3, 114 108 100

def f(n):
 for i in range(3*n+1):print(("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1]if i%3 else"+--"*n+"+")


Попередні рішення

108

def f(n):
 for i in range(3*n+1):
  a=("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1];print(a if i%3 else"+--"*n+"+")

114

def f(n):a="+--"*n+"+\n";b="|  |##"*n+"|";print(a+a.join(([(b[:3*n+1]+"\n")*2,(b[::-1][:3*n+1]+"\n")*2]*n)[:n])+a)

118 (не подано)

def f(n):
 for i in range(3*n+1):print((("|##|  "*n)[:3*n+1]if i//3%2 else("|  |##"*n)[:3*n+1])if i%3 else"+--"*n+"+")

3

CJam, 46 байт

li3*)_2m*[{_3f/2f%:=\3f%:g+2b"+-|#+-| "=}/]/N*

Спробуйте в Інтернеті

Що ж, я сподівався, що принаймні матиму оригінальне рішення (я зазвичай не переглядаю інших відповідей, перш ніж працювати над собою). Виявляється, @ Sp3000 вже зробив щось дуже схоже, тільки краще. Але оскільки я вже зробив роботу, я думав, що все-таки опублікую її.

Пояснення:

li    Get input n.
3*)   Calculate 3*n+1, which is the total width/height.
_     Copy size. We'll need it at the end to insert the newlines.
2m*   Calculate cartesian power with 2. This enumerates all coordinate pairs.
[     Wrap characters in array for split operation at the end.
  {     Loop over all coordinate pairs.
    _     Copy coordinate pair.
    3f/   Divide coordinates by 3.
    2f%   Modulo 2. This characterizes even/odd squares.
    :=    Compare the two coordinates. This gives 0/1 for white/black squares.
    \3f%  Grab second copy of coordinates, and calculate modulo 3.
    :g    Sign. This gives 0 for grid lines, 1 for interior of squares.
    +     Concatenate the two results. We now have a 3 bit code.
    2b    Convert the 3 bits to a number in range 0..7.
    "+-|#+-| "
          Lookup table to convert 0..7 number to character.
    =     Lookup character.
  }/    End loop over coordinate pairs.
]     End wrapping characters.
/     Split character array into lines.
N*    And join them with newlines.

2

HackVM , 158 байт

Однозначно не переможець, але це виглядало як приємний виклик зробити в HVM.

Розмістіть розмір у першій комірці пам'яті та використовуйте наступний код:

77*1+c0<0^84*1+?1-11<-1>99*85++0^cc77*1+c066*5+-g!0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

Примітка. Щоб працювати, код повинен бути точно в одному рядку.

Пояснення:

Call PLUSHDASHLINE
77*2+c

Read the cell and skip if done
0<0^84*1+?1-

  Flip row parity
  11<-1>

  Call NORMALLINE twice
  99*85++0^cc

  Call PLUSHDASHLINE
  77*1+c

Jump back to start of loop
066*5+-g!


DEFINE_PLUSDASHLINE
0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$

DEFINE_NORMALLINE
1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

Код викликає 2 функції PLUSHDASHLINEі NORMALLINEпідтримує глобальний стан для паритетів (тобто ставити a ' 'або a '#'в комірку).

Пояснення до PLUSDASHLINE:

Repeat N times
0<0^45*2+?1-

  Print "+--"
  95*0^0^2-PPP

End Repeat
064*-6-g

Print "+"
d95*2-P

Print "\n"
25*P

Return
$

Пояснення до NORMALLINE:

Copy Parity into Cell 2
1<2>

Print '|'
555**1-P

Repeat N times
0<0^76*6-?1-

  Flip Cell 2 (i.e. Flip Column Parity)
  12<-2>

  Calculate ' ' or '#' based upon parity
  2<3*48*+0^

  Print it twice
  PP

  Print '|'
  555**1-P

End Repeat
076*2+-g

Print "\n"
d25*P

Return
$

Буду вдячний, якщо хтось дав поради щодо його подальшого вдосконалення :)


2

Пітон 2, 98

n=input()
f=lambda a,b,s:s+s.join(([a*2,b*2]*n)[:n])+s+'\n'
print f(f(*' #|'),f(*'# |'),f(*'--+'))

Не найкоротший шлях, але кумедний метод. Функція складається fз двох рядків a,bі роздільника sі перемежовує свої аргументи, як saasbbsaasbbsaas. Рядки дошки створюються в такому вигляді з відповідними символами, потім самі переплітаються таким чином, щоб отримати результат.


Це створює недійсний вихід для n=0. Більшість рішень (які будуть прийняті) виробляє "+". Це рішення створює "++ (новий рядок) ++", виключаючи звичайні проміжні 2 нові рядки (що дозволено).
кдрагон

@DragonGuy Проблема говорить, що введення є цілим числом.
xnor

Але резерв повинен бути принаймні 0. Негативні резервні копії не потрібні. Не буде правила для чисел, менших від 0. Це рішення, здається, дає "++ (новий рядок) ++" для чого-небудь менше 1.
kdragon

@DragonGuy Коли ви вказуєте вимоги до введення, це означає, що введення гарантовано відповідає цим вимогам, і може діяти довільно, коли вони не відповідають цьому. Зауважую, що ви відредагували питання, щоб додати "n = 0 повинен створювати +" після публікації цього повідомлення, але зміна правил після того, як відповіді вже є, сильно не рекомендується .
xnor

Я думав над цим правилом (читав багато питань раніше), перш ніж редагувати питання, але оскільки це не вплине на переважну більшість відповідей, я не вважав, що це буде проблемою. Питання відредаговано, щоб забезпечити чіткість і зробити це необов’язковим.
кдрагон

2

Рубін: 83 символи

f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}

Проба зразка:

irb(main):001:0> f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}
=> #<Proc:0x000000007c51a0@(irb):1 (lambda)>

irb(main):002:0> f[0]
+
=> nil

irb(main):003:0> f[1]
+--+
|  |
|  |
+--+
=> nil

irb(main):004:0> f[2]
+--+--+
|  |##|
|  |##|
+--+--+
|##|  |
|##|  |
+--+--+
=> nil

irb(main):005:0> f[3]
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
=> nil

2

Рубі, 87

->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

Це анонімна функція. Назвіть це так (усі можливості від 0 до 5)

f=->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

6.times{|j|f.call(j)}

Він використовує ljustметод на порожній рядку. Ruby дозволяє вказати рядок прокладки для обгрунтування, тому ми використовуємо ljustодин з трьох можливих рядків оббивки b,c,dна масив a, упорядкований як bccbdd.


1

Джулія, 124 байти

n->(t="+--"^n*"+";a="|  ";b="|##";m=n÷2;c=n%2>0;p=println;p(t);for i=1:n p(((i%2<1?(b*a)^m*b^c:(a*b)^m*a^c)*"|\n")^2*t)end)

Це створює неназвану функцію, яка приймає ціле число і друкує для stdout.

Недоліковані + пояснення:

function f(n)
    # Define the portions of the board
    t = "+--"^n * "+"
    a = "|  "
    b = "|##"

    # There will be n÷2 repeated a*b or b*a per line
    m = n ÷ 2

    # If n is odd, there will be an extra a or b
    c = n % 2 != 0

    # Print the top
    println(t)

    # Print each horizontal section of the board
    for i = 1:n
        # In even numbered sections, b precedes a
        j = (i % 2 == 0 ? (b*a)^m * b^c : (a*b)^m * a^c) * "|\n"
        println(j^2 * t)
    end
end

1

Javascript, ES6 149

n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n'))

Дуже весело писати, хоча це трохи довго

Працює на firefox

1 - Відкрита консоль

2 - Введіть наступне

console.log((n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n')))(15));

Вихід (n = 15):

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Чи можете ви додати фрагмент, як інші рішення ES6? Це полегшить тестування.
кдрагон

Я збирався редагувати свій коментар у 5-хвилинному діапазоні, але мій зв’язок виявився несправним. Чи можете ви додати фрагмент, як інші рішення ES6? Це полегшить тестування. Для JavaScript Pro та ES6 noob це не працює в Firefox Scratchpad.
кдрагон

@DragonGuy Готово, подивіться, чи працює він для вас.
Afonso Matos

1
У самому кінці, ви все ще зберегти три байта шляхом може підставляючи join('\n')з join` `, де простір я написав означає фактичний символ нового рядка.
Чіру

1

Хаскелл, 99

Частково це надихнуто попередньою відповіддю Хаскелла від catgocat ; Я написав свою версію, потім переглянув її, потім написав іншу. Я граю за тими ж правилами - вхід є аргументом, але вихід - stdout. (Якщо це може бути чиста функція, відніміть 7 символів putStr$.)

f n=putStr$unlines$t$map t$y[a,b,b,a,c,c]where t=take(n*3+1)
a=y"+--"
b=y"|  |##"
c=drop 3b
y=cycle

Ми використовуємо, tщоб взяти область з 3 n + 1 символів з нескінченної шашки, побудованої за допомогою cycle, і це все. Основна ідея, яку я взяла з іншої відповіді, полягає в тому, щоб поєднати візерунки обох кордонів і контрольних комірок разом у рядки.

Моя перша версія (140 символів) використовувала стратегію обчислення символів у кожній точці, що може бути краще для більш складної проблеми, ніж ця.

f n=putStr$unlines$map(\y->map(g y)r)r where r=[0..n*3]
g y x=s(s '+'y '|')x$s '-'y$cycle" #"!!(x`div`3+y`div`3)
s c i d|i`mod`3==0=c|True=d

Я радий, що ваше натхнення призвело до такої розумної відповіді :)
Afonso Matos

Я отримую 84 байти під час запису цього файлу у файл cat <<EOF > sol1.hsі підрахунку du -b sol1.hs.
кдрагон

@DragonGuy Я просто зробив те саме, і досі отримую 99. wcпогоджується, і я перевірив, чи немає друкованих символів. Чи означає це 84-байтовое версія працювати ? Якщо так, я візьму його :)
Кевін Рід,

1

Хаскелл, 118

Це моя перша відповідь на код гольф-коду, і ось він:

f n=mapM_(putStrLn.s)[0..3*n]where;d x=(++)$take(3*n)$cycle x;s x|x`mod`3<1=d"+--""+"|x`mod`6<3=d"|  |##""|"|1<2=d"|##|  ""|"

Більш прочитана версія:

func num = do
    let -- Range
        rag = 3 * num
        -- `+--+`
        a = d "+--" "+"
        -- `|  |##`
        b = d "|  |##" "|"
        -- `|##|  `
        c = d "|##|  " "|"
        -- generate line
        d x y = take rag (cycle x) ++ y
        -- step
        step x
            | x `mod` 6 `elem` [1, 2] = b
            | x `mod` 3 == 0          = a
            | otherwise               = c

    mapM_ (putStrLn . step) [0..rag]

Вихідні дані

*Main> :load test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 1
+
*Main> f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
*Main> f 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

f 1повинен створити 1 порожнє поле, f 0видає лише знак плюс.
Каде

@ Vioz - Моє погано, тому це робить код ще коротшим: P
Afonso Matos

1

С - 119 101

Тепер використовується обчислення, подібне до відповіді @ Sp3000. Також пара оптимізацій.

i,j;f(n){for(i=j=0;j<=n*3;i++)putchar(i-n*3-1?" -|+#"[!(j%3)+2*!(i%3)?:(i/3+j/3)%2*4]:(j-=i=-1,10));}

Я думаю, що ?:це розширення GCC ...

Стара відповідь:

f(n){int i,j;char p[]=" -|+";for(i=j=0;j<=n*3;*p=" #"[(i++/3+j/3)%2])putchar(i-n*3-1?p[!(j%3)+2*!(i%3)]:(j-=i=-1,10));}

Він підтримує 2 координати і чесно обчислює, який символ надрукувати для кожної пари. Список символів для друку зберігається в масиві, і це одне тільки друкує "кольорову" сітку. Перший елемент масиву модифікується для малювання чорних квадратів.

Я можу змінити це так, щоб замість двох незалежних координат одна величина підраховувалась (або, можливо, навіть краще) вниз, але я не можу обернути голову навколо цього прямо зараз.

Бонус - заміна 3 будь-яким іншим числом призводить до програми, яка малює дійсну шахову дошку з різним розміром комірок.


1

awk - 91

{
    for(k=i=3*$0+1;i--;print"")
        for(j=k;j--;)printf i%3?j%3?234~(i+j)%6?FS:"#":j%3?"-":"|":"+"
}

Була досить боротьба, щоб досягти її нижче 100. Підрахунок назад і використання оператора матчу були проривами;) Решта - це досить пряма логіка.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.