Напишіть коротку машину часу


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 Виведіть його як рядок (тобто для STDOUT). Вам не потрібно реалізовувати копіювання нової програми у файл.
абсент

Під "нічого не вивести", ви маєте на увазі вихід наступної програми, але не (неіснуючий) рядок?
Мего

@Mega Так, це я мав на увазі.
абсент

Ви також можете додати program_n+1's у вихідний рядок, як, наприклад, [program_3, One]якщо це саме те, що ви хотіли б бачити. Якщо обидва виходи переходять до stdout, як їх розділити? Також дозволяється функція замість повних програм?
випадкова

Відповіді:


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

Пітон, 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} `) _____замініть \nфактичним новим рядком.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.