Створення програм у збільшенні розміру


21

У цьому виклику ви напишете програму, яка виводить програму, яка вдвічі перевищує довжину вихідної програми. Виведена програма повинна вивести нову програму, програма вдвічі перевищує її довжину.

Приклади

Якщо моя програма a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Правила

  • Немає вбудованих квітин
  • Оригінальна програма повинна мати принаймні один байт
  • Послідовність теоретично повинна працювати нескінченно
  • Вашій програмі заборонено читати з нічого (файл, stdio)

Ваш бал - це розмір оригінальної програми.


Як щодо доступу до файлу, читаючи сам / отримуючи доступ до місця, де міститься код?
Conor O'Brien

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

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})()`)()
Пуховик

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

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

Зрозуміло, ти міг би зробити
Пуховик

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

Що розряд між rs робить, це дублювати кінцевий період достатньо разів, щоб виконати критерій подвоєння. .є символом "програми зупинки", тому багато періодів наприкінці нічого не роблять, крім того, щоб бути там.



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).

Зауважте, що існує зворотний новий рядок.

Пояснення

Стандартна квітка: ⟮ⒸⅩ222+ᶈ0

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

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