Растущая последовательность Куайна

18

Вы должны написать последовательность из 10 программ, p1 p2 ... p10которые удовлетворяют следующим свойствам:

  • pKпечатает pK+1на Kот 1 до 9
  • p10 печать p10
  • Когда первые Kпрограммы объединяются, результирующая программа p1...pKпечатается p1...pK.
  • Каждая программа pKдолжна быть больше в байтах, чем предыдущая программа pK-1.
  • Все программы должны быть на одном языке.
  • Разрешены встроенные функции цитирования (например, Qво многих языках).

Ваша оценка - это сумма байтов в 10 программах. Поскольку существует всего десять программ, вы должны сделать свои коды максимально короткими. Удачи.

Конор О'Брайен
источник
«Каждая программа pK должна иметь больший размер в байтах, чем предыдущая программа pK-1» - ну почему это странное требование?
Ника
6
@nicael Потому что это растущая последовательность Квина.
Конор О'Брайен
Почему p10 печатает сам, а не p11? Это делает проблему немного сложнее.
SuperJedi224
@ SuperJedi224 Потому что просто нет p11.
Конор О'Брайен
Этот вызов был бы намного интереснее, если бы встроенные функции квинирования были запрещены.
Деннис

Ответы:

15

Серьезно, 245 байтов:

Все десять программ объединены:

Q9ucQc8<WX#dXεj0WX.Q9ucQc8<WX#dXεj0WX.
Q9ucQc8<WX#dXεj0WX.

Q9ucQc8<WX#dXεj0WX.


Q9ucQc8<WX#dXεj0WX.



Q9ucQc8<WX#dXεj0WX.




Q9ucQc8<WX#dXεj0WX.





Q9ucQc8<WX#dXεj0WX.






Q9ucQc8<WX#dXεj0WX.







Q9ucQc8<WX#dXεj0WX.









Есть невидимые символы, которые становятся видимыми при выполнении, странное свойство байта 7F. Заменяющие строки в каждой программе важны. На самом деле, Seriously автоматически добавляет новые строки в свой вывод, хотите вы этого или нет. Это просто подсчитывает количество новых строк в выводе, и как только это число превышает 8, оно удаляет последний символ вывода. Таким образом, p1..pKбудет печатать p1..pKдля всех K> 4.

Q                                  Push source code.
 9uc                               Push \n
    Qc                             Push the number of times it appears in source code.
      8<                           Check if it appears more than 8 times.
        WX     0WX                 If so, run the included code.
          #dX                      Convert string to list, dequeue and discard a newline.
             εj                    Join list back into string.
                  .                Print and halt. (Invisible byte here.)
quintopia
источник
1
Интересный! Это действительно возможно.
Конор О'Брайен
7
Могу ли я дать объяснение лейк Ват каждый чар дуз
Seadrus
3
Следует отметить, что для этого используется встроенная функция квинтинга, Qкоторая выдвигает исходный код программы.
Мартин Эндер
(И далее отметил, что общая длина была бы где-то около 150 байтов больше без указанной встроенной функции.)
Quintopia
Встроенные функции квинтинга разрешены для этой задачи.
Конор О'Брайен
9

JavaScript (ES6), 985

function f(x){x<0||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(0);
 function f(x){x<1||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(1);
  function f(x){x<2||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(2);
   function f(x){x<3||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(3);
    function f(x){x<4||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(4);
     function f(x){x<5||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(5);
      function f(x){x<6||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(6);
       function f(x){x<7||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(7);
        function f(x){x<8||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(8);
         function f(x){x<9||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(9);

Я неправильно понял правила ранее, поэтому мой предыдущий ответ был неверным.

В этом используется подъем функций вместо подъема переменных, поэтому он не зависит от программы 10. На самом деле, я думаю, что это квинта для любой комбинации двух или более сцепленных программ.

Отказ от ответственности: сейчас действительно поздно, поэтому все вышеперечисленное может быть совершенно неверным.

GRC
источник
Я не думаю, что вам нужно alertиз-за функции вывода.
Mama Fun Roll
О, я вижу, неважно.
Mama Fun Roll
Вы можете удалить конечные точки с запятой, сэкономив 20 байтов. (Обязательно обновите строку шаблона внутри.)
Mama Fun Roll
1
@ ՊՓԼՃՐՊՃՈԲՍԼ Я думаю, что точки с запятой нужны для объединения, так как я не включаю символы новой строки.
grc
Тогда, неважно.
Mama Fun Roll
9

Javascript ES6, 1935 байт

Десять программ:

a=_=>{t=`a=${a};a()`;setTimeout(_=>alert(t.length>200?t:";".repeat(82)+'a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\\s)+g,"$0$1"):u)};a();'))};a()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*   */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*    */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*     */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*      */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*       */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*        */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*         */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*          */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
SuperJedi224
источник
4
На это красиво смотреть.
Конор О'Брайен
4
Все эти лишние точки с запятой только для того, чтобы программа 2 была длиннее, чем программа 1 ...
SuperJedi224
Не могли бы вы использовать регулярное выражение (\S)+и подстановку, $0$1чтобы сохранить несколько байтов?
Мартин Эндер
@ MartinBüttner Возможно, я попробую сегодня днем
SuperJedi224
2

𝔼𝕊𝕄𝕚𝕟 2, 214 символов / 334 байта

ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
 ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
  ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
   ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
    ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
     ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
      ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
       ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
        ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
         ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)

Try it here (Firefox only).

объяснение

ℹ)                // quine function: get source code
  đ ⬭ď9)          // are there 9 spaces in a row anywhere in the source?
        ?ℹ):      // if so, pass the source itself to implicit output
            ⬭+ℹ) // otherwise, add a leading space to the source and pass to implicit output

Программа рассчитывает поиск 9 пробелов подряд, что является количеством ведущих пробелов в 10-й программе. Если он находит совпадение, то выводится исходный код; в противном случае выводится исходный код, ведущий пробелом.

Mama Fun Roll
источник
Какую кодировку вы используете? Кажется, в кодировке ISO 8859-1 284 байта. Проверено здесь
Downgoat
Я использую UTF-8.
Mama Fun Roll
Я забыл, что это ESmin 2, поэтому я прочитал количество символов как «2214 символов»: P
Конор О'Брайен