ASCIIチェッカーボードを描く


25

概要

最近のASCIIアートチャレンジの人気に触発され、このチャレンジの目的は、チェスをプレイできるようなASCIIチェッカーボードを描くことです。

n引数としてstdin、またはユーザー入力として正の整数を取るプログラムを記述し、1文字の太さの境界線とともにnxのn正方形のチェッカーボードを出力します。

各正方形は2x2文字でなければなりません。正方形は、通常の交互の白黒(市松模様の左上隅のように白が最初)のパターンに従う必要があります。白い四角はスペース()文字で作成し、黒い四角はポンド(#)文字で作成する必要があります。

境界線は、境界線または正方形の垂直点に-プラス(+)を付けたダッシュ()で作成する必要があります。

入力

チェッカーボードに描画する正方形の数(正方形の寸法)を表す正の整数。各正方形は2x2文字です。

結果の例

n=2

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

n=3

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

n=4

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

... 等々。


ノート

  • 末尾のスペースと改行は許容されます。
  • プログラム全体または関数のいずれかを記述できます。
  • 先行スペースはありません。
  • プログラムは、n = 15の正しい結果を表示するはずです。
  • あまり知られていない難解な言語などについては、その言語へのリンクを提供してください。
  • n=0を生成する必要があり+ます。(オプションですが、強くお勧めします。)
  • これはコードゴルフであるため、バイト単位の最短コードが優先されます。

2
プログラミングパズルとコードゴルフへようこそ!特に最初の挑戦のために、ここで素晴らしい仕事をしました。あなたのものをもっと見るのを楽しみにしています。
アレックスA.

「プログラムはn = 15の正しい結果を表示するはずです」と推測します。「最大n = 15」を意味しますか?
ジョンドヴォルザーク

「プログラムはn = 10の正しい結果を表示するはずです。」プログラムがn = 15まで適切にレンダリングできない場合は、投稿しないでください。しかし、それを悪用/悪用し、n = 15までしかできないプログラムを書く必要があるという意味ではありません。
kdragon

私は、たとえを生成しなくても、実際の答えをテストし+ましたn=0
kdragon

申し訳ありませんが、私は勝者を受け入れませんでした。今受け入れています。
kdragon

回答:


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]

行ごとに、パターンの1つを選択します

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

それから3*n+1文字を出力します。パターンは、文字列インターリーブトリックで選択された最初の6文字を繰り返して選択されます。これは、正しい長さのスニペットを抽出するのにも役立ちます。

正しいパターンは、反復パターン[0,1,1,0,2,2]を与えるi算術式によって、6を法とする行インデックスの値に基づいて選択され3**i%7/2%3ます。x**i%7periodがあるという事実を使用して、正しいパターンを取得するために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し、ファイル内の改行に変更する必要があります。これは実用的ではありませんが-snマーカーを保持したままフラグを付けて1つのファイルとしてコードをそのまま実行できます。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、106バイトのCoffeeScript

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$

注:コードを機能させるには、正確に1行にする必要があります。

説明:

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は、2つの文字列a,bとセパレータsを受け取り、引数をのようにインターリーブしますsaasbbsaasbbsaas。ボードの行は、それぞれの文字を使用してこの形式で作成され、この方法でインターリーブされて結果が生成されます。


これにより、の無効な出力が生成されますn=0。大部分のソリューション(受け入れられます)は「+」を生成します。このソリューションは、通常の末尾の2つの改行(許可されている)を除き、「++(改行)++」を生成します。
kdragon

@DragonGuy問題は、入力が正の整数であると言います。
xnor

ただし、少なくとも0の間はフォールバックが必要です。負のフォールバックは必要ありません。0未満の数値にはルールはありません。このソリューションは、1未満の値に対して「++(改行)++」を与えるようです。
kdragon15年

@DragonGuy入力要件を指定すると、入力がそれらの要件を満たすことが保証され、そうでない場合は任意に動作できることを意味します。質問を編集して、これが投稿された後に「n = 0 should +」を追加することに気付きましたが、回答が既に入力された後にルールを変更することは強く推奨されません
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三つの可能なパディング文字列の1つで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プロとES6初心者にとって、これはFirefoxスクラッチパッドでは機能しません。
kdragon

@DragonGuy完了、それがあなたのために働くかどうかを確認してください。
アフォンソマトス

1
最後に、で置き換えることjoin('\n')で3バイトを節約できますjoin` `。ここで書いたスペースは実際の改行文字を示します。
チル

1

ハスケル、99

これは、catgocatによる以前のHaskellの回答に一部影響を受けています。私は自分のバージョンを書き、それを見て、別のバージョンを書きました。私は同じルールで遊んでいます。入力は引数ですが、出力は標準出力です。(純粋な関数である可能性がある場合は、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

あなたのインスピレーションがこのような賢明な答えにつながってくれてうれしいです:)
アフォンソマトス

でファイルに書き込みcat <<EOF > sol1.hs、でカウントすると84バイトになりますdu -b sol1.hs
kdragon

@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生成し、プラス記号のみを生成します。
ケード

P:Vioz-私の悪いので、このコードはさらに短くなります@
アフォンソ・マトス

1

C- 119 101

@ Sp3000 answerと同様の計算を使用するようになりました。また、最適化を組み合わせます。

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つの座標を維持し、各ペアに対してどの文字を印刷するかを正直に計算します。印刷する文字のリストは配列に保存され、これだけで「色なし」グリッドが印刷されます。配列の最初の要素が変更され、黒い正方形が描画されます。

これを変更して、2つの独立した座標の代わりに、1つの値がカウントアップまたはダウンする可能性があります(ただし、さらに良い場合があります)が、今は頭をラップできません。

ボーナス-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を下回るのはかなりの戦いでした。逆算して一致演算子を使用することはブレークスルーでした;)残りはほとんど単純なロジックです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.