爆発的なASCIIアートチャレンジ


20

戦略ゲーム「Hexplode」では、プレイヤーは交互に六角形のボードにトークンを置きます。トークンの数が隣接するタイルの数と等しくなると、そのタイルはhexplodesし、その上のすべてのトークンを周囲の隣人に移動します。ここでオンラインゲームをプレイできます

私はこのゲームが好きですが、特定のタイルにいくつのトークンが入っているかを正確に知ることが難しい場合があります。私は常に隣人の数を数えています。ASCIIアートがあれば、各タイルにいくつのトークンが配置されているかを思い出すのに役立ちます。

入力として正の整数を取り、サイズNの六角形のこのASCII表現を生成するプログラムまたは関数を作成する必要があります。各タイルは、タイルが持っている隣人の数になります。1は近傍がゼロの奇妙なコーナーケースであるため、1より大きい入力のみを処理する必要があります。

この番号は、STDIN、関数引数、コマンドライン引数など、ファイルからの適切な形式で取得できます。出力は、STDOUTへの印刷、ファイルへの書き込み、文字列のリスト、改行で区切られた文字列など

以下は、最初の5つの入力のサンプル出力です。

2)

 3 3
3 6 3
 3 3


3)

  3 4 3
 4 6 6 4
3 6 6 6 3
 4 6 6 4
  3 4 3


4)

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

5)

    3 4 4 4 3
   4 6 6 6 6 4
  4 6 6 6 6 6 4
 4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 4
  4 6 6 6 6 6 4
   4 6 6 6 6 4
    3 4 4 4 3

6)

     3 4 4 4 4 3
    4 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
 4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
    4 6 6 6 6 6 4
     3 4 4 4 4 3

そして、パターンは同様の方法で続きます。いつものように、標準的な抜け穴が適用され、バイト数が最も少ない答えが勝者に選ばれます!

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
関連(ただし、近隣の数ではなくプロセスについて尋ねる)。
-trichoplax

1
私はこの挑戦のために六角形を学びたいと思っています。;)
ケビンクルーイッセン

回答:


11

MATL39 37バイト

4*3-:!G:+o~YRtP*!tPw4LY)vtI5&lZ+47+*c

オンラインでお試しください!または、すべてのテストケースを確認します

説明

畳み込みを再び使用できるようになりました!

入力を検討してくださいn = 3。コードは、最初に列ベクトルを行ベクトルに追加することにより、サイズ4*n-3×の行列を作成nします[1; 2; ...; 9][1, 2, 3]ブロードキャストを。これは、すべてのペアワイズ加算の2D配列配列を計算することを意味します。

 2  3  4
 3  4  5
 4  5  6
 5  6  7
 6  7  8
 7  8  9
 8  9 10
 9 10 11
10 11 12

1偶数をで、奇数をで置き換える0、チェッカーボードパターンが得ます

1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

これは、六角形グリッド(の一部)の生成に使用されます。1はグリッド内のポイントを表し、0はスペースを表します。

右上隅は、マトリックスの主な「対角線」より上のすべてのエントリをゼロにすることにより削除されます。

1 0 0
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

このマトリックスに要素ごとに垂直に反転したバージョンを乗算すると、右下隅も削除されます。移調すると

1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

これは六角形のように見え始めます。対称性を使用して、グリッドを拡張して上半分を生成します。

0 0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

ここで、1に等しい各エントリを近隣の数で置き換える必要があります。このために、3×5近傍の畳み込みを使用します(つまり、カーネルは1の3×5行列です)。結果、

2 3 4 5 5 5 4 3 2
4 5 7 7 8 7 7 5 4
4 6 7 8 7 8 7 6 4
4 5 7 7 8 7 7 5 4
2 3 4 5 5 5 4 3 2

次の2つの問題があります(後で解決されます)。

  1. 値はすべての位置に対して計算されていますが、0-1グリッドの位置でのみ必要です。
  2. これらの位置のそれぞれについて、近傍カウントにはポイント自体が含まれるため、によってオフになり1ます。

これで、コードは47各計算値に追加されます。これは、1問題を解決するための減算(2)と追加48(ASCII'0')に対応し、各数値を対応する文字のコードポイントに変換します。

次に、結果の行列にゼロ1グリッドのコピーを乗算します。これにより、上記の問題(1)が解決され、六角形グリッドの一部ではないポイントが再びゼロに等しくなります。

 0  0 51  0 52  0 51  0  0
 0 52  0 54  0 54  0 52  0
51  0 54  0 54  0 54  0 51
 0 52  0 54  0 54  0 52  0
 0  0 51  0 52  0 51  0  0

最後に、この数値の配列はchar配列にキャストされます。ゼロ文字はスペースとして表示され、最終結果が得られます。

  3 4 3  
 4 6 6 4 
3 6 6 6 3
 4 6 6 4 
  3 4 3  

15

JavaScript(ES6)、118 117バイト

n=>[...Array(m=n+--n)].map((_,i,a)=>a.map((_,j)=>(k=j-(i>n?i-n:n-i))<0?``:k&&++j<m?i/2%n?6:4:3+!i%n).join` `).join`\n`

