Генерация программ в увеличении размера


21

В этом задании вы напишите программу, которая выводит программу, которая в два раза длиннее исходной программы. Выведенная программа должна выводить новую программу программы удвоить свою длину.

Примеры

Если моя программа a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

правила

  • Нет встроенных модулей
  • В исходной программе должен быть хотя бы один байт
  • Последовательность должна теоретически работать бесконечно
  • Ваша программа не имеет права читать что-либо (файл, stdio)

Ваша оценка - это размер оригинальной программы.


Как насчет доступа к файлу путем чтения самого себя / доступа к месту, где содержится код?
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ, это не разрешено, поскольку это нарушило бы правила, которым я верю.
Downgoat

2
@ Doᴡɴɢᴏᴀᴛ правила quine рекомендуются тегом wiki, но не применяются автоматически
Martin Ender


Ответы:



8

JavaScript, 62 61 37 байт


Спасибо @ Doᴡɴɢᴏᴀᴛ за помощь!


Оригинал [37 байт]:

f=_=>'f='+'_'.repeat((10+f).length)+f

Ребенок [74 байта]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

Внук [148 байт]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


Альтернативно (с печатью на консоль и в виде полной программы):

Оригинал [61 байт]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Ребенок [122 байта]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Внук [244 байта]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



Как это устроено!

1.   f=_=>   Определите функцию f какconsole.log(...)

2.   ;f()   Запустите функцию f.

3.   (в функции f)  

  • console.log(...)   Распечатайте следующее:

    • f=   буквальный текст "f ="
    • ${'_'.repeat((0+f).length+5)   «_» повторяется для длины f, измененной для учета символов, не включенных в строковое выражение f
    • +f}   Стрификация функции f
    • ;f()   буквальный текст "; f ()"

Заметки

  • console.logнеобходимо, а не alertпотому, alertчто не очень хорошо работает с очень длинными строками (по крайней мере, на моей машине / в конфигурации браузера)
  • В _«ы вставляются имя ( не используется) параметр функции F, чтобы гарантировать , что они включены в stringification из ф.
  • Основное улучшение (кроме избавления от console.log) первого решения по сравнению со вторым: добавление 10к функции вместо 0преобразования ее в строку увеличивает длину на один байт, избавляя от необходимости добавлять 1 к длине впоследствии, сохраняя байт.

0+fтакже должен работать, чтобы привести функцию к строке
Downgoat

48 байтов:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat

@ Doᴡɴɢᴏᴀᴛ Забыл, что возвращение результата обычно приемлемо. Буду обновлять.
jrich

@ Doᴡɴɢᴏᴀᴛ На самом деле, поскольку написание ответов в качестве функций является общепринятым, должно ли решение даже вызывать функцию?
jrich

конечно, вы могли бы сделать
Downgoat

6

Минколанг 0,15 , 19 14 байт

"66*2-rIDdr$O.

Оригинал , ребенок , внук .

объяснение

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

То, что rделает бит между s, дублирует конечный период достаточно раз, чтобы выполнить критерий удвоения. .является символом «остановки программы», поэтому многие периоды в конце ничего не делают, кроме как быть там.



2

Python 3, 51 байт

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

Это включает в себя завершающий перевод строки.

Какие выводы:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

2

GolfScript, 11 байт

{: ".~"]}.~

Попробуйте онлайн!

Как работает исходный код

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

Если приведенный выше исходный код выполняется один раз, стек в конечном итоге

["" {: ".~"]} ".~"]

где пустая строка в начале соответствует начальному состоянию стека (пустой ввод).

Две копии исходного кода оставили бы окончательное состояние

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

и так далее.

Что произойдет дальше

После выполнения исходного кода интерпретатор делает следующее:

  1. Он оборачивает весь стек в массив и помещает этот массив в стек.

    Для единственной копии исходного кода стек теперь содержит

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Он выполняется putsс намерением распечатать упакованную стопку с последующей переводом строки.

    putsопределяется как {print n print}, поэтому он делает следующее.

    1. printпечатает свернутую копию стека без проверки его (т. е. без преобразования его в строковое представление). Это отправляет

      {: ".~"]}.~
      

      в STDOUT и выскакивает копию стека с вершины стека.

      Стек теперь содержит

      ["" {: ".~"]} ".~"]
      
    2. выполняет блок кода, который мы определили ранее.

      :начинается с сохранения ["" {: ".~"]} ".~"]в символе пробела, затем ".~"помещает себя ]в стек и оборачивает стек в массив.

    3. n выдвигает строку, состоящую из одного перевода строки.

      Стек теперь содержит

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. выполняется еще раз. Однако он был переопределен, когда мы вызывали его впервые, и теперь содержит массив, а не блок кода.

      На самом деле, это толкает ["" {: ".~"]} ".~"], оставляя стек как

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Наконец, printпечатает самый верхний элемент стека, не проверяя его, отправляя

      {: ".~"]}.~
      

      чтобы вывести.


1

𝔼𝕊𝕄𝕚𝕟, 26 символов / 36 байтов

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

Обратите внимание, что есть завершающий перевод строки.

объяснение

Стандартный Quine: ⟮ⒸⅩ222+ᶈ0

Модификации:

  • Используйте ôфункцию для вывода всех результатов вместо последних результатов (как это делается с использованием неявного вывода)
  • Используйте \u27ee⦃ᶈ0}\u27ef\nи закройте блок копирования, чтобы избежать конфликтов с последующими блоками копирования.
  • Используйте, ď2чтобы повторить строку дважды.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.