Quine salva-sessione


12

Ispirato da questa domanda .

Creare un programma che richiede all'utente di memorizzare alcuni dati e, quando il programma viene chiuso, espellere il programma stesso, ad eccezione dei dati di sessione modificati.

L'utente quindi apre il programma appena generato e può richiamare i dati dal programma precedente.

comandi

  • KEY VALUE: imposta la variabile di sessione KEYsuVALUE
  • *: cancella tutti i dati
  • ! KEY: Elimina KEY
  • ? KEY: query KEY(se non esiste: stampa nulla e passa avanti)
  • in caso contrario, chiudere il programma

Né chiave né valore non possono contenere spazi. Il nome file del programma appena generato deve identificare la versione del programma, è possibile utilizzare date o contatori.

Esempio di interazione:

 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

L'utente apre il programma appena generato

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

Implementazione di esempio: https://gist.github.com/1128876

Regole

  • Non è necessario conservare commenti o spazi bianchi insignificanti nel programma quined: basta preservare la funzionalità e i dati
  • Non è possibile utilizzare alcuna memoria esterna.
  • Nessuna truffa, come qualsiasi altro problema.
  • Il codice più corto vince.

Questo mi ricorda il momento in cui ho scritto una vista in SQL Server che si comportava proprio come una tabella usando i trigger INSERT / UPDATE / DELETE e memorizzando i dati nella vista stessa comeSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

Che cosa è considerato un chine chine?
Casey Chu,

Casey, leggendo il proprio codice sorgente, di solito.
Joey,

Ah. La mia soluzione JS si avvicina a farlo, whoops. Vabbè, dato che le specifiche non sono così chiare a riguardo, la lascerò a rischio di essere sottovalutata.
Casey Chu,

Risposte:


1

Ruby 1.9, 159 156

Questo programma genera file denominati "1", "2", "3" e così via.

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]}"

1

D (419 caratteri)

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

formattato:

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 del mio D quine

il *comando si basa m.clear;per funzionare correttamente, cosa che non in dmd 2.52 (bug nel compilatore)

la necessità stdout.flush;dipende dal fatto che lo scarico automatico sia abilitato (non è sulla mia macchina)


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)+')')}({}))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.