Cubix, 238 234 217 151 110 100 byte
Disimpan 14 byte berkat ETHProductions
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
Diperluas:
u ' ^ . :
s + . ; ;
; \ - ? W
? r s o s
\ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Cobalah online!
Coba di sini
Penjelasan
Kode terdiri dari 8 langkah, dengan dua loop. Saya akan membahas bagian kode bagian demi bagian.
Langkah 1 (A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
Ini adalah kubus dengan bagian-bagian yang tidak relevan dengan langkah pertama yang dihapus. Tanda tanya menunjukkan no-ops yang akan dikunjungi IP, untuk membuat jalurnya lebih jelas.
IO:'^o;IO:r*(; # Explanation
I # Push the first input (A)
O # output that
: # duplicate it
'^ # Push the character "^"
o # output that
; # pop it from the stack
I # Push the second input (B)
O # output that
: # duplicate
r # rotate top 3 elements
* # Push the product of the top two elements
( # decrease it by one
; # pop it from the stack (making the last
# two operations useless, but doing it
# this way saves 10B)
Sekarang, tumpukan terlihat seperti ini: A, B, A, B
Langkah 2 (bersiap untuk loop cetak)
Loop cetak memakan waktu 3 argumen (bagian atas 3 elemen pada stack): P
, Q
dan R
. P
adalah jumlah pengulangan, Q
adalah pemisah (kode karakter) dan R
merupakan angka yang harus diulang. Untungnya, loop juga menangani persyaratan bahwa string yang dihasilkan harus diakhiri R
, bukan Q
.
Kami ingin mengulang A*
tepat B
waktu, jadi pemisahnya *
. Perhatikan bahwa tumpukan dimulai sebagai A, B, A, B
. Sekali lagi, saya menghapus semua instruksi yang tidak relevan. IP mulai di S
menunjuk utara.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
Tumpukan sekarang A, B, B, *, A
.
Langkah 3/6/8 (lingkaran cetak)
Konsep
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
IP memasuki loop through S
, menunjuk ke utara, dan keluar dari loop pada E
, menunjuk ke utara lagi. Untuk penjelasan ini, tumpukan diatur ke [..., A, B, C]
. Instruksi berikut dijalankan. Perhatikan bahwa IP tidak dapat meninggalkan loop sebelum tanda tanya, jadi empat instruksi pertama akan selalu dieksekusi.
Orr(?rsos # Explanation
O # Output `C`
rr # Rotate top three elements twice (Stack: [..., B, C, A])
( # Decrease A by one (Stack: [..., B, C, A-1])
? # If top of stack (A) > 0:
r # Rotate top of stack (Stack: [..., A-1, B, C])
s # Swap top elements (Stack: [..., A-1, C, B])
o # Output top of stack (B) as character code
s # Swap top elements (Stack: [..., A-1, B, C]
#
# ... and repeat ...
Pelaksanaan
Inilah kubus lagi, dengan bagian-bagian yang tidak relevan dihapus. IP dimulai S
, menunjuk ke timur.
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Seperti yang Anda lihat, IP menemukan empat instruksi sebelum memasuki loop. Karena kode karakter dihapus lagi, kita mencapai loop dengan tumpukan yang sama persis seperti yang kita masukkan bagian ini.
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
Di dalam loop, penjelasan di atas berlaku.
Langkah 4 (membedakan IP)
Karena kita menggunakan loop di atas beberapa kali, dan mereka semua menyebabkan IP berakhir di tempat yang sama, kita harus membedakan antara beberapa run. Pertama, kita dapat membedakan antara separator (run pertama memiliki *
, sedangkan run dua dan tiga memiliki +
sebagai separator). Kita dapat membedakan antara run 2 dan 3 dengan memeriksa nilai angka yang diulang. Jika itu salah, program harus diakhiri.
Perbandingan pertama
Inilah yang terlihat seperti pada kubus. IP dimulai pada S dan menunjuk ke utara. Tumpukan berisi [..., * or +, A or 1, 0]
. Angka 1 menunjukkan di mana IP akan berakhir jika ini adalah loop pertama (menunjuk ke utara) dan angka 2 menunjukkan di mana IP akan berakhir jika ini adalah loop kedua (atau ketiga) (menunjuk ke timur).
u ' . . .
s + . 1 .
; \ - ? 2
S . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;s'+-? # Explanation
; # Delete top element (0)
s # Swap the top two elements (Stack: 1/A, */+)
'+ # Push the character code of +
- # Subtract the top two elements and push
# that to the stack (Stack: 1/A, */+, +, (*/+)-+)
? # Changes the direction based on the top
# item on the stack. If it's 0 (if (*/+) == +)
# the IP continues going right, otherwise, it
# turns and continues going north.
Jika IP sekarang di 1
, tumpukan adalah [A, *, +, -1]
. Jika tidak, tumpukannya [A or 1, +, +, 0]
. Seperti yang Anda lihat, masih ada yang tidak diketahui dalam tumpukan kasus kedua, jadi kita harus melakukan perbandingan lain.
Perbandingan kedua
Karena IP telah melalui langkah 5, tumpukan terlihat seperti ini: [A^(B-1) or nothing, A or 1, +, +, 0]
. Jika elemen pertama adalah nothing
, elemen kedua adalah 1
, dan kebalikannya juga berlaku. Kubus terlihat seperti ini, dengan IP mulai dari S dan menunjuk ke timur. Jika ini adalah loop kedua, IP berakhir di E
, menunjuk ke barat. Jika tidak, program akan menyentuh @
dan berakhir.
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Instruksi yang dijalankan yang tidak melakukan apa pun untuk aliran kontrol tercantum di bawah ini.
;;q*q(!@
;; # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
q # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
* # Push product of top two elements
# (Stack [+, A^(B-1)/0, A/1, A^B/0])
q # Send top element to the bottom
# (Stack [A^B/0, +, A^(B-1)/0, A/1])
( # Decrease the top element by 1
# (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
! # If (top element == 0):
@ # Stop program
Tumpukan sekarang [A^B, +, A^(B-1), A-1]
, asalkan program tidak berhenti.
Langkah 5 (mempersiapkan "A +" (ulangi A ^ (B-1)))
Sayangnya, Cubix tidak memiliki operator listrik, jadi kita perlu loop lain. Namun, kita perlu membersihkan tumpukan dulu, yang sekarang berisi [B, A, *, +, -1]
.
Membersihkan
Ini kubusnya lagi. Seperti biasa, IP dimulai pada S (menunjuk ke utara), dan berakhir di E, menunjuk ke barat.
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
Menghitung A ^ (B-1)
Loop lain yang bekerja kurang lebih sama dengan loop cetak, tetapi sedikit lebih kompak. IP dimulai S
, menunjuk ke barat, dengan tumpukan [B, A, *]
. IP keluar di E
menunjuk utara.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Badan loop adalah sebagai berikut.
;s(?s*s # Explanation
; # Pop top element.
s # Shift top elements.
( # Decrease top element by one
? # If not 0:
s # Shift top elements again
* # Multiply
s # Shift back
#
# ... and repeat ...
Tumpukan yang dihasilkan adalah [A, A^(B-1), 0]
.
Membersihkan tumpukan (lagi)
Sekarang kita perlu kembali ke loop cetak, dengan bagian atas tumpukan berisi [..., A^(B-1), +, A]
. Untuk melakukan ini, kami menjalankan yang berikut ini. Ini kubusnya lagi,
. . ^ ? :
. . . . .
. . . . .
. . . . .
E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
;:$sqq'+s # Explanation
; # Delete top element (Stack: [A, A^(B-1)])
: # Copy top element
$s # No-op
qq # Send top two elements to the bottom
# (Stack: [A^(B-1), A^(B-1), A])
'+ # Push +
# (Stack: [A^(B-1), A^(B-1), A, +])
s # Swap top two elements
# (Stack: [A^(B-1), A^(B-1), +, A])
Langkah 7 (mempersiapkan loop terakhir)
Tumpukannya sekarang [A^B, +, A^(B-1), A-1]
, IP mulai S
, ke barat, dan berakhir pada E
, ke kanan.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Instruksi dijalankan:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
Tumpukan sekarang terlihat seperti [A^B, +, 1]
, dan IP akan memasuki lingkaran cetak, jadi kita sudah selesai.