六角形、217バイト
これは非常に楽しかったです。このチャレンジを投稿していただきありがとうございます。
完全な開示:このチャレンジが投稿された時点では、言語(六角形)は存在していませんでした。しかし、私はそれを発明しなかったし、言語はこの課題(または他の特定の課題)向けに設計されていません。
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
六角形にレイアウト:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
プログラムは実際に#
命令を使用しないため、その文字を使用して、実際に使用されていないセルを示します。
このプログラムはどのように機能しますか?場合によります。短いバージョンが必要ですか、それとも長いバージョンですか?
簡単な説明
以下の説明で「ライン」と「セグメント」が意味することを説明するために、意図した出力のこの分析を検討してください。
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
説明すると、プログラムは次の擬似コードに対応します。
n = get integer from stdin
# Calculate the number of lines we need to output.
line = pow(2, n+1)
while line > 0:
line = line - 1
# For all segments except the last, the character to use is spaces.
ch = ' ' (space, ASCII 32)
# The number of segments in each line is
# equal to the line number, counting down.
seg = line
while seg > 0:
seg = seg - 1
# For the last segment, use x’s.
if seg = 0:
ch = 'x' (ASCII 120)
# Calculate the actual segment number, where the leftmost is 1
n = line - seg
# Output the segment
i = pow(3, number of times n can be divided by 2)
i times: output ch
output '\n' (newline, ASCII 10)
end program
長い説明
この色分けされたコードパス図を参照してください。
実行は左上隅から始まります。かなり複雑なパスを追跡することにより){2'"''3''"2}?)
、一連の命令が実行されます(さらに、いくつかの冗長なキャンセル"{
など)。深紅色で強調表示された命令ポインター#0から始めます。途中で、右上隅からフォレストグリーンに塗られた#1に切り替えます。IP#2がコーンフラワーブルー(右中央)で始まる場合、メモリレイアウトは次のようになります。
プログラム全体を通して、2aおよび2bとラベル付けされたエッジは常に値を持ち2
(それぞれ2ⁿ⁺¹を計算し、2で割る)、3とラベル付けされたエッジは常に3
(3ⁱを計算するためにそれを使用します)。
コーンフラワーブルーで強調表示されている最初のループに入ると、ビジネスが始まります。このループは、命令(}*{=&}{=
を実行して値2ⁿ⁺¹を計算します。ループが終了すると、茶色のサドルパスが使用され、命令ポインター#3に移動します。このIPは、ゴールデンロッドイエローで西の下端に沿って軽くたたくだけで、すぐにIP#4に制御を渡します。
フクシアのパスは、左下から始まるIP#4がデクリメント行にすばやく進み、chを32
(スペース文字)およびsegを(新しい値)lineに設定する方法を示します。それは、実際に2ⁿ⁺¹-1で始まり、最終的に値0で最後の反復を経験するのは初期の減少のためです。次に、最初のネストされたループに入ります。
私たちは、の簡単デクリメントした後、分岐藍、に注意を向けワンセグ、私たちが見るchはに更新されx
た場合にのみ、ワンセグは今ゼロです。その後、nをline-segに設定して、現在のセグメントの実際の数を決定します。すぐに別のループに入ります。今回はトマトの色がきれいです。
ここでは、我々は何回見つけ出すのn長いモジュロが私たちを与えるほどのために2で割ることができます(現在のセグメント番号)ゼロ、我々は増加しない私と除算nは我々が成立したとき2でのnはもはやthusly割り切れます、2つのループを含むスレートグレーに分岐します。最初に3 を計算したiの累乗にし、次にchを何回も出力します。これらのループの最初に含まれていることに注意してください[
命令、制御をIP#3に切り替えます。これは、以前に下端に沿って赤ちゃんの一歩を踏み出しただけのものでした。ループの本体(3倍とデクリメント)は、コードの下端に沿って無限の暗いオリーブグリーンのサイクルに閉じ込められた孤独なIP#3によって実行されます。同様に、これらのスレートグレーループの2番目には、]
IP#5をアクティブにしてchとデクリメントを出力する命令が含まれています(ここでは濃いインド赤で示されています)。どちらの場合も、奴隷状態に陥った命令ポインターは、一度に1つの反復を素直に実行し、IP#4に制御を戻しますが、サービスが再び呼び出される瞬間を逃します。一方、スレートグレーは、フクシアとインディゴの兄弟に再び加わります。
SEG必然単に改行文字を出力し、速やかに継続するバックフクシアに合流芝生グリーンパスへインジゴループ終了し、ゼロに達する線ループ。ラインループの最後の反復を超えて、究極のプログラム終了の短いセーブルのebonパスがあります。
(,],~3^#@~.)@]
を(1,[:,1,"0~3*])
節約します。そして、!
出力文字として別のものu:32+
を' #'{~
保存する代わりに大丈夫なら。