Ini sangat menyenangkan. Terima kasih telah mengirimkan tantangan ini.
Pengungkapan penuh: Bahasa (Hexagony) tidak ada pada saat tantangan ini diposting. Namun, saya tidak menciptakannya, dan bahasanya tidak dirancang untuk tantangan ini (atau tantangan spesifik lainnya).
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
Ditata secara heksagon:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
Program tidak benar-benar menggunakan #
instruksi, jadi saya menggunakan karakter itu untuk menunjukkan sel mana yang benar-benar tidak digunakan.
Bagaimana cara kerja program ini? Itu tergantung. Apakah Anda ingin versi pendek, atau panjang?
Penjelasan singkat
Untuk mengilustrasikan apa yang saya maksud dengan "garis" dan "segmen" dalam penjelasan berikut, pertimbangkan diseksi ini dari output yang dimaksudkan:
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
Dengan penjelasan itu, program berhubungan dengan pseudocode berikut:
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
Penjelasan panjang
Silakan lihat diagram jalur kode kode warna ini.
Eksekusi dimulai di sudut kiri atas. Urutan instruksi ){2'"''3''"2}?)
dieksekusi (ditambah beberapa pembatalan yang berlebihan, seperti "{
dll.) Dengan mengejar jalur yang cukup berbelit-belit. Kita mulai dengan Instruction Pointer # 0, disorot dalam crimson. Di tengah jalan, kami beralih ke # 1, mulai dari sudut kanan atas dan dicat hijau hutan. Ketika IP # 2 dimulai dengan warna biru jagung (kanan tengah), tata letak memorinya adalah ini:
Sepanjang keseluruhan program, tepi berlabel 2a dan 2b akan selalu memiliki nilai 2
(kami menggunakannya untuk menghitung 2ⁿ⁺¹ dan untuk membagi dengan 2, masing-masing) dan tepi berlabel 3 akan selalu 3
(kami menggunakannya untuk menghitung 3ⁱ).
Kami mulai berbisnis saat kami memasuki lingkaran pertama kami, disorot dengan warna biru bunga jagung. Loop ini menjalankan instruksi (}*{=&}{=
untuk menghitung nilai 2ⁿ⁺¹. Ketika loop keluar, jalur sadel coklat diambil, yang membawa kita ke Instruction Pointer # 3. IP ini hanya berkecimpung di sepanjang tepi bawah ke arah barat dengan warna kuning keemasan dan segera memberikan kontrol ke IP # 4.
Jalur fuchsia menunjukkan bagaimana IP # 4, mulai dari kiri bawah, berjalan dengan cepat ke garis penurunan , set ch ke 32
(karakter spasi) dan seg ke (nilai baru dari) baris . Hal ini disebabkan oleh penurunan awal yang sebenarnya kita mulai dengan 2ⁿ⁺¹ − 1 dan akhirnya mengalami iterasi terakhir dengan nilai 0. Kami kemudian memasuki loop bersarang pertama .
Kita mengalihkan perhatian kita ke indigo bercabang, di mana, setelah penurunan singkat dari seg , kita melihat ch diperbarui x
hanya jika seg sekarang nol. Setelah itu, n disetel ke garis - seg untuk menentukan jumlah sebenarnya dari segmen yang kita masuki. Segera kita memasuki lingkaran lain, kali ini dalam warna tomat yang adil.
Di sini, kita mencari tahu berapa kali n (jumlah segmen saat ini) dapat dibagi dengan 2. Selama modulo memberi kita nol, kita menambah i dan membagi n dengan 2. Ketika kita puas n tidak lagi dengan demikian dapat dibagi , kita bercabang ke dalam abu-abu batu tulis, yang berisi dua loop: pertama itu meningkatkan 3 pangkat dari i yang kita hitung, dan kemudian menghasilkan ch yang berkali-kali. Perhatikan bahwa loop pertama ini berisi a[
instruksi, yang beralih kontrol ke IP # 3 - yang hanya mengambil langkah kecil di sepanjang tepi bawah sebelumnya. Tubuh loop (dikalikan dengan 3 dan decrementing) dieksekusi oleh IP # 3 yang kesepian, dipenjara dalam siklus hijau zaitun gelap tak berujung di sepanjang tepi bawah kode. Demikian pula, yang kedua dari loop abu-abu batu tulis ini berisi ]
instruksi, yang mengaktifkan IP # 5 untuk menghasilkan ch dan pengurangan, ditunjukkan di sini dalam warna merah India gelap. Dalam kedua kasus tersebut, Instruksi Pointer yang terjebak dalam perbudakan dengan patuh melaksanakan satu iterasi pada satu waktu dan memberikan kontrol kembali ke IP # 4, hanya untuk menunggu saat layanan mereka dipanggil sekali lagi. Sementara itu, abu-abu batu tulis bergabung kembali dengan saudara-saudaranya yang fuchsia dan nila.
Ketika seg tak terelakkan mencapai nol, loop nila keluar ke jalur hijau halaman, yang hanya menampilkan karakter baris baru dan segera bergabung kembali ke fuchsia untuk melanjutkan loop baris . Di luar iterasi akhir dari loop line, terdapat jalur ebon pendek dari terminasi program akhir.
(,],~3^#@~.)@]
bukannya(1,[:,1,"0~3*])
menyimpan 1 byte. Dan jika Anda baik-baik saja dengan!
output charu:32+
bukannya' #'{~
menyimpan yang lain.