-X
Hãy thử trực tuyến!
Hãy thử ngược lại!
Giải trình
Hóa ra điều này thực sự dễ dàng hơn rất nhiều so với thử thách trước đây trong Stack Mèo. Chương trình đầy đủ (sau khi áp dụng -m
) ở đây là -X-
. X
được sử dụng để hoán đổi các ngăn xếp bên trái và bên phải của đầu băng, nghĩa là nó hoàn toàn không ảnh hưởng đến ngăn xếp ban đầu, vì vậy chúng ta có thể bỏ qua nó. Nhưng sau đó, chương trình chỉ có hiệu quả--
(phủ định đỉnh của ngăn xếp hai lần), mà không làm gì cả.
Đối với chương trình nghịch đảo, áp dụng -m
cho X-X
. Một lần nữa, X
không làm gì cả, vì vậy chương trình chỉ có hiệu quả -
, mà phủ nhận đỉnh của ngăn xếp.
Giải pháp 2 byte duy nhất khác là -=
, nhưng nó hầu như giống nhau. Sự khác biệt duy nhất là =
hoán đổi chỉ các ngọn của các ngăn xếp liền kề, không phải toàn bộ các ngăn xếp.
Nhưng một lần nữa, sử dụng -m
cảm thấy hơi giống như gian lận, vì vậy dưới đây là một giải pháp sử dụng một chương trình nhân đôi hoàn toàn.
:I<->I:
Hãy thử trực tuyến!
Hãy thử ngược lại!
Giải trình
Các cân nhắc từ câu trả lời trước vẫn được áp dụng : bất kỳ giải pháp hợp lệ nào cũng cần sử dụng các ký tự được ghép nối và I
. Sáu giải pháp có thể (bao gồm trong liên kết TIO) hầu như giống nhau. -
và _
tương đương trong chương trình này, và:
có thể được thay thế bằng |
hoặc T
(hoạt động tương tự cho các đầu vào khác không và ngẫu nhiên cũng hoạt động cho các đầu vào bằng 0). Tôi vừa chọn cái này để giải thích vì nó dễ nhất.
Vì vậy, hãy nhớ rằng ngăn xếp ban đầu giữ đầu vào trên đầu trang của một -1
(trên đầu có vô số số không) trong khi tất cả các ngăn xếp khác dọc theo băng chỉ giữ các số không. Stack Mèo cũng có một đặc tính là bất kỳ chương trình dài chẵn nào cũng không có gì (miễn là nó chấm dứt, nhưng dù sao chúng ta cũng không thể sử dụng các vòng lặp cho thử thách này). Điều này cũng tương tự đối với bất kỳ chương trình có độ dài lẻ nào mà nhân vật trung tâm không làm gì cả ... hãy xem:
: Swap the input with the -1 below.
I Move the -1 one stack to the left and turn it into +1.
< Move another stack left (without taking the value).
- Negate the zero on top of that stack (i.e. do nothing).
Do đó, nửa sau của chương trình chính xác hoàn tác nửa đầu và chúng tôi kết thúc với đầu vào ở trên cùng của một -1
lần nữa.
Chương trình nghịch đảo là :I>-<I:
. Hãy xem điều đó thay đổi mọi thứ như thế nào:
: Swap the input with the -1 below.
I Move the -1 one stack to the left and turn it into +1.
> Move one stack right, i.e. back onto the initial stack which still holds the input.
- Negate the input.
< Move back to the left where we've parked the 1.
I Move that 1 back onto the initial stack and turn it back into a -1.
: Swap the -1 below the negated input to act as an EOF marker.