where \nは、リテラルの改行文字を表します。説明:と仮定しn=4ます。次のスペースで区切られた数字の正方形から始めます。

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

最初|n-i| 0のsは削除されますが、スペースは残ります:

   0 0 0 0
  0 0 0 0 0
 0 0 0 0 0 0
0 0 0 0 0 0 0
 0 0 0 0 0 0
  0 0 0 0 0
   0 0 0 0

インスタント六角形!次に0、最初または最後の行および/または列にいるかどうかを確認することにより、それぞれの代わりに適切な値を計算するだけで十分です。編集:@Arnauldのおかげで1バイト保存されました。


いくつかの式を使用して、for / console.log()で107バイトバージョンになりましたn=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
。– Arnauld

@Arnauld私はそれが好きです3+!i%n
ニール

7

Python 2、125 123バイト

def h(n):m=n-1;t=[' '*(m-r)+' '.join(('46'[r>0]*(r+m-1)).join('34'[r%m>0]*2))for r in range(n)];print'\n'.join(t+t[-2::-1])

テストはideoneで行われています

for r in range(n)文字列を
作成して、上から中央の行まで実行します。-2つの角または2つのエッジを作成し'34'[r%m>0]*2ます。
-繰り返し'6'または'4'でそれらを結合することによって充填'46'[r>0]*(r+m-1);
-コーナーとエッジを結合する' ';
-スペースを先頭に追加' '*(m-r);

次に、これを印刷すると、新しい行で結合された中央の行に反映されます。 print'\n'.join(t+t[-2::-1])


4

Python 2、96バイト

n=input();m=n-1
while n+m:n-=1;j=abs(n);c='34'[0<j<m];print' '*j+c+' '+'46  '[j<m::2]*(2*m+~j)+c

これはかなり乱雑で、ややゴルフに適しています...


3

Javaの、375の 363 361 339 329 317 293バイト

interface J{static void main(String[]r){int i=0,k,h=Integer.decode(r[0]),a=1,l,n=0;for(;i++<h*2-1;n+=a){if(n==h-1)a=-1;String s="";for(k=0;k<n+h;k++,s+=" ")s+=n==0?k==0||k==n+h-1?3:4:k!=0&&k!=n+h-1?6:n==h-1?3:4;l=(h*4-3-s.trim().length())/2;System.out.printf((l==0?"%":"%"+l)+"s%s\n","",s);}}}

非ゴルフ

interface J {
    static void main(String[] r) {
        int i = 0, k, h = Integer.decode(r[0]), a = 1, l, n = 0;
        for (; i++ < h * 2 - 1; n += a) {
            if (n == h - 1) {
                a = -1;
            }
            String s = "";
            for (k = 0; k < n + h; k++, s += " ") {
                s += n == 0 ? k == 0 || k == n + h - 1 ? 3 : 4 : k != 0 && k != n + h - 1 ? 6 : n == h - 1 ? 3 : 4;
            }
            l = (h * 4 - 3 - s.trim().length()) / 2;
            System.out.printf((l == 0 ? "%" : "%" + l) + "s%s\n", "", s);
        }
    }
}

使用法

$ java J 5
    3 4 4 4 3     
   4 6 6 6 6 4    
  4 6 6 6 6 6 4   
 4 6 6 6 6 6 6 4  
3 6 6 6 6 6 6 6 3 
 4 6 6 6 6 6 6 4  
  4 6 6 6 6 6 4   
   4 6 6 6 6 4    
    3 4 4 4 3

恐ろしいネストされたif-elseブロックは、より小さく書き換えることができると確信していますが、現時点ではわかりません。どんな提案でも大歓迎です:-)

更新

  • Kevin Cruijssenの提案に従い、parseIntの代わりにdecodeを使用しました。
  • 三項演算子を使用していくつかのifを書き直しました。
  • より多くの三項演算子。
  • モアーの三項演算子!モンスターを作成したと思います!
  • 印刷に関するif-elseブロックを書き直しました。

1
私はあなたがそれ自体を使用する方法を詳しく見ていないが、あなたの現在のコードのためのいくつかの小さなゴルフのヒント:Integer.parseIntにゴルフすることができますInteger.decodel=(h*4-3-s.trim().length())/2;if(l==0)にゴルフすることができますif((l=(h*4-3-s.trim().length())/2)==0)。また、クラスのないメソッドを投稿することは完全に受け入れられます(質問に別の記述がない限り)ので、void f(int i){...use i...}代わりにinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}かなりの数バイトを節約できます。時間があれば、さらに調べます。
ケビンCruijssen 16

@KevinCruijssen:ご提案ありがとうございます。l=(h*4-3-s.trim().length())/2;if(l==0)は実際にはと同じ長さif((l=(h*4-3-s.trim().length())/2)==0)です。
Master_ex

2

05AB1E、44バイト

FN_i4ë6}ð«¹ÍN+×ðìN_N¹<Q~i3ë4}.ø¹<N-ð×ì})¦«»

