Session-Saving Quine

12

Inspiriert von dieser Frage .

Erstellen Sie ein Programm, das den Benutzer auffordert, einige Daten zu speichern, und spucken Sie das Programm selbst aus, wenn das Programm beendet wird, mit Ausnahme der Sitzungsdaten, die geändert wurden.

Der Benutzer öffnet dann das neu erzeugte Programm und kann die Daten des vorherigen Programms abrufen.

Befehle

  • KEY VALUE: Setzt die Sitzungsvariable KEYaufVALUE
  • *: Alle Daten löschen
  • ! KEY: löschen KEY
  • ? KEY: Abfrage KEY(falls nicht vorhanden: nichts drucken und weitermachen)
  • Andernfalls beenden Sie das Programm

Weder Schlüssel noch Wert dürfen Leerzeichen enthalten. Der Dateiname des neu generierten Programms muss die Version des Programms identifizieren. Sie können Datumsangaben oder Zähler verwenden.

Beispiel Interaktion:

 name test                    store name = test
                              data is now { name: test }
 0 1                          data is now { name: test, 0: 1 }
 ? name                       output: test
 ! 0                          delete 0
                              data is now { name: test }
 hello good world             data is now { name: test, hello: good }
                              the extra word "world" is ignored
 egiwiwegiuwe                 the "otherwise" case: quit program

Der Benutzer öffnet das neu erzeugte Programm

 ? name                       output: test
 name retest                  data is now { name: retest }
 *                            clear
                              data is now { }

Beispielimplementierung: https://gist.github.com/1128876

Regeln

  • Sie müssen keine Kommentare oder unbedeutenden Leerzeichen im quined-Programm beibehalten: Sie müssen nur die Funktionalität und die Daten beibehalten
  • Sie können keinen externen Speicher verwenden.
  • Keine betrügerischen Quines, wie bei allen anderen Quine-Problemen.
  • Kürzester Code gewinnt.
Ming-Tang
quelle
Dies erinnert mich an die Zeit, als ich in SQL Server eine Ansicht geschrieben habe, die sich wie eine Tabelle SELECT 1 AS ID, NAME AS BLAH UNION...
verhält,
Was ist ein betrügerischer Quine?
Casey Chu
Normalerweise liest Casey eigenen Quellcode.
Joey
Ah. Meine JS-Lösung kommt dem schon sehr nahe, hoppla. Na ja, da die Spezifikation darüber nicht so klar ist, lasse ich es auf die Gefahr, dass es zu Abstimmungen kommt.
Casey Chu

Antworten:

1

Ruby 1.9, 159 156

Dieses Programm generiert Dateien mit den Namen "1", "2", "3" usw.

b={}
I=1
eval T="loop{c,d=gets.split
c==?*?b={}:d ?c==?!?b.delete(d):c==???puts(b[d]):b[c]=d :break}
open(I.to_s,?w){|f|f<<'b=%p
I=%d
eval T=%p'%[b,I+1,T]}"
Lowjacker
quelle
1

D (419 Zeichen)

enum c=q{string[string] m;import std.stdio;import std.array;void main(){foreach(string s;lines(stdin)){auto a=s.split;if(!a.length)goto e;switch(a[0]){case "*":m.clear;break;case "!":m.remove(a[1]);break;case "?":writeln(m.get(a[1],""));break;default:if(a.length<2){goto e;}m[a[0]]=a[1];}stdout.flush;}e:write("static this(){");foreach(i,v;m)writef("m[`%s`]=`%s`;",i,v);write("}enum c=q{",c,"};mixin(c);");}};mixin(c);

formatiert:

enum c=q{
    string[string] m;
    import std.stdio;
    import std.array;
    void main(){
        foreach(string s;lines(stdin)){
            auto a=s.split;
            if(!a.length)goto e;
            switch(a[0]){
                case "*":m.clear;break;
                case "!":m.remove(a[1]);break;
                case "?":writeln(m.get(a[1],""));break;
                default:if(a.length<2){goto e;}m[a[0]]=a[1];
            }
            stdout.flush;
        }
        e:write("static this(){");
        foreach(i,v;m)writef("m[`%s`]=`%s`;",i,v);
        write("}enum c=q{",c,"};mixin(c);");
    }
};mixin(c);

Variante meiner D-Quine

Der *Befehl m.clear;funktioniert nur, wenn er in DMD 2.52 korrekt ausgeführt wird (Fehler im Compiler).

Die Notwendigkeit stdout.flush;hängt davon ab, ob die automatische Spülung aktiviert ist (auf meinem Computer nicht vorhanden).

Ratschenfreak
quelle
1

JavaScript, 245

(function(o,N){while(a=prompt()){a=a.split(' ')
b=a[0]
c=a[1]
if(b=='*')o={}
else if(b=='?'){if(o[c]!=N)alert(o[c])}
else if(b=='!')delete o[a[1]]
else if(c!=N)o[b]=c
else break}alert('('+arguments.callee+')('+JSON.stringify(o)+')')}({}))
Casey Chu
quelle