Cubix, 238 234 217 151 110 100 bytes
Saved 14 bytes thanks to ETHProductions
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
Expanded:
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 \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Try it online!
Try it here
Explanation
The code consists of 8 steps, with two loops. I'll go over the code part by part.
Step 1 (A^B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
This is the cube with the parts that are irrelevant to the first step removed. The question mark shows the no-ops the IP will visit, to make its path more clear.
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)
Now, the stack looks like this: A, B, A, B
Step 2 (prepare for print loop)
The print loop takes 3 arguments (the top 3 elements on the stack): P
, Q
and R
. P
is the amount of repetitions, Q
is the separator (character code) and R
is the number to repeat. Luckily, the loop also takes care of the requirement that the resulting string should end in R
, not Q
.
เราต้องการที่จะทำซ้ำA*
ตรงเวลาเพื่อให้แยกเป็นB
โปรดทราบว่าสแต็คเริ่มเป็น*
A, B, A, B
ฉันลบคำแนะนำที่ไม่เกี่ยวข้องทั้งหมดออกอีกครั้ง IP เริ่มต้นที่S
ชี้ไปทางทิศเหนือ
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
สแตกอยู่ในขณะนี้ A, B, B, *, A
สแต็คอยู่ในขณะนี้
ขั้นตอนที่ 3/6/8 (ลูปการพิมพ์)
แนวคิด
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
IP เข้าสู่ลูปผ่านS
, ชี้ไปทางทิศเหนือ, และออกจากลูปที่E
, ชี้ไปทางทิศเหนืออีกครั้ง [..., A, B, C]
สำหรับคำอธิบายนี้สแต็คที่ถูกกำหนดเป็น คำแนะนำต่อไปนี้จะถูกดำเนินการ โปรดทราบว่า IP ไม่สามารถออกจากลูปก่อนเครื่องหมายคำถามดังนั้นคำสั่งสี่คำแรกจะถูกดำเนินการเสมอ
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 ...
การดำเนินงาน
นี่คือคิวบ์อีกครั้งโดยนำส่วนที่ไม่เกี่ยวข้องออก IP เริ่มต้นที่S
ชี้ไปทางทิศตะวันออก
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
อย่างที่คุณเห็น IP มีคำสั่งอยู่สี่คำสั่งก่อนที่มันจะเข้าสู่ลูป เนื่องจากรหัสตัวละครจะถูกลบออกอีกครั้งเราถึงลูปด้วยสแต็คเดียวกันแน่นอนเมื่อเราเข้าสู่ส่วนนี้
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
ภายในวงคำอธิบายข้างต้นถือ
ขั้นตอนที่ 4 (สร้างความแตกต่างของ IP)
เนื่องจากเราใช้ลูปข้างต้นหลายครั้งและมันทำให้ IP สิ้นสุดในจุดเดียวกันเราจึงต้องแยกความแตกต่างระหว่างการวิ่งหลายครั้ง อันดับแรกเราสามารถแยกความแตกต่างระหว่างตัวแยก (การเรียกใช้ครั้งแรกมี a *
ในขณะที่การทำงานสองและสามมี+
ตัวแยก) เราสามารถแยกความแตกต่างระหว่างการรัน 2 และ 3 โดยการตรวจสอบค่าของหมายเลขที่ซ้ำกัน หากเป็นเช่นนั้นโปรแกรมควรจะยุติการทำงาน
การเปรียบเทียบครั้งแรก
นี่คือหน้าตาของลูกบาศก์ IP เริ่มต้นที่ S และชี้ไปทางทิศเหนือ [..., * or +, A or 1, 0]
สแต็คมี หมายเลข 1 แสดงตำแหน่งที่ IP จะสิ้นสุดหากนี่คือลูปแรก (ชี้ไปทางทิศเหนือ) และหมายเลข 2 แสดงตำแหน่งที่ IP จะจบลงหากนี่คือลูปที่สอง (หรือสาม) (ชี้ไปทางทิศตะวันออก)
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.
หาก IP อยู่ที่ at 1
stack จะเป็น[A, *, +, -1]
เช่นนั้น มิฉะนั้นสแต็คคือ[A or 1, +, +, 0]
มิฉะนั้นสแต็คเป็นอย่างที่คุณเห็นยังมีสิ่งที่ไม่รู้จักในสแต็คของกรณีที่สองดังนั้นเราต้องทำการเปรียบเทียบอีกครั้ง
การเปรียบเทียบที่สอง
เพราะ IP ได้ผ่านขั้นตอนที่ 5 [A^(B-1) or nothing, A or 1, +, +, 0]
กองลักษณะเช่นนี้ หากองค์ประกอบแรกคือองค์ประกอบnothing
ที่สองคือ1
และย้อนกลับถือเกินไป ลูกบาศก์มีลักษณะเช่นนี้โดยที่ IP เริ่มต้นที่ S และชี้ไปทางทิศตะวันออก หากนี่คือลูปที่สอง IP จะสิ้นสุดที่E
ชี้ไปทางทิศตะวันตก มิฉะนั้นโปรแกรม@
จะหยุดทำงานและยกเลิก
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
คำแนะนำที่ดำเนินการซึ่งไม่ได้ทำอะไรกับโฟลว์การควบคุมอยู่ในรายการด้านล่าง
;;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
สแตกอยู่ในขณะนี้[A^B, +, A^(B-1), A-1]
หากโปรแกรมไม่ได้ยุติ
ขั้นตอนที่ 5 (เตรียมสำหรับ "A +" (ทำซ้ำ A ^ (B-1))
น่าเศร้า Cubix ไม่มีผู้ให้บริการพลังงานดังนั้นเราจึงต้องการการวนซ้ำอีกครั้ง อย่างไรก็ตามเราจำเป็นต้องทำความสะอาดสแต็กก่อนซึ่งตอนนี้มี[B, A, *, +, -1]
แต่เราจำเป็นต้องทำความสะอาดสแต็คเป็นครั้งแรกซึ่งขณะนี้มี
การทำความสะอาด
นี่คือคิวบ์อีกครั้ง ตามปกติ IP เริ่มต้นที่ S (ชี้ทิศเหนือ) และสิ้นสุดที่ E ชี้ไปทางทิศตะวันตก
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
คำนวณ A ^ (B-1)
ลูปอื่นที่ทำงานโดยประมาณเหมือนกับลูปการพิมพ์ แต่มีขนาดเล็กกว่าเล็กน้อย IP เริ่มต้นที่S
ชี้ไปทางทิศตะวันตกพร้อมกับสแต็[B, A, *]
ก IP ออกจากที่E
ชี้ไปทางทิศเหนือ
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
ห่วงร่างกายมีดังต่อไปนี้
;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 ...
[A, A^(B-1), 0]
สแต็คที่เกิดคือ
ทำความสะอาดสแต็ก (อีกครั้ง)
[..., A^(B-1), +, A]
ตอนนี้เราจำเป็นต้องได้รับการวนรอบที่พิมพ์อีกครั้งกับด้านบนของสแต็คที่มี ในการทำเช่นนี้เราจะดำเนินการดังต่อไปนี้ นี่คือคิวบ์อีกครั้ง
. . ^ ? :
. . . . .
. . . . .
. . . . .
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])
ขั้นตอนที่ 7 (เตรียมความพร้อมสำหรับการวนรอบสุดท้าย)
สแต็คตอนนี้[A^B, +, A^(B-1), A-1]
IP เริ่มต้นที่S
จะไปทางตะวันตกและสิ้นสุดที่E
ไปทางขวา
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
คำแนะนำดำเนินการ:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
สแต็กตอนนี้ดูเหมือน[A^B, +, 1]
และ IP กำลังจะเข้าสู่วงพิมพ์ดังนั้นเราเสร็จแล้ว