Cubix, 238 234 217 151 110 100 byte
Đã lưu 14 byte nhờ vào ETH Productstions
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
Mở rộng:
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 \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Hãy thử trực tuyến!
Hãy thử nó ở đây
Giải trình
Mã bao gồm 8 bước, với hai vòng lặp. Tôi sẽ đi qua phần mã một phần.
Bước 1 (A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
Đây là khối lập phương với các phần không liên quan đến bước đầu tiên bị loại bỏ. Dấu hỏi cho thấy các IP không truy cập sẽ làm cho đường dẫn của nó rõ ràng hơn.
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)
Bây giờ, ngăn xếp trông như thế này: A, B, A, B
Bước 2 (chuẩn bị cho vòng lặp in)
Vòng lặp in mất 3 đối số (3 yếu tố hàng đầu trên stack): P
, Q
và R
. P
là số lần lặp lại, Q
là dấu phân cách (mã ký tự) và R
là số cần lặp lại. May mắn thay, vòng lặp cũng quan tâm đến yêu cầu mà chuỗi kết quả phải kết thúc R
, không phải Q
.
Chúng tôi muốn lặp lại A*
chính xác B
thời gian, vì vậy dấu phân cách là *
. Lưu ý rằng ngăn xếp bắt đầu như A, B, A, B
. Một lần nữa, tôi loại bỏ tất cả các hướng dẫn không liên quan. IP bắt đầu tại S
điểm phía bắc.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
Bây giờ là ngăn xếp A, B, B, *, A
.
Bước 3/6/8 (vòng lặp in)
Khái niệm
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
IP đi vào vòng lặp thông qua S
, chỉ về hướng bắc và thoát khỏi vòng lặp tại E
, chỉ về hướng bắc một lần nữa. Đối với lời giải thích này, ngăn xếp được đặt thành [..., A, B, C]
. Các hướng dẫn sau đây được thực hiện. Lưu ý rằng IP không thể rời khỏi vòng lặp trước dấu chấm hỏi, vì vậy bốn hướng dẫn đầu tiên sẽ luôn được thực thi.
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 ...
Thực hiện
Đây là khối lập phương một lần nữa, với các phần không liên quan được loại bỏ. IP bắt đầu tại S
, chỉ về phía đông.
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Như bạn có thể thấy, IP đi qua bốn hướng dẫn trước khi vào vòng lặp. Vì mã ký tự được loại bỏ một lần nữa, chúng tôi tiếp cận vòng lặp với cùng ngăn xếp chính xác khi chúng tôi nhập phần này.
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
Bên trong vòng lặp, lời giải thích ở trên giữ.
Bước 4 (phân biệt IP)
Vì chúng tôi sử dụng vòng lặp trên nhiều lần và tất cả đều khiến IP kết thúc ở cùng một điểm, chúng tôi phải phân biệt giữa nhiều lần chạy. Đầu tiên, chúng ta có thể phân biệt giữa dấu phân cách (lần chạy đầu tiên có a *
, trong khi chạy hai và ba có +
dấu phân cách). Chúng ta có thể phân biệt giữa chạy 2 và 3 bằng cách kiểm tra giá trị của số được lặp lại. Nếu đó là một, chương trình nên chấm dứt.
So sánh đầu tiên
Đây là những gì nó trông giống như trên khối lập phương. IP bắt đầu tại S và chỉ về phía bắc. Các ngăn chứa [..., * or +, A or 1, 0]
. Số 1 hiển thị nơi IP sẽ kết thúc nếu đây là vòng lặp đầu tiên (chỉ về hướng bắc) và số 2 cho thấy IP sẽ kết thúc nếu đây là vòng lặp thứ hai (hoặc thứ ba) (chỉ về hướng đông).
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.
Nếu IP bây giờ là tại 1
, ngăn xếp là [A, *, +, -1]
. Nếu không, ngăn xếp là [A or 1, +, +, 0]
. Như bạn có thể thấy, vẫn còn một ẩn số trong trường hợp thứ hai, vì vậy chúng ta phải thực hiện một so sánh khác.
So sánh thứ hai
Vì IP đã đi qua bước 5, nên ngăn xếp trông như thế này : [A^(B-1) or nothing, A or 1, +, +, 0]
. Nếu phần tử đầu tiên là nothing
, phần tử thứ hai là 1
và phần tử ngược cũng vậy. Khối lập phương trông như thế này, với IP bắt đầu từ S và chỉ về hướng đông. Nếu đây là vòng lặp thứ hai, IP kết thúc tại E
, chỉ về phía tây. Nếu không, chương trình nhấn @
và chấm dứt.
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Các hướng dẫn được thực hiện mà không làm gì với luồng điều khiển được liệt kê bên dưới.
;;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
Bây giờ ngăn xếp [A^B, +, A^(B-1), A-1]
, miễn là chương trình không kết thúc.
Bước 5 (chuẩn bị cho "A +" (lặp lại A ^ (B-1)))
Đáng buồn thay, Cubix không có nhà điều hành điện, vì vậy chúng tôi cần một vòng lặp khác. Tuy nhiên, chúng ta cần dọn sạch ngăn xếp trước, hiện có chứa [B, A, *, +, -1]
.
Dọn dẹp
Đây là khối lập phương một lần nữa. Như thường lệ, IP bắt đầu tại S (chỉ về hướng bắc) và kết thúc tại E, chỉ về phía tây.
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
Tính A ^ (B-1)
Một vòng lặp khác hoạt động gần giống như vòng lặp in, nhưng nó nhỏ gọn hơn một chút. IP bắt đầu tại S
, chỉ về phía tây, với ngăn xếp [B, A, *]
. IP thoát ra ở E
hướng bắc.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Cơ thể vòng lặp là như sau.
;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 ...
Ngăn xếp kết quả là [A, A^(B-1), 0]
.
Dọn dẹp ngăn xếp (một lần nữa)
Bây giờ chúng ta cần phải quay lại vòng in, với đỉnh ngăn xếp chứa [..., A^(B-1), +, A]
. Để làm điều này, chúng tôi thực hiện như sau. Đây là khối lập phương một lần nữ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])
Bước 7 (chuẩn bị cho vòng lặp cuối cùng)
Bây giờ [A^B, +, A^(B-1), A-1]
, ngăn xếp , IP bắt đầu S
, đi về phía tây và kết thúc tại E
, đi bên phải.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Các hướng dẫn thực hiện:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
Bây giờ ngăn xếp trông như thế [A^B, +, 1]
và IP sắp vào vòng in, vậy là xong.