Куайн на каждой линии


30

Ваша цель - создать программу, которая печатает себя бесконечно, с новой строкой после каждой. Таким образом, если ваша программа однострочная, она будет повторяться на каждой строке вывода.

пример

Программа:

A

Выход:

A
A
A
...

правила

  • Это должна быть полная программа, а не фрагмент или функция.
  • Программа должна зацикливаться всегда без переполнения стека или ошибок предела рекурсии.
  • Выход на стандартный вывод или ближайшую альтернативу.
  • Ввод программы не принимается.
  • Стандартные лазейки запрещены, такие как открытие файла программы или доступ к внешнему ресурсу. Пустые программы запрещены как стандартные лазейки.
  • Если код вашей программы заканчивается завершающим символом новой строки, это не считается необходимой новой строкой между кавычками, и вы должны напечатать другую.
  • - выигрывает короткий код!

Название выглядит как только однострочные программы квалифицируются?
Паŭло Эберманн

@ PaŭloEbermann Тогда прочитайте описание проблемы. Это остроумное название, потому что оно рифмуется. Вот пример допустимой многострочной программы: codegolf.stackexchange.com/a/57985/34718 . Вы не можете ожидать, чтобы знать все о проблеме, только читая название.
mbomb007

@ PaŭloEbermann Это просто while(1)println(your_code);
Мэтью Ро,

Ответы:


19

Деление, 7 байт

'!+!NR"

Довольно простая модификация самой короткой квинны деления, которую я нашел до сих пор : я просто использую неразрушающий !вместо Oи добавил Nдля новой строки.

В общем, вот как это работает: поток управления начинается Rс правого атома. "переключает строковый режим, что означает все, пока не "будет напечатано следующее : в этом случае '!+!NR. Это оставляет "и новую строку для печати. '!устанавливает массу атома равной 33, +увеличивает ее до 34 (код символа ") и !печатает кавычку. Nпечатает новую строку, и Rтеперь в этом случае не используется, поэтому цикл начинается заново.

Следующее 7-байтовое решение также работает:

"NR'!+!

9

> <> , 16 байт

'ard3*o50l2)?.~~

Традиционная> <> quine использует слишком много os, поэтому мы используем цикл для печати. Перед каждым прыжком мы нажимаем 5 и 0 (координаты, куда нужно перейти), после чего мы либо прыгаем, .если еще есть что напечатать, либо выталкиваем два верхних значения с ~~.

(Вернулся к 16 версии, так как я забыл о правиле переполнения стека.)


Альтернатива есть "ar00go50l2)?.[, правда?
mbomb007

3
@ mbomb007 Я думаю, но я предпочитаю, d3*так как gчитает ваш собственный исходный код
Sp3000

8

CJam, 13 байтов

{_o"_g
"o1}_g

Онлайн-интерпретатор ничего не печатает до завершения программы, поэтому вам придется проверить это в интерпретаторе Java.

объяснение

Наконец обобщенная квиня CJam, которая не заканчивается _~.

{_o"_g
"o1}

Это просто толкает блок. _gдублирует блок и выполняет его несколько раз, пока вершина стека верна (исключая условие).

Теперь внутри блока другая копия блока все еще находится в стеке. Мы дублируем и печатаем его с помощью, _oа затем печатаем, _gза которым следует новая строка (требуемая дополнительная новая строка между квинусами) с "_g\n"o. Наконец, мы помещаем a 1в стек для повторения цикла, потому что, к сожалению, блоки не являются истинными (или ложными) в CJam.


7

Python 2, 39

Не очень интересная задача в Python, так как добавить цикл while в обычный quine просто.

c='while 2:print"c=%r;exec c"%c';exec c

Разве это не взорвать стек?
Джезан Фафон

1
@JesanFafon Нет, если вы попробуете это, вы увидите, что это не так. Там нет рекурсии.
feersum

6

Perl 5.10+, 40 37 байт

$_=q{say"\$_=q{$_};eval"while 1};eval

или (также 37 байт)

$_=q{{say"\$_=q{$_};eval";redo}};eval

Вызывать с флагом -M5.010или -Eкомандной строки, например,

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

Спасибо Ильмари Каронен за то, что он сбрил 3 байта из моего оригинального решения, которое было:

eval while$_=q{say"eval while\$_=q{$_}"}

Это, а также более короткие 37-байтовые решения, приведенные выше, являются простыми вариантами следующей квинны, которую я впервые увидел в одном из других постов Ильмари :

$_=q{say"\$_=q{$_};eval"};eval

Поскольку все, что я добавил в свое первоначальное решение, было whileциклом, он действительно заслуживает большей части кредита. :-)


Хорошо, и спасибо за кредит. :-) Первоначально Quine - это мой собственный дизайн, хотя кто-то другой, возможно, самостоятельно обнаружил его раньше. Кстати, $_=q{say"\$_=q{$_};eval"while 1};evalили $_=q{{say"\$_=q{$_};eval";redo}};evalбудет на несколько байт короче. ( $_=q{say"\$_=q{$_};eval";eval};evalбыло бы еще короче, но я подозреваю, что в конечном итоге он выйдет из стека.)
Илмари Каронен

Я надеялся, что ты придешь! Спасибо за более короткие решения, я подумал, что вы придумаете что-то лучшее; но я был так потрясен этим, когда увидел это в ответе, с которым связался, я просто должен был попробовать это сам. :) Честно говоря, я до сих пор не совсем обернул голову вокруг киви, но дополнительные ответы дают мне больше взгляда. Я не был уверен, что вы это создали, потому что я видел, что вам приписывают самый короткий не читерский Perl-квин когда-либо (?!) на этой странице , но нет никакой ссылки на этот квин-код (используя printвместо say).
ThisSuitIsBlackNot

