ควินเปลี่ยนรูปแข็งตัว


15

งานของคุณคือการสร้างโปรแกรมที่พิมพ์แหล่งที่มาของมันเอง

"เฮ้เรามีความท้าทายนี้อยู่แล้วและมีการเปลี่ยนแปลงมากมาย! ทำไมคุณถึงสร้างอีกครั้ง" คุณอาจถาม แต่อันนี้จะเป็นหนึ่งในคนที่ยากที่สุด (หวังว่าต่อไป)

ควินของคุณจะต้อง "กลายพันธุ์แข็ง" ซึ่งหมายถึงควินแม้ว่าตัวละครตัวใดตัวหนึ่งของมันจะถูกทำซ้ำในสถานที่จะต้องส่งออกซอร์สโค้ดของโปรแกรมต้นฉบับ

ตัวอย่างเช่นถ้าคุณมีควินิน (ตัวอย่างต่อไปนี้ไม่ได้เขียนในภาษาใด ๆ มันเป็นเพียงรหัสเทียม):

abcd

โปรแกรมเหล่านี้จะต้องส่งออกทั้งหมดabcd:

aabcd
abbcd
abccd
abcdd

(ในแต่ละโปรแกรมเหล่านั้นa, b, cและdจะซ้ำกันในแต่ละสถานที่ซึ่งหมายถึงตัวละครซ้ำถูกวางโดยตรงหลังจากที่ตัวละครเดิม.)

กฎ:

  • ใช้กฎมาตรฐานควินิน
  • อักขระหลายไบต์นับเป็นอักขระเดียวและอักขระไม่ได้ "แยก" เป็นไบต์ที่เกี่ยวข้องเมื่อทำซ้ำ

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


สิ่งนี้นับหรือไม่ 0และ00ใน CJam 0ทั้งการส่งออก
geokavel

ไม่0ไม่เป็นควินที่เหมาะสม
Dennis

2
ฉันคิดว่ามันน่าสนใจมากเมื่อใช้รหัสโบวลิ่ง
Mr. Xcoder

ปัญหาของการกลายพันธุ์ของรหัสสามารถแก้ไขได้โดยทั่วไปหรือไม่ เว้นแต่ว่าการกลายพันธุ์เกิดขึ้นกับตัวละครภายในสตริงที่ยกมามันมักจะทำให้โปรแกรมเสียหาย
hasen

ชื่อไม่ได้ทำให้เข้าใจผิดเล็กน้อยใช่หรือไม่ "การกลายพันธุ์" เป็นการแนะนำการแก้ไขตัวละครไม่ใช่การทำซ้ำ
Luis Mendo

คำตอบ:


18

> <> , 56 ไบต์

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

ลองออนไลน์! หรือตรวจสอบการกลายพันธุ์ทั้งหมด

โปรแกรมต้นฉบับทำงานอย่างไร (ล้าสมัย)

ล่ามเริ่มต้นในเซลล์(0, 0) ^กำหนดทิศทางที่จะขึ้นไปเพื่อให้การเรียนการสอนชี้ (IP) ล้อมรอบเซลล์(0, 20)

'เปิดใช้งานโหมดสตริง: จนกว่า'จะพบสิ่งต่อไปตัวละครทั้งหมดภายใต้ IP จะถูกผลักลงบนสแต็ก เช่นเดียวกับที่'พบอีกครั้งหลังจากที่ห่อรอบ ๆ ดังนั้นเราจึงผลักดัน

d3*}^^:84*=?~oao0f.^

ทรัพย์สินทางปัญญาที่(0, 19)ยังคงขึ้นไป การดำเนินการd3*}กด13 = 0xdจากนั้น3คูณทั้งสองค่า ( 39 / คำพูดเดี่ยว ) จากนั้นหมุนสแต็กไปทางขวา ใบนี้ออกจากสแต็กดังนี้

'd3*}^^:84*=?~oao0f.^

คำแนะนำสองข้อถัดไป ( ^) ไม่ได้ทำในจุดนี้

:84*=ซ้ำด้านบนของสแต็คผลัก8และ4คูณพวกเขา ( 32 / พื้นที่ ) จากนั้นทดสอบตัวละครซ้ำกันเพื่อความเท่าเทียมกันกับพื้นที่ สำหรับโปรแกรมที่ไม่มีการเปลี่ยนแปลงนี่จะเป็น0เสมอ

?ข้ามคำสั่งถัดไปหากส่วนบนสุดของสแต็กเป็นเท็จ สำหรับโปรแกรมดั้งเดิมมันจะเป็นเช่น~นั้นเสมอดังนั้นจึงถูกข้ามไป

oaoปรากฏและพิมพ์ด้านบนของสแต็ค, ดัน10 / เลื่อนบรรทัดแล้วปรากฏและพิมพ์เลื่อนบรรทัด

ในที่สุดก็0f.กระโดดไปที่เซลล์(0, 15) (ล่างสุด^) เริ่มต้นด้วยตัวละครต่อไปในกอง

เมื่อสแต็กว่างเปล่ารหัสต้นฉบับทั้งหมดจะถูกพิมพ์ :จะล้มเหลวและโปรแกรมออก

โปรแกรมที่กลายพันธุ์ทำงานอย่างไร (ล้าสมัย)

การทำสำเนาอักขระที่ไม่ใช่บรรทัดการป้อนซ้ำจะเป็นการขยายโปรแกรมในแนวนอนเท่านั้น เนื่องจากโปรแกรมถูกดำเนินการในแนวตั้งคำแนะนำพิเศษเหล่านี้จะไม่ถูกดำเนินการ

โรเนียวเลื่อนบรรทัดใด ๆ ก่อนที่ bottomost ^จะเปลี่ยนเซลล์(0, 14)และ(0, 15)เพื่อ(0, 15)และ(0, 16) 0f.ตอนนี้จะข้ามไปที่เซลล์ก่อนหน้าสุด^ซึ่งก็คือ a ^ดังนั้นโปรแกรมจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง

ในที่สุดตัวอักษร linefeed ใด ๆ ที่ซ้ำกันก็จะเปลี่ยนสตริง เส้นสั้น ๆ ที่เต็มไปด้วยช่องว่างดังนั้น32 / ช่องว่างจะถูกแทรกในตำแหน่งของ linefeed 84*=จะผลัก1สำหรับพื้นที่ดังนั้น?อย่าข้ามคำสั่งถัดไป ในกรณีนี้~จะปรากฏขึ้นและละทิ้งพื้นที่ดังนั้นต่อไปนี้oจะพิมพ์ตัวอักษรเหนือช่องว่างแทน


คุณสามารถทำซ้ำบรรทัดใหม่และมันจะยังคงทำงาน
Dennis

3
โอ้ฉันไม่ได้อ่านโพสต์อย่างถูกต้อง: P (Dammit เดนนิสทำไมคุณถึงดีจัง)
clismique


@ jimmy23013 ควรได้รับการแก้ไข
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.