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).inspect
und 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 1
das geworden wäre ...end;a 100
, aber Ruby mit weniger bekannten END
Syntax verwendet weniger Bytes. Der interne Block hat END
jedoch einen anderen Gültigkeitsbereich und S
muss 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 S
auf 1
(oder 100
- 199
in 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 %s
für eine reguläre Zeichenfolge und %02d
fü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 s
statt $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
S
es immer weniger wäre 100
, damit es mit zweistelligen Zahlen anstelle von dreistelligen Zahlen verglichen werden könnte. Wenn ich jedoch S=0
am Ende verwende, werden die nächsten beiden Ziffern als oktal interpretiert 8
und 9
sind 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: yes97
und produzieren2Kparanoia: yes98
, sollten wir also nicht (4) lesenRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (dh2Kparanoia: yes99
produziert die Nachrichten)