Кстати, последний действительно делает Segfault после запуска в течение некоторого времени. Еще раз спасибо, @Ilmari!
ThisSuitIsBlackNot

На самом деле, я немного забираю это - я определенно не первый, кто изобрел эту квину , и, поскольку я определенно видел ее раньше (я написал ту, на которую я претендую, заслуживаю кредит в той же ветке), вполне вероятно, что я подсознательно запомнил это из этой темы или откуда-то еще.
Илмари Каронен

Хорошо, я оставил происхождение не указано. В любом случае, спасибо за 3 байта и спасибо за оригинальное вдохновение.
ThisSuitIsBlackNot

5

Самомодифицирующийся Brainf *** (SMBF) , 14 байтов

Конечный \nсимвол новой строки должен быть литералом, Unix, символом новой строки (код ASCII 10).

[<[<]>[.>]<.]\n

Объяснение:

Код перемещает указатель в крайний левый угол своего исходного кода, а затем печатает все это, включая символ новой строки (дважды b / c правила). Цикл продолжается.


Вы имеете в виду, это должно быть \r?
Исмаэль Мигель

@IsmaelMiguel No. \n- это новая строка, представляющая собой код ASCII 10, так что шестнадцатеричный дамп исходного кода будет иметь значение 0Aдля этого байта. code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel Не правда. Когда вы набираете код, вы нажимаете клавишу ввода для новой строки. \nобычно считается как 2 символа и 2 байта в вашем коде. Я набрал его таким образом для удобства чтения, так как форматирование не очень хорошо для отображения пустой строки в конце моего исходного кода. И поэтому я должен был указать, что это ОДИН байт, а не два.
mbomb007

2
\nвсегда один символ, называемый перевод строки . Новая строка , однако, является зависимой от платформы последовательностью байтов.
Деннис

2
@ Денис Может быть и так, но мне все равно. Я не называю /"Солидус", и я не знаю никого, кто это делает. «Новая строка» начинается с nсимвола «escape», и это я так называю. Это ближе к «переводу строки», чем к «возврату каретки».
mbomb007

3

PowerShell, 143 байта

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

