ミー・ウォント・ハニカム


39

六角形のタイルまたはハニカムのこのASCIIアートセクションを印刷する最短のプログラムを記述します。

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • 何も入力しないでください。
  • stdoutまたは言語の最も近い代替への出力。
  • プログラムの代わりに、パラメータを取らずに結果を通常どおりに出力するか、文字列として返す名前付き関数を作成できます。
  • 出力には、任意の数の先頭および/または末尾の改行を含めることができ、出力の各行には、任意の数の先頭および/または末尾のスペースを含めることができます(パターンが適切に整列する限り)。
  • バイト単位の最短コードが優先されます。

13
カタンをたくさんプレイしますか?
user3490

@ user3490実際、私は^^
カルビンの趣味

2
来週のPCG:Catanボードジェネレーターを作成しますか?
-user3490

7
入力IMOが必要です。あなたの場合は3でなければなりません
。– user3819867

3
@ user3819867私はそれを考慮しましたが、これを好みました。変更するには遅すぎますが、誰もが関連するチャレンジを行うには遅すぎません。
カルバンの趣味

回答:


33

CJam、45 43 42 41 40バイト

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

CJamインタープリターでオンラインで試してください。

使い方

"\__/  "38*21/

パターンを\__/ 38回繰り返し、長さ21のチャンクに分割します。チャンクが改行で区切られている場合、これが結果になります。

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

これには明らかに目的のハニカムが含まれています。あとは、一部の文字をスペースに置き換え、他の文字を切り取り、実際に改行を挿入するだけです。

741e8 36+Ab

整数74 100 000 036を生成し、配列[7 4 1 0 0 0 0 0 0 3 6]に変換します。各配列要素は、対応する行の先頭文字の数をエンコードします。これらの文字は、スペースに置き換える必要があります。16からこの数値を引くことにより、この行の正しい長さも取得します。

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

スペースはLの他の文字よりもコードポイントが低く、ベクトル化された演算子は、短い文字に対応しない長い文字列の文字をそのままに.e<するため、最初のD文字をスペースに置き換えます。


2
これは素晴らしいです。よくやった。
アレックスA.

28

Python 2、73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

実行してください。

11個の出力行のそれぞれについてk、六角形の左側のエンベロープを形成する最大3つの線形関数として先頭のスペースの数を計算します。対角線には勾配3とがあるため、-3行番号をとしてインデックスを付ける方が適切i=0,3,...30です。

六角形のメッシュを作成するには、まずユニットを十分に並べ'\__/ 'ます。次に、シフトする[i:]と、奇数行に対して3ずつ再調整されます。最後に、必要な部分を取り、左右に[k:16-k]マージンをk残します。


22

CJam、65 56 55バイト

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

CJamインタープリターでオンラインで試してください。

アイディア

各行の右半分は、左半分の逆のコピーで、スラッシュとバックスラッシュが入れ替わっています。したがって、ハニカムの左半分をエンコードするだけで十分です。

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

このパターンを行ごとに分析するのではなく、列ごとに分析できます。

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

明らかなパターンが現れます:

  • 文字列_ _ _ _は5回出現します。
  • すべての/後にが続き\ます。

すべて置き換えることによって/\__ _ _ _0から3の数と、スペースを、我々はより高いベースにベース4の数から得られた配列を変換してコンパクトに完全なパターンを記憶することができます。

コード

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.

10

C、148の 144 140バイト

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

空白あり、コンパイラの警告なし、およびいくつかのコードを調整して数バイトを節約する前:

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

このアプローチは、文字/文字列テーブルを使用しません。187個すべて(11行、改行を含む17列)をループし、条件の組み合わせに基づいて、各位置に印刷する文字を決定します。

条件には、4つの直線方程式を使用して、4つの角の内側/外側にあるかどうかのテストが含まれ、その結果は変数に格納されますp。残りはほとんど6文字ごとに繰り返され、奇数行は偶数行に対して3文字シフトされます。


