Прерывающие сигнал квины


12

Quining имеет долгую историю - если вы еще не слышали о ней, щелкните по метке и прочитайте немного о ней.

Твое задание

Выведите бесконечную серию 1s (без других пробелов [переводы строки, пробелы и т. Д.)). UNTIL SIGINT (обычно CTRL-C) вызывается. Когда он вызывается, выведите исходный код программы.

правила

  • Это должен быть действительный квин:
  • Вы можете использовать любой язык.
  • Поскольку это кодовый гольф, выигрывает самый короткий ответ!


@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Это действительно здорово. Я не уверен, что приму это, потому что он не выводит источник в конце, он просто перестает выводить источник.
Эддисон Крамп

1
Откуда вы знаете, что последний символ не является программой, выводящей его источник? : P (в любом случае, это
шутливый

1
¯ \ _ (ツ) _ / ¯ API, может быть?
Эддисон Крамп

Ответы:


4

Python 3, 76 байт

s="while 1:\n try:print(end='1')\n except:-print('s=%r;exec(s)'%s)";exec(s)

Обратите внимание, что в число байтов входит завершающий символ новой строки. Это также используется -printдля ошибки после квинирования.


4

Pyth, 25 байт

.xf!p1)jN*2]".xf!p1)jN*2]

Модификация стандартной Pyth quine для добавления функции try-Кроме.


Будет ли использование # работать для этого? Это сэкономило бы 2 байта.
Майк Буфардечи

@MikeBufardeci Я попробовал это, но не смог приступить к работе. Сделайте это сами.
Исаак

3

AutoIt , 488 429 362 байта

Мой мозг болит, это слишком мета

$1=BinaryToString
$2=Chr(34)
$s="FileWrite('a','#include<Misc.au3>'&@LF&'Do'&@LF&'ToolTip(1)'&@LF&'Until _IsPressed(Chr(49)&Chr(66))')+RunWait(@AutoItExe&' a')"
Execute($s)
$x="$1=BinaryToString\n$2=Chr(34)\n%sExecute($s)\n$x=%s\nClipPut(StringFormat($x,$1(0x223D7324)&$s&$1(0x0A0D22),$2&$x&$2))"
ClipPut(StringFormat($x,$1(0x223D7324)&$s&$1(0x0A0D22),$2&$x&$2))

Это довольно интересно, так как он компилирует дочерний процесс, который в свою очередь продолжает выводить 1 в ToolTip API, пока не будет нажата ESC. Если нажать ESC, дочерний процесс убивает себя, а родительский (этот quine) возобновляет выполнение и выгружает свой источник в буфер обмена . Вы должны запустить это из редактора.

Кстати: это создает вспомогательный файл «а» на вашем диске.


2
Вспомогательные файлы! \ o /
Эддисон Крамп

3

C 239 221 206 172 байта

Определенно может быть намного короче, но я должен был отправить что - то на PPCG в конце концов .

*s="*s=%c%s%c,r;h(s){r=1;}main(){signal(2,h);while(!r)printf(%c1%c);printf(s,34,s,34,34,34);}",r;h(s){r=1;}main(){signal(2,h);while(!r)printf("1");printf(s,34,s,34,34,34);}

Компилируется с gcc 5.2.1 (с различными предупреждениями).


1

Haskell, 206 байт

import Control.Exception;main=catch(putStr o)e;o='1':o;e::SomeException->IO();e _=putStr(s++show s);s="import Control.Exception;main=catch(putStr o)e;o='1':o;e::SomeException->IO();e _=putStr(s++show s);s="

1

C #, 339 байт

using d=System.Console;class c{static bool k=1>0;static void Main(){d.CancelKeyPress+=delegate{k=1<0;var s="using d=System.Console;class c{{static bool k=1>0;static void Main(){{d.CancelKeyPress+=delegate{{k=1<0;var s={0}{1}{0};d.WriteLine(s,(char)34,s);}};while(k){{d.Write(1);}}}}}}";d.WriteLine(s,(char)34,s);};while(k){d.Write(1);}}}

Хороший трюк - спасибо @ LegionMammal978
Стефан Шинкель

Также delegateможно заменить на ()=>. Почему не kлокальная переменная?
LegionMammal978

1

Perl 5.10+, 64 байта

perl -E '$_=q{$SIG{INT}=sub{say"\$_=q{$_};eval";die};{print 1;redo}};eval'

Требуется Perl 5.10+ для say, который может быть включен либо -M5.010или -E.

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

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

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

Сломано:

perl -E '
    $_=q{                        # store contents of quine in $_
        $SIG{INT}=sub{           # install handler for SIGINT
            say"\$_=q{$_};eval"; # print quine
            die                  # break out of eval
        };
        {
            print 1;             # print "1"
            redo                 # restart block
        }
    };
    eval                         # eval $_, executing its contents as code
'

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