Исходя от Rosetta кода PowerShell Куайна , я абсолютно уверен , что это не самый короткий. Форматирование замены строк в PowerShell является странным для этого, потому что те же разделители для того, где помещать замены, {}также разделяют блоки кода while{}, поэтому мы должны использовать [char]приведение, которое раздувает код кучу.


3

Недогрузка, 25 байт

В первый раз я попробовал что-то подобное, и я не уверен, что следует всем правилам, так как это пара строк. Новая строка была немного болезненной.

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 Выход за одну итерацию - две строки программы. Я проверял это здесь
MickyT

3

Befunge , 30 20 байт

<,+55,*2+98_ #!,#:<"

Вариант популярного quine befunge, который выводит новую строку и выскакивает -1 в стеке, если он заканчивает строку.
К сожалению, Befunge становится многословным, когда делаешь в одну строку. Я попытался удалить все панели запуска ( #), которые мог, но некоторые пришлось оставить, чтобы пропустить определенные команды (например ,).

Изменения:

30-20 -> изменил базовую квину на собственную, которая использует строковый ввод. Таким образом, ветвление намного проще.

Старый:

:0g,:93*`>0-10 #,+$#: #5 _1+>

Я не думаю, что это оптимально, но сейчас это приемлемо.


Вы можете использовать инструкцию get, чтобы получить пробел и добавить 2 к нему на один байт короче 98+2/: <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast

И сначала нажмите цитату и символ новой строки и переверните принтер,-1g0:+5<>:#,_1"
Джо Кинг,


2

R, 34 байта

repeat{write(commandArgs()[5],'')}

вызывать из командной строки следующим образом:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 байт

Простая модификация традиционной > <> квин .

"ar00gc0.0+efooooooooooooooo|

Чтобы запустить, вставьте его здесь , нажмите «Отправить», затем «Пуск» (работа без анимации не работает). Не стесняйтесь увеличивать скорость исполнения.


"ar00gc0.0+feooooooooooooooo|на два байта короче.
Коул

@ Кол, спасибо. Я думал о зеркале, но забыл изменить его после того, как меня отвлекли на другой вызов.
mbomb007


@JoKing Уже есть более короткое> <> решение .
mbomb007


2

GolfScript, 16 байт

{.".do
":n\p}.do

В итоге это выглядело как запись CJam Мартина Бюттнера . Интересной особенностью является то, что, как выясняется, самый короткий способ добавить ".do"блок к выводу, когда он напечатан, - это присвоить его разделителю строки n. (Конечно, нам также нужно включить в строку реальный символ новой строки, чтобы заменить тот, который nобычно содержится.) Та же самая строка (правда в GolfScript) также остается в стеке, чтобы doцикл отключился, гарантируя, что цикл работает вечно


1

BASH, 76 байт

Просто не удержался, особенно с PowerShell здесь :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

Пробел важен для ТОЧНОЙ копии.


1

Javascript (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

В качестве альтернативы (также 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

Разве альтернатива не вызовет переполнение стека?
Патрик Робертс

Нет, рекурсии нет, поэтому ничего не должно складываться в стеке.
DankMemes

Хорошо, я только что проверил их оба, вы правы насчет альтернативного решения, но ваше первое решение не помогло, и я понял, почему. Согласно документации MDN о функциях стрелок , «функции стрелок не предоставляют объекту аргументов свой код», поэтому ваш файл arguments.calleeне существует и выдает ошибку.
Патрик Робертс

Интересный. Для меня в Firefox Developer Edition 42.0a2 (2015-09-13) оба работают. Я думаю, как только стандарт будет принят, первый перестанет работать.
DankMemes

Я проверил их на последнем Chrome, так как я пытался использовать ваше первое решение !вместо того, чтобы заключать в скобки и помещать выполнение функции после цикла for, чтобы избежать необходимости в теле точки с запятой цикла, которая сохранит (я думаю) 4 байта
Патрик Робертс

1

Microscript , 22 байта

"f1{CqxCanx"f1{CqxCanx

На основе Куайного из статьи Esolangs: "fCqxah"fCqxah. Использует тот факт, что язык автоматически добавляет закрывающие скобки по мере необходимости, без чего это будет на два байта длиннее.


1

Пакет, 10 (+ 4 для длины имени файла)

Не уверен, что это соответствует двум причинам:

  • Технически, могут быть или не быть текстовые побочные эффекты от командной оболочки Windows, поскольку это зависит от того, как она настроена.
  • Эта программа вызывает себя по имени, и я не уверен, запрещено ли это правилами (в частности, правилом «нет открытия файла программы»). Он не раскрывается для чтения и распечатки текста; это просто повторный запуск самого себя. Кроме того, структура файловой системы является неотъемлемой частью пакетных сценариев старой школы (часто даже используемых для хранения состояния программы и т. Д.). Поэтому я не уверен, нарушает ли это 5-е правило или нет.

Код (для программы с именем q.bat):

echo on&&q

2
Я получу, я позволю это, так как это не самое короткое, и это творческий и уникальный. И это не чтение исходного кода, а выполнение себя.
mbomb007,

1
Поскольку имя файла не является произвольным, по крайней мере, вы должны добавить имя файла к числу байтов.
Мартин Эндер

1
Я полагаю, вы могли бы использовать, echo on&&%0хотя я боюсь попробовать.
DankMemes

1
Обновление: echo on&&%0не работает. %0отображается как развернутый в выходных данных, и окна (7, 32-разрядные, работающие в виртуальной машине) завершают все это довольно быстро
DankMemes

1
Я думаю, что вы можете опустить .batчасть
SuperJedi224

1

Цейлон , 210 208 байт

Конечно, это ничего не выиграет ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Оригинал:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Я изменил мой Quine от двух дней назад , добавив while(true){...}цикл, так что я пришел от 185 байтов простого Quine к 210 (мне больше не нужен символ новой строки в конце). Но потом я обнаружил, чтоwhile(1<2){...} цикл на два байта короче:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(Цейлон не имеет for(;;)цикла, подобного Java, и для этого цикла также необходимы скобки.)


1

PowerShell, 132 107 байт

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

Основанный на Rosetta Quine (такой же, как @AdmBorkBork), хотя не использует форматирование для замены строк ... может быть, лучше было бы переключиться на цикл for и использовать форматирование?

Я уверен, что если AdmBorkBork вернется, они сильно побьют это: P

РЕДАКТИРОВАТЬ Выяснил для цикла и замены, все благодаря моему предшественнику :)

Старая попытка:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10, 194 байта

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

Объяснение:

Попробуйте онлайн (время ожидания через 60 секунд).

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

-part:

  • Строка sсодержит неформатированный исходный код.
  • %sиспользуется для ввода этой строки в себя с помощью s.format(...).
  • %c, %1$cИ 34используются для форматирования двойных кавычек.
  • s.format(s,34,s) складывает все вместе

Задание часть:

  • for(;;) используется для цикла до бесконечности.
  • System.out.println(...) используется для печати с новой строкой





1

Брахилог , 16 байт

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

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

Брахилог , 18 байт

∋"∋~kgjw₁⊥~n"gjw₁⊥

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

Приспособленный от альтернативной версии этого quine , с взломом отступления, который я первоначально разработал для bogosort всех вещей. Тратит два байта, ~nпотому что (обычное средство для печати с завершающим символом новой строки) решает некоторые странные проблемы с кодировкой символов в TIO, и фактический символ новой строки, вставленный в строковый литерал, печатается ~kкак \n.

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

Поскольку w₁принимает входные данные в виде списка [string to be formatted, formatting arguments], обертывание строки в списке с gпоследующим объединением ее с самим собой jпозволяет форматировать ее самостоятельно. И поскольку программа не вводит никаких данных, входная переменная, которая неявно присутствует в начале программы, может принимать любое значение, поэтому она может быть ограничена одним из бесконечного множества списков, которые содержат "∋~kgjw₁⊥~n"в качестве элемента, создавая единый элемент. пункт выбора, к которому следует вернуться, когда после печати его источника программа попадет .



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.