画一个ASCII棋盘


25

摘要

受到最近ASCII艺术挑战盛行的鼓舞,此挑战的目的是绘制一个ASCII棋盘,就像在其上可以播放国际象棋的棋盘一样。

编写一个程序,该程序以nin stdin或用户输入为参数,并使用正整数作为参数,然后输出带有nx个n正方形以及1个字符粗的边框的棋盘。

每个方块应为2x2字符。正方形应遵循棋盘格的正常交替的黑白色(白色为首,在左上角为白色)模式。白色方块应以空格()字符制成,黑色方块应以井号(#)字符制成。

边框应由破折号(-)组成,+并在边框或正方形的垂直点上带有加号()。

输入项

以正整数表示要在棋盘中绘制的正方形数(正方形尺寸),每个正方形为2x2字符。

示例结果

n=2

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

n=3

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

n=4

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

... 等等。


笔记

  • 尾随空格和换行符是可以接受的。
  • 您可以编写整个程序或函数。
  • 没有前导空格。
  • 您的程序应显示n = 15的正确结果。
  • 对于鲜为人知的深奥语言和类似语言,请提供指向该语言的链接。
  • n=0应该产生+。(可选,但强烈建议并鼓励使用。)
  • 以字节为单位的最短代码获胜,因为这是代码高尔夫。

2
欢迎来到编程难题和Code Golf!在这里做得很好,尤其是对于您的第一个挑战。我期待看到更多您的东西。
Alex A.

我猜“您的程序应显示n = 15的正确结果。” 表示“最多n = 15”?
John Dvorak 2015年

“您的程序应显示n = 10的正确结果。” 意味着如果您的程序无法正确渲染到n = 15,则不应发布该程序。但这并不意味着您应该利用/滥用该代码并编写一个只能上升到n = 15的程序。
kdragon

我赞成测试过的工作答案,即使这些答案没有+n=0
kdragon

抱歉,我从未接受过获胜者。现在接受。
kdragon

Answers:


16

J,24个字节

匿名函数:

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

用法:

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

1
&.>比...短一个each。值得注意的是,只有BoxForm将设置为时,它才有效ASCII
randomra

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通过3**i%7/2%3给出重复图案[0,1,1,0,2,2] 的算术表达式,基于行索引模6 的值选择正确的图案。我使用x**i%7具有period 的事实发现了它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

ES6的CoffeeScript,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

Python 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个函数PLUSHDASHLINENORMALLINE,维护奇偶校验的全局状态(即,是否将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。大多数解决方案(将被接受)产生“ +”。此解决方案生成“ ++(换行符)++”,不包括常规的尾随2个换行符(允许)。
kdragon

@DragonGuy问题说输入是一个正整数。
xnor

但是应该有至少为0的回退。不需要负回退。将有数量小于0的任何东西任何规则,此解决方案似乎给予“++(新行)++”小于1
kdragon

@DragonGuy当您指定输入要求时,这意味着输入可以保证满足那些要求,并且在情况并非如此时可以任意操作。我注意到您在发布此问题后对问题进行了编辑,以添加“ n = 0应该产生+”,但是强烈建议不要在回答后更改规则
xnor

在编辑问题之前,我曾在考虑该规则(请先阅读许多问题),但是由于它不会影响绝大多数答案,因此我认为这不会成为问题。对问题进行了编辑,以使其更加清楚,并使之成为可选。
kdragon

2

Ruby: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,dabccbdd


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解决方案一样添加代码段?这将使测试更加容易。
kdragon

我打算在5分钟内编辑我的评论,但我的连接有问题。您是否可以像其他ES6解决方案一样添加代码段?这将使测试更加容易。对于JavaScript专业人士和ES6 noob,这在Firefox Scratchpad中不起作用。
kdragon

@DragonGuy完成,看看它是否适合您。
阿方索·马托斯

1
在最后,您仍然可以用代替join('\n')以保存三个字节join` `,我写的空格表示实际的换行符。
Chiru 2015年

1

哈斯克尔(99)

这部分是由catgocat先前的Haskell回答启发的 ; 我写了自己的版本,然后看了一下,然后写了另一个。我在遵循相同的规则-输入是一个参数,但输出是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

将其写入文件cat <<EOF > sol1.hs并用计数时,我得到84个字节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只产生加号。
卡德,2015年

@ 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以下,是一场艰辛的斗争。倒数和使用match运算符是突破;)其余的几乎是简单的逻辑。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.