Нарисуйте ASCII шахматную доску


25

Резюме

Вдохновленный недавней популярностью художественных испытаний ASCII, цель этой задачи состоит в том, чтобы нарисовать шахматную доску ASCII, подобную той, на которой можно играть в шахматы.

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

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

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

вход

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

Пример результатов

n=2

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

n=3

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

n=4

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

... и так далее.


Заметки

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

2
Добро пожаловать в программирование головоломок и Code Golf! Хорошая работа здесь, особенно для вашего первого испытания. Я с нетерпением жду, чтобы увидеть больше ваших вещей.
— Алекс А.

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

«Ваша программа должна отображать правильные результаты для n = 10.» означает, что если ваша программа не может правильно отобразить до n = 15, она не должна быть опубликована. Но это не значит, что вы должны использовать / злоупотреблять этим и написать программу, которая может работать только до n = 15.
— kdragon

Я upvote проверенных рабочих ответов, даже если они не производят +для n=0.
— kdragon

Извините, я никогда не принимал победителя. Принимаю сейчас.
— kdragon

Ответы:


16

J, 24 байта

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

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

Использование:

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

1
&.>один короче чем each. Стоит отметить, что это работает, только если BoxFormустановлено ASCII.
— Рандомра

10

Python 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символы на новые строки в выходных данных. Например:

> 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>

Анонимная функция. Начинается с полного массива +--+--+--...строк и соответствующих строк, заменяет значения +for |и -for или, #в зависимости от ситуации.

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


Хорошее использование ES6! Эффект от слайдера во фрагменте - хорошее дополнение. Не могли бы вы дать объяснение и версию без загадок?
— kdragon


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

Python 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. Большинство решений (которые будут приняты) выдает «+». Это решение создает "++ (newline) ++", исключая обычные завершающие 2 новых строки (что разрешено).
— kdragon

@DragonGuy Проблема в том, что входные данные являются положительным целым числом.
— xnor

Но должен быть запасной вариант как минимум на 0. Отрицательные резервы не требуются. Не будет правила для чисел меньше 0. Это решение, кажется, дает «++ (
— новая строка

@DragonGuy Когда вы указываете требования к входным данным, это означает, что входные данные гарантированно удовлетворяют этим требованиям и могут действовать произвольно, если это не так. Я заметил, что вы отредактировали вопрос, добавив «n = 0 должен производить +» после того, как он был опубликован, но изменение правил после того, как ответы уже получены, настоятельно не рекомендуется .
— xnor

Я думал об этом правиле (прочитал много вопросов раньше), прежде чем редактировать вопрос, но так как оно не повлияет на подавляющее большинство ответов, я не думал, что это будет проблемой. Вопрос отредактирован, чтобы обеспечить ясность и сделать это необязательным.
— kdragon

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)

Это создает безымянную функцию, которая принимает целое число и печатает на стандартный вывод.

Ungolfed + объяснение:

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? Это облегчит тестирование.
— kdragon

Я собирался редактировать свой комментарий в 5-минутном диапазоне, но моя связь была повреждена. Не могли бы вы добавить фрагмент, как и другие решения ES6? Это облегчит тестирование. Для JavaScript Pro и ES6 Noob это не работает в Firefox Scratchpad.
— kdragon

@DragonGuy Готово, посмотрите, работает ли оно для вас.
— Афонсо Матос,

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

1

Хаскелл, 99

Это частично вдохновлено предыдущим ответом на Haskell от 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

Я рад, что ваше вдохновение привело к такому умному ответу :)
— Афонсу Матос

Я получаю 84 байта при записи этого в файл с cat <<EOF > sol1.hsи считая с du -b sol1.hs.
— kdragon

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

1

Хаскелл, 118

Это мой первый ответ по гольфу с кодом Haskell и вот он:

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
— Афонсо Матос

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.