Signalunterbrechende Quines


12

Quining hat eine lange Geschichte - wenn Sie noch nichts davon gehört haben, klicken Sie auf das Tag und lesen Sie ein wenig darüber.

Deine Aufgabe

Eine unendliche Reihe von 1s ausgeben (ohne andere Abstände [Zeilenumbrüche, Leerzeichen usw.]) UNTIL SIGINT (normalerweise STRG-C) wird aufgerufen. Wenn es aufgerufen wird, geben Sie die Programmquelle aus.

Regeln

  • Es muss eine gültige Quine sein:
    • Keine Lesequelle von der Festplatte.
    • Siehe alle anderen Standardlücken in Bezug auf Quines.
  • Sie können eine beliebige Sprache verwenden.
  • Da dies ein Codegolf ist, gewinnt die kürzeste Antwort!


@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳ Das ist eigentlich ganz toll. Ich bin mir nicht sicher, ob ich das akzeptieren würde, da die Quelle am Ende nicht ausgegeben wird, sondern die Quelle nicht mehr ausgegeben wird.
Addison Crump

1
Woher wissen Sie, dass das letzte Zeichen nicht das Programm ist, das seine Quelle ausgibt? : P (Es ist sowieso eine Scherzantwort)
n̴̖̋h̴̖̋ã̷͉h̷̭̿d̸̡̅ẗ̵̨́

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

Antworten:


4

Python 3, 76 Bytes

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

Beachten Sie, dass die Byteanzahl eine nachgestellte Newline enthält. Dies führt auch -printzu Fehlern nach dem Quinten.


4

Pyth, 25 Bytes

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

Eine Modifikation des Standard-Pyth-Quines, um eine try-except-Funktion hinzuzufügen.


Würde die Verwendung von # dafür funktionieren? Es würden 2 Bytes gespart.
Mike Bufardeci

@MikeBufardeci Ich habe das versucht, konnte aber nicht zur Arbeit kommen. Probieren Sie es selbst aus.
Isaacg

3

AutoIt , 488 429 362 Bytes

Mein Gehirn tut weh, das ist zu 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))

Dies ist sehr interessant, da ein untergeordneter Prozess kompiliert wird, der im Gegenzug eine 1 an die ToolTip-API ausgibt, bis ESC gedrückt wird. Wenn ESC gedrückt wird, beendet sich der untergeordnete Prozess von selbst und der übergeordnete Prozess (dieser Quine) setzt die Ausführung fort und legt seine Quelle in der Zwischenablage ab . Sie müssen dies im Editor ausführen.

Übrigens: Dadurch wird eine Zusatzdatei 'a' auf Ihrer Festplatte erstellt.


2
Hilfsdateien! \ o /
Addison Crump

3

C 239 221 206 172 Bytes

Könnte definitiv viel kürzer sein, aber ich musste irgendwann etwas auf PPCG posten .

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

Kompiliert mit gcc 5.2.1 (mit verschiedenen Warnungen).


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

Netter Trick - danke @ LegionMammal978
Stephan Schinkel

Auch delegatekann ersetzt werden mit ()=>. Warum ist keine klokale Variable?
LegionMammal978

1

Perl 5.10+, 64 Bytes

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

Benötigt Perl 5.10+ für say, das entweder mit -M5.010oder aktiviert werden kann -E.

Wie es funktioniert

Dies ist eine weitere Variation der folgenden Quine, die ich anscheinend bei jeder Quine-Herausforderung verwende:

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

Heruntergebrochen:

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
'

Hoppla, anfangs wurde das 1s durch Zeilenumbrüche getrennt gedruckt. Bei einem Aufwand von 2 Bytes behoben.
ThisSuitIsBlackNot
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.