ไม่เลวสำหรับ tarpit ทัวริงที่ค่อนข้างละเอียด ...
N
Count i while _%128-9 {
Count x while _/128%2 {
Write 40
_+128
}
Write _%128
_+128-_%128+N
}
Count j while _/256-j {
Write 41
}
(ใช่ช่องว่างทั้งหมดนั้นเป็นข้อบังคับ)
หมายเหตุ:เนื่องจากข้อ จำกัด การป้อนข้อมูลของAcc !! มันเป็นไปไม่ได้ที่จะอ่านสตริงของตัวละครโดยไม่ต้องมีตัวคั่นที่สิ้นสุด ดังนั้นโปรแกรมนี้คาดว่าอินพุต (บน stdin) เป็นสตริงตามด้วยอักขระแท็บ
Acc !! ?
เป็นภาษาที่ฉันสร้างขึ้นซึ่งดูเหมือนจะใช้ไม่ได้เท่านั้น เพียงชนิดข้อมูลเป็นจำนวนเต็มเท่านั้นสร้างการควบคุมการไหลเป็นห่วงและวิธีเดียวที่จะเก็บข้อมูลเป็นสะสมเดียวCount x while y
_
อินพุทและเอาท์พุททำได้ครั้งละหนึ่งตัวอักษรโดยใช้ค่าพิเศษN
และWrite
คำสั่ง แม้จะมีข้อ จำกัด เหล่านี้ฉันค่อนข้างแน่ใจว่าAcc !! ทัวริงเสร็จสมบูรณ์
คำอธิบาย
กลยุทธ์พื้นฐานในAcc !! การเขียนโปรแกรมคือการใช้ mod %
และการหารจำนวนเต็มในการแบ่ง/
พาร์ติชั่นของคอนเซปต์ช่วยให้สามารถเก็บค่าได้หลายค่าในครั้งเดียว ในโปรแกรมนี้เราใช้สามส่วนดังกล่าวลำดับที่เจ็ดบิตต่ำสุด ( _%128
) เก็บรหัส ASCII จากอินพุต; บิตถัดไป ( _/128%2
) เก็บค่าแฟล็ก และบิตที่เหลืออยู่ ( _/256
) นับจำนวนโคลสอัพที่เราต้องการ
อินพุตในACC !! มาจากค่าพิเศษN
ซึ่งอ่านตัวเดียวและประเมินเป็นรหัส ASCII คำสั่งใด ๆ ที่ประกอบด้วยการแสดงออกเพียงอย่างเดียวจะกำหนดผลลัพธ์ของการแสดงออกนั้นให้กับผู้สะสม ดังนั้นเราเริ่มจากการเก็บรหัสตัวละครตัวแรกไว้ในตัวสะสม
_%128
จะจัดเก็บอักขระที่อ่านล่าสุด ดังนั้นลูปแรกจะทำงานในขณะที่_%128-9
ไม่ใช่ศูนย์ - นั่นคือจนกระทั่งอักขระปัจจุบันเป็นแท็บ
ภายในวงเราต้องการพิมพ์(
เว้นแต่ว่าเราจะทำซ้ำครั้งแรก ตั้งแต่ACC !! ถ้าไม่มีคำสั่งเราต้องใช้ลูปสำหรับเงื่อนไข เราใช้ตัวสะสม 128 บิต_/128%2
เป็นค่าสถานะ ในรอบแรกสิ่งเดียวในแอคคูมูเลเตอร์คือค่า ASCII <128 ดังนั้นการตั้งค่าสถานะจึงเป็น 0 และข้ามการวนซ้ำ ในทุก ๆ รอบที่ผ่านมาเราจะทำให้แน่ใจว่าการตั้งค่าสถานะเป็น 1
ภายในCount x
ลูป (เมื่อใดก็ตามที่ตั้งค่าสถานะเป็น 1) เราเขียน paren แบบเปิด (ASCII 40
) และเพิ่ม 128 ลงในแอคคิวมูเลเตอร์เพื่อตั้งค่าสถานะเป็น 0 และออกจากลูป สิ่งนี้ยังเกิดขึ้นกับการเพิ่มค่าของ_/256
ซึ่งเราจะใช้เป็นจำนวนของ parens ใกล้เคียงของเราที่จะส่งออก
_%128
โดยไม่คำนึงถึงความคุ้มค่าของธงที่เราเขียนถ่านป้อนข้อมูลล่าสุดซึ่งเป็นเพียง
การมอบหมายครั้งต่อไป ( _+128-_%128+N
) ทำสองสิ่ง ขั้นแรกโดยการเพิ่ม 128 จะตั้งค่าสถานะสำหรับครั้งต่อไปผ่านการวนซ้ำ ประการที่สองมันเป็นศูนย์ออกจาก_%128
สล็อตอ่านตัวละครอื่นและเก็บไว้ที่นั่น จากนั้นเราวนซ้ำ
เมื่อCount i
วงออกมาเราเพิ่งอ่านอักขระแท็บและค่าแอคคูเลเตอร์จะแยกออกเป็นดังนี้
_%128
: 9
(อักขระแท็บ)
_/128%2
: 1
(ธง)
_/256
: จำนวนตัวอักษรที่อ่านลบ 1
(ลบ 1 เป็นเพราะเราเพิ่ม 128 เพียงตัวสะสมหนึ่งครั้งในระหว่างการส่งผ่านครั้งแรกผ่านลูปหลัก) สิ่งที่เราต้องการในตอนนี้คือการปิดภาพ Count j while _/256-j
ลูป_/256
หลายครั้งเขียนคำสั่งปิด (ASCII 41
) ในแต่ละครั้ง Voila!