埋め込み六角形!


18

あなたのタスク:整数を指定するとn、以下の規則に従って、n番目の深さまで埋め込み六角形パターンを生成します。

埋め込まれた六角形の基本形状は次のとおりです:(n=0

 __      
/  \
\__/

埋め込み六角形n=1およびn=2

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

各辺の長さは、前の深さの同じ辺の長さの2倍の2倍です。上部と下部は2文字の長さn=0で、残りは1文字の長さで始まります。上下以外の辺の長さは2^n長くする必要があり(OEIS:A000079)、上下の辺はルールに従う必要があります2^(n+1)(同じOEIS)。

現在の六角形のインデックスは0ですが、必要に応じて1インデックスを使用することもできます。

これはなので、最短の答えが勝ちです!


@LuisMendoさて、名前を変更します。
同志SparklePony

大きな入力を処理するのは難しいかもしれません(例:64)。制限はありnますか?
マシュー盧

@SIGSEGV nに制限はありません。
同志SparklePony

1
六角形の答えを見て面白がるかもしれない:))
Mr Xcoder

1
こっち、私のコッホ曲線提出のタートルグラフィックスもこれを行うことができます(最初の機能のみが変更されました)。これには間違いなく長すぎます:)
ØrjanJohansen

回答:


10

40 29バイト

@Neilのおかげでwhileループを他のトリックの中でforループに変更することで11バイト節約

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

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

説明(古い)

このプログラムは、最大の六角形を生成することから始まり、次に、小さいループをwhileループ(1インデックス)で1つずつ実行します。参考のために、α入力された番号であり、β含まれている変数である2^(α-1)ιループで反復変数であるが。

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

「Hello、World!」がないことに気づきました まだ炭のプログラム。追加する必要があります。
mbomb007

@ mbomb007それは些細な「コマンドが含まれていない場合、この言語はソースファイルを印刷する」という答えの単なる複製ではないでしょうか?
ニール

私はそれを実現するとき、私はいくつかのバイトを保存した×_X²ιと同じであり×__β、そしていくつかのより多くのあなたを変換してバイト、入力番号を記憶する必要が回避します。オンラインでお試しください!
ニール

@ニールありがとう、それはかなりきれいです:)
Kritixi Lithos

5

Haskell230 217 207バイト

編集:

  • -13バイト:@xnorは、自分#がちょうどである可能性があることを確認しましたmax
  • -10バイト:そしてまたあることzipWithpにマージすることができ?、オペレータ、と私は(何とか!)再実装したいというreplicate

mを取り、Integerを返しますString

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

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

使い方

  • m主な機能です。&適切なパディングで六角形を生成するために使用し、それらを一緒に折りたたみますo
  • l&t辺の長さの小さな六角形を生成し、辺の長さtの大きい方の内側にパディングして、行のlリストとして作成しStringます。
    • a は六角形の一番上の行で、アンダースコアが付いています。
    • b六角形の上半分にある他の行のリストです。の線bは、長方形のパディングの中心にあります。これにより、次のステップが機能します。
    • 六角形の下半分であるaの上にオーバーレイbしてo、次いで逆、(ラインの両方順序と各ライン内)。
  • cは、長さのリストと文字列の2つの引数を取り、対応する長さと同じ数の元の各文字のコピーを持つ文字列を生成しますc[1,3,2]"abc" == "abbbcc"&行の生成に使用されます。
  • o は、画像を行のリストとして表す2つの引数を取り、最初の小さい方を2番目の上にオーバーレイします。
    • 六角形の結合と各六角形の下部の追加の両方に使用されます。
    • 基本的には、?2回使用して最初の画像を下方向と右方向に無限に多くのスペースで埋め、次に対応する文字をmaxで圧縮します。
  • (f?e)l ml無限に多くの「e」要素を追加してリストにパディングし、結果のリストとリストmf関数で圧縮します。

1
いい解決策!(#)できると思いますmax
xnor

1
pバイトを節約するために、zip圧縮と組み合わせることができますo=max?' '?"";f?e=z f.(++repeat e)。短いポイントフリーかもしれません。
-xnor

2
(\n->(<$[1..n]))ですreplicate
-xnor

@xnor replicate?今それはただ恥ずかしいです。私はあまりにも慣れている<$[1..n]か、[1..n]>>ほとんど常に勝ちます。ただし、?さらに短縮する方法はわかりません。私はすでにpポイントフリーを作成しようとしました++が、それは間違った場所にあり、物事を爆発させていflipます
Ørjanヨハンセン

3

JavaScript(ES6)、258バイト

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

説明:最初の六角形の後の六角形の場合、前の六角形が最初に生成され、各辺にパディングされます(これは出力が長方形であることに依存します)。(最初の見出しでは、ダミーのパディングがいくつか作成されます。)六角形の上面と上面が生成され、すべてのスペースが前の六角形とマージされます。(六角形を整列させるためのいくつかの策略があります。これは、余白を追加できる場合に簡単です。)六角形の下辺は、上辺と同様に生成され、六角形の下辺が塗りつぶされます。再帰が機能するためには、末尾の改行を含む長方形の出力を返すように注意する必要があります。


それで、あなたはこれ、テフロンのもの、そして深皿ピザのものがすべて本当に似たような構造であることを示していますか?それはちょっときちんとしている。
AdmBorkBork

1
@AdmBorkBorkそれをする他のいくつかの答えがあります。これらの対角線/はASCIIアートで人気がありreplace、JavaScriptで生成する方法は比較的安価です。
ニール

1<<n>>1:素敵な対称性;-)
ルーク

@Luke私は、たとえば、変数を変更できましたvが、悲しい1ことに、私の通常のフォントでは対称ではありません。
ニール

2

PHP、337バイト

0インデックス作成

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

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

拡大

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.