Quine oszczędzająca sesję

12

Zainspirowany tym pytaniem .

Utwórz program, który zachęca użytkownika do zapisania niektórych danych, a gdy program kończy pracę, wypluj sam program, z wyjątkiem danych sesji zmienionych.

Następnie użytkownik otwiera nowo wygenerowany program i może przywołać dane z poprzedniego programu.

Polecenia

  • KEY VALUE: ustawia zmienną sesji KEYnaVALUE
  • *: wyczyść wszystkie dane
  • ! KEY: usunąć KEY
  • ? KEY: zapytanie KEY(jeśli nie istnieje: nic nie drukuj i przejdź dalej)
  • w przeciwnym razie zamknij program

Ani klucz, ani wartość nie mogą zawierać spacji. Nazwa pliku nowo wygenerowanego programu musi określać wersję programu, można użyć dat lub liczników.

Przykładowa interakcja:

 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

Użytkownik otwiera nowo wygenerowany program

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

Przykładowa implementacja: https://gist.github.com/1128876

Zasady

  • Nie musisz zachowywać komentarzy ani nieistotnych białych znaków w programach poddanych działaniu: po prostu zachowaj funkcjonalność i dane
  • Nie możesz używać pamięci zewnętrznej.
  • Żadnych oszukiwania quines, jak wszystkie inne problemy quine.
  • Najkrótszy kod wygrywa.
Ming-Tang
źródło
To przypomina mi czas, kiedy napisałem widok w SQL Server, który zachowywał się jak tabela, używając wyzwalaczy INSERT / UPDATE / DELETE i przechowując dane w samym widoku jakoSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb
Co uważa się za oszustwo?
Casey Chu,
Casey, zwykle odczytuje własny kod źródłowy.
Joey,
Ach Moje rozwiązanie JS jest bliskie zrobienia tego. Ups. No cóż, skoro specyfikacja nie jest do końca jasna, zostawię to na marginesie ryzyka.
Casey Chu,

Odpowiedzi:

1

Ruby 1.9, 159 156

Ten program generuje pliki o nazwach „1”, „2”, „3” itd.

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
źródło
1

D (419 znaków)

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

sformatowany:

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

wariant mojej litery D.

*poleceń opiera się na m.clear;działało poprawnie którym nie w DMD 2,52 (błąd w kompilatorze)

potrzeba stdout.flush;zależy od tego, czy automatyczne spłukiwanie jest włączone (nie ma go na moim komputerze)

maniak zapadkowy
źródło
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
źródło