2
ゴルフの場合は、暗黙の整数を使用してをドロップできますint
luserはドローグ

いくつかの微小改善:k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
デニス


6

JavaScript(ES6)、129 130

これは純粋な文字列の置換/置換/置換です...幾何学的特性を利用していません。

テンプレート文字列を使用すると、すべての改行が重要で重要になります。

Firefoxでスニペットを実行してテストする

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>


6

PHP - 139 137 107 101 91の 87バイト

これがゴルフに最適な方法かどうかはわかりませんが、ここで試してみます。

30 36 46 -50イスマエルミゲルおかげバイト

ここでオンラインテストする

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

古いコード:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";

プログラミングパズルとコードゴルフへようこそ。PHPコードをさらに削減できます。<?代わりに <?phpを使用して、3バイトを節約できます。の代わりに$c=$a.$a."/ \\\n\__".$a.$a."/\n";、書くことができます$c="$a$a/ \\\n\__.$a$a/\n";(PHPは文字列の変数を展開するため)。同じロジックをに適用して、そのecho長さをさらに短くすることができます。また、echo文字列との間にそのスペースは必要ありません。
イスマエルミゲル

1
ありがとう、ゴルフをするたびに何か新しいことを学びます。
ティモ

どういたしまして。以下は、99バイトの長さのソリューションです:ideone.com/WHWEZS。混乱しているように見えますが、かなり短いです。を使用する代わりに\n実際の 改行を入れて、1行につき1バイト節約できます。
イスマエルミゲル

一方、私はそれを2バイト削減しました。現在は97バイトです。
イスマエルミゲル

1
ワンライナーは次のとおり<?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";です。\tタブ文字と\n実際の改行で置き換えることを忘れないでください。
イスマエルミゲル

4

ルア146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(わかりやすくするために改行が追加されました)


1
このコードには、出力に加えてエスケープと文字列処理のものが含まれているだけなので、目的の出力より長くありませんか?
カレブ

6
@カレブ:あなたが実際に数えたのではなく、そのコメントをする際に推測しただけだと思う​​。私のテキストエディターによると、ラティスには165文字が含まれています(改行が含まれています)。S3回繰り返すため、19個の文字が少なくなります。
カイルカノス

2
しかし、あなたはエスケープと改行がこの特定のゲームで競争する私のコードの能力を制限することは正しいです。しかし、勝つことは私がこれをする理由ではなく、楽しみと学習のためです。
カイルカノス

3

ダーツ-113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

純粋な文字列補間ソリューション、派手なものはありません。「部分文字列」などの文字列操作は冗長すぎて、実際には競合できません。

DartPadで実行します。


3

Javascript(ES7 Draft)、96 94 93バイト

ここでいくつかのソリューションからインスピレーションを得た...

編集:edc65から-1

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

コメント:

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)

良いですね。.substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65

@ edc65いいキャッチ!
アンダースコア

簡単な質問:なぜそれがある+xだけではなくx
ニックハートリー

1
@QPaysTaxes数値にキャストxすることです。それなしでは、連結されますz
nderscore

2

Pythonの3、100の 87バイト

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

そして、以下のコードの読み取り可能なバージョン。アイデアは、間隔(開始、長さ)をハードコーディングし、正しい間隔で間隔を空けて間隔を中央に配置することです。

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])

2

網膜、66バイト

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

各行は独自のファイルに移動する必要があり<LF>、ファイル内の実際の改行を意味します。バイトカウントに追加される余分なファイルごとに1バイト。

-sフラグ付きの1つのファイルとしてコードを実行し、<LF>マーカーを保持し、必要に応じて出力のマーカーを改行に変更して読みやすくすることができます。

アルゴリズムは、空の入力文字列から始まる5つの単純な代替手順(奇数行の内容を偶数行の内容に変更)です。各ステップの後の結果は(で区切られています=):

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/

1

Javascript、154 151バイト

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.