Ruby, 158 154 146 128 122 100 Bytes
Inspiriert von dieser Antwort .
eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1
BEARBEITEN: Ich konnte es entfernen (s.split(35.chr)[0]+35.chr).inspectund durch s[0..-2](Bereich aller Werte außer dem letzten) und die zuvor verwendete %{ ... }Zeichenfolgensyntax ersetzen . 22 Bytes gespeichert!
Alte Version:
BEARBEITEN: Sie haben ein Paar Parens (und das entsprechende Paar im Datenabschnitt) gespeichert, indem Sie erkannt haben, dass "BREAKING NEWS: WORLD ENDS"es sich um eine vollständig gültige Formatzeichenfolge handelt, und Ruby ignoriert alle extraneos-Parameter.
END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%{END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%%{%s})%%[q,S<2?0:S-99]}
S=1%02d})%[q,S<2?0:S-99]}
S=1
Beim Start dieses erkannte ich, dass da die Zahl hat am Ende des Programms zu gehen, und Rubin erlaubt keine Variablen verwenden , bevor sie deklariert sind, würde ich muss Code zum Laufen bringen , nachdem irgendwie die Ziffern. Ich könnte getan haben so etwas wie def a(s) ... end;a 1das geworden wäre ...end;a 100, aber Ruby mit weniger bekannten ENDSyntax verwendet weniger Bytes. Der interne Block hat ENDjedoch einen anderen Gültigkeitsbereich und Smuss daher eine globale Variable oder Konstante sein.
Erläuterung:
END{ ... };S=1: Führen Sie einen Codeblock aus, bevor das Programm beendet wird. Konstante setzen Sauf 1(oder 100- 199in zukünftigen Iterationen)
$><<( ... ): $>ist eine Verknüpfung in ruby für stdout und <<schreibt auf einem IO auf das IO. Die Eltern sind erforderlich, sonst wird es($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: Wenn ich das in etwas vernünftigeren Code aufteilen würde, wäre es:
if S > 198
"BREAKING NEWS: WORLD ENDS"
else
q = ...
number_to_append = if S < 2
0
else
S - 100 + 1
end
q % [q, number_to_append]
end
Der %Operator, der auf eine Zeichenfolge angewendet wird, ist effektiv printf, wobei LHS die Formatzeichenfolge und RHS die Argumente sind.
%{ ... (q=%%{%s}) ... S=1%02d}: ruby hat eine interessante Syntax für Zeichenfolgen, mit der auch geschweifte Klammernpaare innerhalb der Zeichenfolge angezeigt werden können, ohne dass sie ausgeblendet werden, solange sie ausgeglichen sind. Dies ist sehr hilfreich, da ansonsten ein ähnliches Quine aus der Zeichenfolge entfernt werden müsste, um es als Zeichenfolgenliteral in sich aufzunehmen. Die beiden Ersetzungen in der Formatzeichenfolge gelten %sfür eine reguläre Zeichenfolge und %02dfür eine Zahl, die mit dem Zeichen auf eine Größe von 2 rechts aufgefüllt ist 0.
Meine Gedanken zur weiteren Verkürzung:
Es wäre schön zu können , verwenden sstatt $s, aber die Definition s s=$s;oder eine Funktion zu machen def a(s) ...beide Gebrauch mehr Bytes als sie speichern, und ich kann mir keinen anderen Weg , es zu tun. EDIT: Konstanten sind global und können ein Zeichen sein!
- Es wäre schön, wenn
Ses immer weniger wäre 100, damit es mit zweistelligen Zahlen anstelle von dreistelligen Zahlen verglichen werden könnte. Wenn ich jedoch S=0am Ende verwende, werden die nächsten beiden Ziffern als oktal interpretiert 8und 9sind ungültig und alles ist eine Koje. S=ist einfach nicht gültig und ich kenne keine andere Möglichkeit, einen Wert sowohl vor als auch nach dem Anhängen von zwei Ziffern gültig zu machen. Bemerkenswerterweise ist 0(und jede andere ganze Zahl) in Rubin wahr .
Wenn Sie darüber nachdenken, wie Sie das verkürzen können, lassen Sie es mich bitte wissen!
Probieren Sie es online!
2Kparanoia: yes97und produzieren2Kparanoia: yes98, sollten wir also nicht (4) lesenRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (dh2Kparanoia: yes99produziert die Nachrichten)