:-:_
Hãy thử trực tuyến! Trong phần chân trang tôi đã bao gồm tất cả các giải pháp 4 byte khác. (Mèo xếp chồng bỏ qua mọi thứ sau khi cho ăn đầu tiên.)
Hãy thử ngược lại!
Giải trình
Các -n
lượt cờ trên đầu ra số (và đầu vào, nhưng chúng tôi không có bất kỳ), và những -m
lá cờ thường chỉ là một tiện nghi chơi golf cho phép bạn tránh được những phần không cần thiết của mã nguồn. Điều này là do mọi chương trình Stack Mèo cần phải có đối xứng gương. Với -m
cờ bạn chỉ cho nó nửa đầu (cộng với ký tự trung tâm). Vì vậy, chương trình thực tế ở đây là:
:-:_:-:
Như bạn có thể thấy trong liên kết TIO đầu tiên, có rất nhiều giải pháp 4 byte, nhưng tôi đã chọn giải pháp này vì đơn giản. Stack Mèo dựa trên stack và chương trình này chỉ sử dụng stack ban đầu. Vì chúng ta không có bất kỳ đầu vào nào, nó chứa một -1
(một điểm đánh dấu EOF) trên một giếng số vô hạn. Ba lệnh trong chương trình có ý nghĩa như sau:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
Vì vậy, đây là cách chương trình sửa đổi ngăn xếp (trạng thái và lệnh được đặt so le để chỉ ra cách mỗi lệnh thay đổi ngăn xếp từ trạng thái này sang trạng thái tiếp theo):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
Hóa ra, lệnh duy nhất thực sự làm bất cứ điều gì ở đây là _
biến điểm đánh dấu EOF của chúng ta thành a 1
. Đầu ra ở cuối chương trình là ẩn và dấu EOF là tùy chọn, vì vậy điều này chỉ in ra những gì 1
chúng ta nhận được.
Bây giờ nếu chúng ta đảo ngược mã nguồn, do phản chiếu ngầm, chương trình thực tế sẽ trở thành:
_:-:-:_
Điều này làm một cái gì đó rất khác nhau:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
Lần này dưới cùng của ngăn xếp là vẫn còn là một -1
vì vậy nó đóng vai trò là điểm đánh dấu EOF và chỉ có-1
trên đầu trang của nó được in.
...
Bây giờ với tất cả những gì đã nói, vì Stack Mèo có mối quan hệ độc đáo với mã đảo ngược, tôi cảm thấy rằng việc sử dụng -m
là một chút gian lận. Thông thường chỉ có nghĩa là lưu byte bằng cách bỏ qua phần thừa của mã nguồn, nhưng ở đây nó thực sự làm cho thách thức dễ dàng hơn rất nhiều và thậm chí toàn bộ chương trình ngắn hơn. Điều này là do việc đảo ngược một chương trình đầy đủ sẽ chỉ thay đổi chương trình nếu nó chứa bất kỳ chương trình nào <>[]
, điều đó cũng có nghĩa là chương trình kết thúc bằng cách sử dụng nhiều ngăn xếp (Stack Mèo thực sự có một băng ngăn xếp, trong đó tất cả trừ một chương trình ban đầu chỉ được lấp đầy với số không để bắt đầu). Hơn nữa, đảo ngược nó sau đó chỉ hoán đổi các cặp <>
và []
cặp, điều này vẫn làm cho việc thực hiện đối xứng. Cách duy nhất để phá vỡ tính đối xứng đó là sử dụng I
cái nào -]
hoặc-[
hoặc không có gì tùy thuộc vào dấu hiệu của đỉnh ngăn xếp. Vì thế...
*|]I*:*I[|*
Hãy thử trực tuyến! Chân trang một lần nữa bao gồm tất cả các lựa chọn thay thế khác ở cùng một số byte. Một số đầu ra 1 / -1 và một số đầu ra 2 / -2 như được chỉ định sau mỗi chương trình. Tôi chọn cái này để giải thích ngẫu nhiên là một trong những cái đầu ra 2.
Hãy thử ngược lại!
Giải trình
Như tôi đã nói, cái này dài hơn một chút. Ngay cả khi chúng tôi đã sử dụng-m
ký hiệu cho điều này, nó sẽ có trọng lượng 6 byte thay vì 4 ở trên.
Các lệnh được sử dụng lần này:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
Chương trình đầu tiên chỉ sử dụng hai ngăn xếp. Đó là một chút lộn xộn để làm trong nghệ thuật ASCII, nhưng tôi sẽ cố gắng hết sức. Dấu ngoặc vuông cho biết ngăn xếp đầu băng nào được bật và tôi sẽ đặt các lệnh giữa mỗi cặp trạng thái ngăn xếp.
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
Bây giờ -1
hoạt động như một điểm đánh dấu EOF và2
được in.
Các chương trình khác là như vậy cho đến khi [
. Nó vẫn gần như giống nhau cho đến lần thứ hai I
. Về mặt kỹ thuật, chúng tôi sẽ ở trên một ngăn xếp khác nhau, nhưng không có giá trị nào trên chúng, tất cả đều không thể phân biệt được. Nhưng sau đó, sự khác biệt giữa I[
và I]
kết thúc quan trọng:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
Và lần này, chúng ta không có điểm đánh dấu EOF, nhưng chương trình vẫn xuất ra -2
.
-
(0x45 = 0b00101101) hoạt động trong Jelly --
mang lại -1 vì nó xác định nghĩa đen -1, trong khiṆ
(0xB4 = 0b10110100) mang lại 1 vì nó không thực hiện logic của đầu vào ngầm bằng không. (Tất nhiên cũngṆ
hoạt động tốt: p)