Quines com interrupção de sinal


12

Quining tem uma longa história - se você não ouviu falar, clique na tag e leia um pouco sobre ela.

Sua tarefa

Gera uma série infinita de 1s (sem nenhum outro espaçamento [novas linhas, espaços, etc.]) até que SIGINT (normalmente CTRL-C) seja chamado. Quando é chamado, imprima a fonte do programa.

Regras

  • Deve ser um quine válido:
    • Nenhuma fonte de leitura do disco.
    • Veja todas as outras brechas padrão relacionadas a quines.
  • Você pode usar qualquer idioma.
  • Como este é um código de golfe, a resposta mais curta vence!


@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Isso é ótimo, na verdade. Não tenho certeza se eu aceitaria, porque não gera a fonte no final, apenas para de divulgar a fonte.
Addison Crump #

1
Como você sabe que o último caractere não é o programa que está exibindo sua fonte? : P (É uma resposta piada, de qualquer maneira)
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
¯ \ _ (ツ) _ / ¯ API, talvez?
Addison Crump #

Respostas:


4

Python 3, 76 bytes

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

Observe que a contagem de bytes inclui uma nova linha à direita. Isso também -printcostuma ocorrer após erro de citação.


4

Pitão, 25 bytes

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

Uma modificação do padrão Pyth quine para adicionar uma função try-except.


Usar # funcionaria para isso? Economizaria 2 bytes.
Mike Bufardeci

@ MikeBufardeci Eu tentei isso, mas não consegui trabalhar. Experimente você mesmo.
Isaacg

3

AutoIt , 488 429 362 bytes

Meu cérebro dói, isso é muito meta.

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

Isso é bastante interessante na maneira como compila um processo filho que, por sua vez, continua emitindo 1 para a API ToolTip até que o ESC seja pressionado. Se ESC for pressionado, o processo filho se mata e o pai (este quine) retoma a execução e despeja sua origem na área de transferência . Você precisa executar isso no editor.

BTW: Isso cria um arquivo auxiliar 'a' no seu disco.


2
Arquivos auxiliares! \ o /
Addison Crump

3

C, 239 221 206 172 Bytes

Definitivamente poderia ser muito mais curto, mas tive que postar algo no PPCG eventualmente .

*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);}

Compila com o gcc 5.2.1 (com vários avisos).


1

Haskell, 206 bytes

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 bytes

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);}}}

Truque legal - graças @ LegionMammal978
Stephan Schinkel

Além disso, delegatepode ser substituído por ()=>. Por que não é kuma variável local?
precisa

1

Perl 5.10+, 64 bytes

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

Requer Perl 5.10+ para say, que pode ser ativado com -M5.010ou -E.

Como funciona

Essa é mais uma variação do quine a seguir, que pareço usar em todos os desafios do quine:

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

Quebrado:

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
'

Opa, inicialmente estava imprimindo os 1s separados por novas linhas. Corrigido ao custo de 2 bytes.
ThisSuitIsBlackNot
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.