เขียนเครื่องย้อนเวลา


21

เขียนโปรแกรมที่รับอินพุตสตริงและเลขจำนวนเต็มnและเอาต์พุต:

  1. สตริงที่ส่งผ่านไปยังโปรแกรมnครั้งที่ผ่านมา;
  2. โปรแกรมใหม่ที่จะใช้สำหรับการร้องขอครั้งต่อไป

คุณไม่สามารถจัดเก็บข้อมูลใด ๆ นอกโปรแกรมและโปรแกรมของคุณไม่สามารถเรียกโปรแกรมก่อนหน้านี้ในเครือ หากไม่มีสตริงเอาท์พุทสตริงว่าง (แต่ยังคงเอาท์พุทโปรแกรมถัดไป)

ตัวอย่างการรันที่ฉันใช้สัญกรณ์program_nสำหรับแต่ละโปรแกรมที่ต่อเนื่อง (แน่นอน[This text is the nth program]จะถูกแทนที่ด้วยรหัสจริง)

$ program_1 "One" 1
[This text is the second program]
$ program_2 "Two" 1
One
[This text is the third program]
$ program_3 "Three" 2
One
[This text is the fourth program]
$ program_4 "Four" 2
Two
[This text is the fifth program]
$ program_5 "Five" 1
Four
[This text is the sixth program]

รหัสโปรแกรมใหม่ควรเป็นเอาต์พุตหรือไม่? หรือมันควรจะถูกบันทึกไว้ในไฟล์และชื่อไฟล์ที่ส่งออก?
Mego

@ Like ส่งออกมันเป็นสตริง (นั่นคือเพื่อ STDOUT) คุณไม่จำเป็นต้องใช้การคัดลอกโปรแกรมใหม่ไปยังไฟล์
absinthe

โดย "output nothing" คุณหมายถึงเอาท์พุทโปรแกรมถัดไป แต่ไม่ใช่สตริง (ไม่มีอยู่จริง) หรือไม่?
Mego

@ ล้านใช่นั่นคือสิ่งที่ฉันหมายถึง
absinthe

คุณสามารถเพิ่มprogram_n+1's' ลงในบรรทัดเอาท์พุทเช่น[program_3, One]ถ้าเป็นสิ่งที่คุณต้องการดู หากเอาต์พุตทั้งสองไปที่ stdout ควรแยกกันอย่างไร ฟังก์ชั่นอนุญาตให้ใช้แทนโปรแกรมเต็มรูปแบบได้หรือไม่
randomra

คำตอบ:


4

CJam, 25

L{\_l~(>1<lN+a@+`@"_~"}_~

ลองออนไลน์

คำอธิบาย:

L      push an empty array (this is the array of previous strings)
{…}    push this block
_      duplicate the block
~      execute the 2nd copy (the stack contains the array and the block)

บล็อก:

\      swap the array with the block
_      duplicate the array
l      read a line from the input (containing the integer n)
~(     evaluate n and decrement it
>      slice the array starting at that position
1<     slice the resulting array to keep only the first string (if any)
l      read the 2nd line from the input (containing the string)
N+     append a newline
a      wrap in an array
@      bring the previous array to the top
+      concatenate the arrays, thus prepending the new string
`      convert the array to its string representation
@      bring the block to the top
"_~"   push this string

ในตอนท้ายสตริงที่ร้องขอ (ถ้ามี) การเป็นตัวแทนของอาร์เรย์บล็อกและสตริง "_ ~" จะถูกพิมพ์โดยอัตโนมัติ


2

Python 221 ไบต์

import sys
o,p=[''],r'import sys;a,o,p=int(sys.argv[2]),[{2},{0}],{1};print o[a] if len(o)>a else "","\n",p.format(`sys.argv[1]`,`p`,",".join(`s`for s in o))'
print '\n',p.format(`sys.argv[1]`,`p`,','.join(`s`for s in o))

หากต้องการทดสอบสิ่งนี้อย่างง่ายดายให้ใช้./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>โดยทำซ้ำบิตสุดท้ายหลาย ๆ ครั้งตามที่คุณต้องการ


2

Python 2, 207 ไบต์

def r(O,R):import sys,marshal as m;a=sys.argv;b=int(a[2]);O.extend(["",""]*b);O[b]=a[1];print"%s\nfrom marshal import*;c=%r;i=lambda:0;i.__code__=loads(c);i(%r,i)"%(O[0],m.dumps(R.__code__),O[1:])
r([""],r)

สร้างด้วยควินอื่นของฉัน แต่เปลี่ยนโปรแกรมงานนี้ง่ายกว่าดังนั้นฉันจึงสามารถตีกอล์ฟต่อไปได้ หากฉันสามารถรับอินพุตไปยัง stdin ได้ควรจะสั้นกว่านี้มาก


0

Javascript ES6, 130 128 121 120 113 ไบต์

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()

ลงไปที่ 87: a = []; b = _ => (a.push (prompt ()), [a [a.length-prompt () - 1] || "", a = ‌ [$ { a}]; b = $ {b}; b () `]); b ()
Mama Fun Roll

โอ้ มันจะเป็นอย่างไร มันคือ 66 ไบต์: a = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = [$ { a}]; b = $ {b} `) _____replace \nพร้อมกับ newline จริง
Mama Fun Roll

จากนั้นลองa = [], b = (x, y) => (a.push (x), `$ {a [a.length-y-1] ||" "} \ na = $ {JSON.stringify (a)}; b = $ {b} `)ซึ่งจะทำให้คุณอยู่ที่ 80 ไบต์ (หลังจากแทนที่ \ n แน่นอน) (หากคุณยังคงมีปัญหากับรหัสของฉันอาจเป็นข้อมูลโค้ด REPL ฉันมีคำแนะนำอื่น ๆ : P)
Mama Fun Roll

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