説明

六角形の上部と下部がミラーリングされているため、上部のみを生成する必要があります。
したがって、Xを入力するには、X行を生成する必要があります。それがメインループの動作です。

F                                        }

次に、行の中央部分を実行します。
これは、最初の行が4、残りが6です(上部のみを実行しているため)。
パターンには数字の間にスペースが必要なので、この数字をスペースで連結します。

N_i4ë6}ð«

次に、この文字列をX-2 + N回繰り返します。ここで、Nは0からインデックス付けされた現在の行で、左側にスペース文字を追加します。

¹ÍN+×ðì

この後、コーナーの時間です。最初と最後の行が3で、中央の行が4です。

N_N¹<Q~i3ë4}.ø

次に、各行の前にスペースを追加して、行が正しく整列していることを確認する必要があります。追加されるスペースの数はX-1-Nになります。

¹<N-ð×ì

グリッドの上部が完成したので、リストに行を追加し、反転コピーを作成し、そのコピーから最初の項目を削除し(中央の行が1回だけ必要になるため)、これら2つのリストをマージし、印刷します。

)¦«»

オンラインでお試しください!

追加ソリューション、44バイト:

ÍÅ10.øvN_i4ë6}ð«¹ÍN+×ðìyi4ë3}.ø¹<N-ð×ì})¦«»

2

ルビー、87バイト

無名関数は引数としてnを取り、文字列の配列を返します。

->n{(1-n..n-=1).map{|i|j=i.abs
" "*j+(e=j%n>0?"4 ":"3 ")+["6 ","4 "][j/n]*(2*n-1-j)+e}}

テストプログラムでゴルフをしていない

stdinを介した入力。形状全体を標準出力に書き込みます。かなり自明です。

f=->n{
  (1-n..n-=1).map{|i|            #reduce n by 1 and iterate i from -n to n
    j=i.abs;                     #absolute magnitude of i
    " "*j+                       #j spaces +
    (e=j%n>0?"4 ":"3 ")+         #start the string with 3 or 4 +
    ["6 ","4 "][j/n]*(2*n-1-j)+  #2*n-1-j 6's or 4`s as appropriate +
    e                            #end the string with another 3 or 4
  }
}

puts f[gets.to_i]

1

V、60バイト

Àé x@aA4 xr3^.òhYpXa 6^òkyHç^/:m0
Pç 3.*6/^r4$.
òÍ6 4./6

オンラインでお試しください!

これは本当に長すぎます。これは印刷不能な文字を含むため、hexdumpです。

0000000: c0e9 2078 4061 4134 201b 7872 335e 2ef2  .. x@aA4 .xr3^..
0000010: 6859 7058 6120 361b 5ef2 6b79 48e7 5e2f  hYpXa 6.^.kyH.^/
0000020: 3a6d 300a 50e7 2033 2e2a 362f 5e72 3424  :m0.P. 3.*6/^r4$
0000030: 2e0a f2cd 3620 9334 852e 2f36            ....6 .4../6

1

ラケット、487バイト

(λ(n c e o)(let((sp(append(range(- n 1)-1 -1)(reverse(range(- n 1)0 -1))))
(mm(append(range(- n 2)(-(+ n(- n 1))2))(range(-(+ n(- n 1))2)(-(- n 1)2)-1)))
(r""))(for((i sp)(j mm))(define str"")(for((ss i))(set! str(string-append str" ")))
(set! str(string-append str(if(or(= i 0)(= i(- n 1))(= i(* 2(- n 1))))c e)" "))
(for((jj j))(set! str(string-append str(if(= j(- n 2))e o)" ")))(set! r(if(or(= i 0)
(= i(- n 1))(= i(* 2(- n 1))))c e))(set! str(string-append str r))(displayln str))))

テスト:

(f 4 "3" "4" "6") 

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

(f 5 "o" "*" "-") 

    o * * * o
   * - - - - *
  * - - - - - *
 * - - - - - - *
o - - - - - - - o
 * - - - - - - *
  * - - - - - *
   * - - - - *
    o * * * o

詳細バージョン:

(define(f1 n c e o)
  (let ((sp(append(range(sub1 n) -1 -1)
                  (reverse(range(sub1 n) 0 -1))))
        (mm(append(range(- n 2)(-(+ n(sub1 n)) 2))
                  (range(-(+ n(sub1 n)) 2)(-(sub1 n)2) -1) ))
        (r ""))
    (for((i sp)(j mm))
      (define str "")
      (for((ss i))(set! str(string-append str " ")))
      (set! str(string-append str
                              (if(or(= i 0)(= i(sub1 n))
                                    (= i(* 2(sub1 n)))) c e)
                              " "))
      (for((jj j))
        (set! str(string-append str
                                (if(= j(- n 2)) e o)
                                " ")))
      (set! r(if(or(= i 0)
                   (= i(sub1 n))
                   (= i(* 2(sub1 n)))) c e))
      (set! str(string-append str r))
      (displayln str))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.