Y2K… im Jahr 2019?


18

Es ist der 10. August 2019, aber Ihre Aufgabe betrifft immer noch das zweite Halbjahr. Verrückt oder?

Erstellen Sie ein Programm, das sich selbst druckt und an das eine zweistellige Nummer angehängt ist. Wenn Sie es zum ersten Mal ausführen, sollte 00 an die Ausgabe angehängt werden (der Quellcode, da es sich um eine quine Variante handelt). Wenn Sie diese Ausgabe ausführen, sollte das ursprüngliche Programm ohne zweistellige Nummer das ursprüngliche Programm ausgeben, jedoch mit angehängter 01. Führen Sie diese Ausgabe aus, um das OG-Programm mit angehängter 02 zu erhalten, und dann, um das Programm mit 03 zu erhalten ... Diese Kette sollte bis 99 fortgesetzt werden. Dieses Programm sollte ausgeben BREAKING NEWS: WORLD ENDS.

Wenn Ihr Programm Y2Kparanoia: yesdann ist:

  1. Es sollte ausgegeben werden Y2Kparanoia: yes00
  2. Diese Ausgabe sollte gedruckt werden Y2Kparanoia: yes01
  3. Diese Ausgabe sollte gedruckt werden Y2K paranoia: yes02
  4. Wiederholen Sie diesen Vorgang bis Schritt 100: Dieses Programm gibt die angegebenen Weltuntergangsnachrichten aus

Dies ist Codegolf, daher gewinnt das kürzeste Programm, das sich beim Ausführen dieser Schritte selbst drucken kann.


7
Laut der Beschreibung werden wir das 99. Mal laufen 2Kparanoia: yes97und produzieren 2Kparanoia: yes98, sollten wir also nicht (4) lesen Repeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"? (dh 2Kparanoia: yes99produziert die Nachrichten)
Jonathan Allan

Antworten:


7

Perl 6 , 122 114 106 Bytes

-8 Bytes dank Shelvacu

END {<print $!-199??"END \{<$_>~~.EVAL};\$!="~($!-1&&$!-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};$!=1

Probieren Sie es online!

Übernimmt das Standard-Quine-Format und fügt den Breaking News-String sowie einen neuen Funktionsaufruf mit der angehängten Nummer hinzu. Hiermit wird ENDdie Funktion ausgeführt, wenn das Programm endet.


Sie können 3 weitere Bytes mit ENDund einer ourVariablen END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
speichern

Derzeit ist dies der aktuelle Gewinner.
Andrew

7

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!


Vielleicht, wenn Sie verwendet haben s=100-1? Dann swird 99, 0, -1 ... 99 sein und -swird -99, 0 ... 99 sein.
Lila P

@PurpleP Egal wie ich es versuche, ich kann mir keine Möglichkeit vorstellen, das zu tun und Zeichen zu speichern.
Shelvacu

5

Los, 382 366 354 340 305 298 272 Bytes

Gewinnt nicht, aber ich hatte Spaß mit der Herausforderung.

package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`,1

Probieren Sie es auf dem Go Playground!

Basierend auf einem Quine. Wenn die Variable nkleiner als 199 ist, wird der Zeichenfolgenvariablen nein schwerwiegender Akzent ( \x60), das Go-Zeichen für mehrzeilige Zeichenfolgen, gefolgt von einem Komma, hinzugefügt ,. Es wird fortgesetzt, indem die ersten 147 Zeichen von sgedruckt werden (um das Drucken zu verhindern, ,da dies nur am Ende auftritt), dann sals Ganzes gedruckt und schließlich gedruckt wird, 100wenn n == 1und n+1andernfalls. Das Ergebnis ist, dass aufeinanderfolgende Läufe die Variable nam Ende des Programms auf 100, 101 usw. ändern . Wenn die Variable n199 oder mehr ist, werden aktuelle Nachrichten gedruckt.



2

JavaScript (ES6), 116 Byte

setTimeout(s="alert((n-1?++n:n=100)-200?`setTimeout(s=${JSON.stringify(s)}),n=`+n:'BREAKING NEWS: WORLD ENDS')"),n=1

94 Bytes, wenn Stringfunktionen erlaubt sind

f=_=>((p=`f=${f}`.split`|`)[4]=p[4]-1?-~p[4]:100)-200?p.join`|`:'BREAKING NEWS: WORLD ENDS'||1

2
Sie können Ihren eigenen Quellcode nicht lesen ( f=${f}), das ist laut codegolf.meta.stackexchange.com/a/4878/13400
Shelvacu


1

Pyth , 81 80 Bytes

.vh,K"?>J198\"BREAKING NEWS: WORLD ENDS\"s[\".vh,K\"N:KN+C92NN\"J\"?<J2*TT+J1"J1

Probieren Sie es online!

Erläuterung:

.vh,K" ... "J1
.v               Eval pyth code
  h              Get the first item in list
   ,             Make a list of the next two items
            J1   Set J = 1 (J = 100 to 199 in future iterations)
    K" ... "     Set K to the given string

Und der Code in der Zeichenfolge ist (Eilmeldungen gekürzt):

?>J198"BNWE"s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1
?                                              Ternary: If A then B else C
 >J198                                         Test if J > 198
      "BNWE"                                   String literal; If ternary was true, return this (which is then implicitly printed)
            s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1   ternary else
            s                                  concatenate list of strings
             [                                 create list
              ".vh,K"                          string literal, list[0]
                     N                         N is set to the double-quote character, list[1]
                      :KN+C92N                 list[2]
                      :                        Regex substitution. In A, replace B with C
                       K                       Variable K (set to the string being eval'd)
                        N                      N is double-quote
                         +C92N                 A backslash followed by a double-quote
                         +                     concat two strings
                          C92                  character with code point 92 (backslash)
                             N                 N is double-quote
                              N                N is double-quote, list[3]
                               "J"             String literal, list[4]
                                  ?<J2*TT+J1   Inner ternary, list[5]
                                   <J2         If J < 2 ..
                                      *TT      return T * T (10 * 10), else
                                          +J1  return J+1
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.