Нарисуйте 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.