:-:_
ลองออนไลน์! ในส่วนท้ายฉันได้รวมโซลูชัน 4 ไบต์อื่น ๆ ทั้งหมดแล้ว (Stack Cats จะไม่สนใจทุกสิ่งหลังจาก linefeed แรก)
ลองย้อนกลับ!
คำอธิบาย
การ-n
เปิดใช้งานการตั้งค่าสถานะเป็นตัวเลข (และการป้อนข้อมูล แต่เราไม่มี) และโดยทั่วไปการ-m
ตั้งค่าสถานะเป็นเพียงความสะดวกสบายในการเล่นกอล์ฟซึ่งช่วยให้คุณหลีกเลี่ยงส่วนที่ซ้ำซ้อนของซอร์สโค้ด นี่เป็นเพราะทุกโปรแกรม Stack Cats ต้องมีมิร์เรอร์สมมาตร ด้วยการ-m
ตั้งค่าสถานะคุณให้ครึ่งแรกเท่านั้น (รวมถึงอักขระกลาง) ดังนั้นโปรแกรมจริงที่นี่คือ:
:-:_:-:
อย่างที่คุณเห็นในลิงค์แรกของ TIO มีวิธีแก้ปัญหา 4 ไบต์มากมาย แต่ฉันเลือกอันนี้เพื่อความเรียบง่าย Stack Cats เป็นแบบสแต็กและโปรแกรมนี้ใช้สแต็กเริ่มต้นเท่านั้น เนื่องจากเราไม่มีอินพุตใด ๆ จึงมีหนึ่ง-1
(เครื่องหมาย EOF) ที่ด้านบนของศูนย์อนันต์ คำสั่งทั้งสามในโปรแกรมมีความหมายดังนี้:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
ดังนั้นนี่คือวิธีที่โปรแกรมแก้ไขสแต็ก (สถานะและคำสั่งถูกเซเพื่อระบุวิธีที่แต่ละคำสั่งเปลี่ยนสแต็กจากสถานะหนึ่งไปเป็นสถานะถัดไป):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
มันจะเปิดออกคำสั่งเพียงแค่นั้นจริงๆจะเป็นอะไรที่นี่_
ซึ่งจะเปลี่ยนเครื่องหมาย EOF 1
ของเราเป็น เอาท์พุทในตอนท้ายของโปรแกรมเป็นนัยและเครื่องหมาย EOF เป็นตัวเลือกดังนั้นนี่เป็นเพียงแค่พิมพ์ออกมา1
เราได้รับ
ตอนนี้ถ้าเราย้อนกลับซอร์สโค้ดเนื่องจากการมิรเรอร์โดยนัยโปรแกรมจริงกลายเป็น:
_:-:-:_
สิ่งนี้แตกต่างอย่างมาก:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
คราวนี้ด้านล่างของสแต็คเป็นยังคงเป็น-1
จึงไม่ทำหน้าที่เป็นเครื่องหมาย EOF และเพียง-1
บนของมันได้รับการตีพิมพ์
...
ขณะนี้จากทั้งหมดที่กล่าวมาเนื่องจาก Stack Cats มีความสัมพันธ์ที่ไม่เหมือนใครกับรหัสการย้อนกลับฉันรู้สึกว่าการใช้-m
นั้นเป็นการโกงเล็กน้อย ปกติแล้วมันจะหมายถึงการบันทึกไบต์โดยการละเว้นส่วนที่ซ้ำซ้อนของซอร์สโค้ด แต่จริงๆแล้วมันทำให้การท้าทายนั้นง่ายขึ้นมากและแม้แต่โปรแกรมแบบเต็มก็จะสั้นลง นี่เป็นเพราะการย้อนกลับโปรแกรมเต็มรูปแบบจะเปลี่ยนโปรแกรมเฉพาะเมื่อมันมีสิ่งใดสิ่งหนึ่ง<>[]
ซึ่งหมายความว่าโปรแกรมจะใช้หลายสแต็ค (Stack Cats จริง ๆ แล้วมีเทปของสแต็กซึ่งทั้งหมดยกเว้นตอนแรกจะเต็มเท่านั้น ด้วยศูนย์เริ่มต้นด้วย) ยิ่งไปกว่านั้นการสลับมันก็แค่แลกเปลี่ยน<>
และ[]
จับคู่ซึ่งยังคงทำให้การประมวลผลสมมาตร วิธีเดียวที่จะทำลายความสมมาตรนั้นคือการใช้I
สิ่งที่ทำ-]
หรือ-[
หรือไม่มีอะไรขึ้นอยู่กับสัญลักษณ์ของด้านบนของสแต็ก ดังนั้น...
*|]I*:*I[|*
ลองออนไลน์! ส่วนท้ายอีกครั้งรวมถึงทางเลือกอื่น ๆ ทั้งหมดที่นับไบต์เดียวกัน เอาต์พุตเหล่านั้นบางส่วน 1 / -1 และเอาต์พุตบางส่วน 2 / -2 ตามที่ระบุหลังแต่ละโปรแกรม ฉันเลือกอันนี้เพื่ออธิบายแบบสุ่มว่าเป็นอันที่เอาท์พุท 2
ลองย้อนกลับ!
คำอธิบาย
อย่างที่ฉันพูดไปแล้ว แม้ว่าเราใช้-m
สัญกรณ์สำหรับสิ่งนี้มันจะมีน้ำหนักเป็น 6 ไบต์แทนที่จะเป็น 4 ด้านบน
คำสั่งที่ใช้ในครั้งนี้:
* 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.
โปรแกรมแรกใช้เพียงสองกอง มันค่อนข้างยุ่งที่จะทำในงานศิลปะ ASCII แต่ฉันจะพยายามทำให้ดีที่สุด เครื่องหมายวงเล็บเหลี่ยมระบุว่าสแต็กหัวเทปอยู่ที่ใดและฉันจะใส่คำสั่งระหว่างสถานะสแต็กแต่ละคู่
[-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
… …
ตอนนี้-1
ทำหน้าที่เป็นเครื่องหมาย EOF และ2
ได้รับการพิมพ์
โปรแกรมอื่น ๆ [
ที่เป็นแบบเดียวกันจน I
ก็ยังคงแทบจะเหมือนกันทุกทางจนสอง ในทางเทคนิคเราจะอยู่ในสแต็กที่แตกต่างกัน แต่หากไม่มีค่าบนมันพวกมันจะแยกไม่ออก แต่แล้วความแตกต่างระหว่างI[
และI]
จบลงที่สำคัญ:
*|[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
… … …
และในครั้งนี้เราไม่ได้มีเครื่องหมาย EOF -2
แต่โปรแกรมยังคงออกผลลัพธ์เป็น
-
(0x45 = 0b00101101) ทำงานใน Jelly --
ให้ผล -1 เพราะมันกำหนดตามตัวอักษร -1 ในขณะที่Ṇ
(0xB4 = 0b10110100) ให้ผลเป็น 1 เนื่องจากมันไม่ได้เป็นตรรกะ ของอินพุตโดยนัยของศูนย์ (แน่นอนṆ
ใช้ได้เหมือนกัน: p)