Quines d'interruption de signal


12

Quining a une longue histoire - si vous n'en avez pas entendu parler, cliquez sur le tag et lisez-le un peu.

Ta tâche

Sortie d'une série infinie de 1s (sans autre espacement [sauts de ligne, espaces, etc.]) JUSQU'À CE QUE SIGINT (généralement CTRL-C) soit appelé. Lorsqu'il est appelé, sortez la source du programme.

Règles

  • Ce doit être un quine valide:
    • Aucune source de lecture depuis le disque.
    • Voir toutes les autres failles standard relatives aux quines.
  • Vous pouvez utiliser n'importe quelle langue.
  • Comme il s'agit d'un code de golf, la réponse la plus courte l'emporte!


@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ C'est plutôt bien, en fait. Je ne sais pas si je l'accepterais, car il ne produit pas la source à la fin, il arrête simplement d'éteindre la source.
Addison Crump

1
Comment savez-vous que le dernier caractère n'est pas le programme sortant sa source? : P (C'est une réponse de plaisanterie, de toute façon)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
¯ \ _ (ツ) _ / ¯ API, peut-être?
Addison Crump

Réponses:


4

Python 3, 76 octets

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

Notez que le nombre d'octets inclut une nouvelle ligne de fin. Cela permet également -printd'erreurs après quining.


4

Pyth, 25 octets

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

Une modification du quine Pyth standard pour ajouter une fonction try-except.


Est-ce que l'utilisation de # fonctionnerait pour cela? Cela économiserait 2 octets.
Mike Bufardeci

@MikeBufardeci J'ai essayé, mais je n'ai pas pu me mettre au travail. Essayez-le vous-même.
isaacg

3

AutoIt , 488 429 362 octets

Mon cerveau me fait mal, c'est trop méta.

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

C'est assez intéressant dans la façon dont il compile un processus enfant qui en retour continue de sortir 1 vers l'API ToolTip jusqu'à ce que ESC soit pressé. Si ESC est enfoncé, le processus enfant se tue et le parent (ce quine) reprend l'exécution et sauvegarde sa source dans le presse-papiers . Vous devez l'exécuter à partir de l'éditeur.

BTW: Cela crée un fichier auxiliaire «a» sur votre disque.


2
Fichiers auxiliaires! \ o /
Addison Crump

3

C, 239 221 206 172 octets

Cela pourrait certainement être beaucoup plus court, mais j'ai finalement dû publier quelque chose sur 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);}

Compile avec gcc 5.2.1 (avec divers avertissements).


1

Haskell, 206 octets

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 octets

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

Nice Trick - merci @ LegionMammal978
Stephan Schinkel

En outre, delegatepeut être remplacé par ()=>. Pourquoi n'est-ce pas kune variable locale?
LegionMammal978

1

Perl 5.10+, 64 octets

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

Nécessite Perl 5.10+ pour say, qui peut être activé avec -M5.010ou -E.

Comment ça fonctionne

Ceci est encore une autre variation du quine suivant, que je semble utiliser pour chaque défi de quine:

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

En panne:

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
'

Oups, au départ, l'impression des 1s était séparée par des retours à la ligne. Fixé au coût de 2 octets.
ThisSuitIsBlackNot
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.