Quine de sauvegarde de session

12

Inspiré par cette question .

Créez un programme qui invite l'utilisateur à stocker certaines données et, lorsque le programme se ferme, crachez le programme lui-même, à l'exception des données de session modifiées.

L'utilisateur ouvre ensuite le programme nouvellement généré et peut rappeler les données du programme précédent.

Commandes

  • KEY VALUE: définit la variable de session KEYsurVALUE
  • *: effacer toutes les données
  • ! KEY: supprimer KEY
  • ? KEY: requête KEY(si elle n'existe pas: n'imprimez rien et continuez)
  • sinon, quittez le programme

Aucune clé ou valeur ne peut contenir d'espace. Le nom de fichier du programme nouvellement généré doit identifier la version du programme, vous pouvez utiliser des dates ou des compteurs.

Exemple d'interaction:

 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'utilisateur ouvre le programme nouvellement généré

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

Exemple d'implémentation: https://gist.github.com/1128876

Règles

  • Vous n'avez pas besoin de conserver les commentaires ou les espaces insignifiants dans le programme quined: il suffit de préserver la fonctionnalité et les données
  • Vous ne pouvez pas utiliser de stockage externe.
  • Pas de quines de triche, comme tout autre problème de quine.
  • Le code le plus court gagne.
Ming-Tang
la source
Cela me rappelle le moment où j'ai écrit une vue dans SQL Server qui agissait comme une table en utilisant les déclencheurs INSERT / UPDATE / DELETE et en stockant les données dans la vue elle-même commeSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb
Qu'est-ce qui est considéré comme une quine de triche?
Casey Chu
Casey, généralement en lisant son propre code source.
Joey
Ah. Ma solution JS est proche de faire cela, oups. Eh bien, puisque la spécification n'est pas si claire à ce sujet, je vais laisser cela au risque d'être déclassé.
Casey Chu

Réponses:

1

Ruby 1.9, 159 156

Ce programme génère des fichiers nommés "1", "2", "3" et ainsi de suite.

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
la source
1

D (419 caractères)

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

formaté:

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 de mon D quine

la *commande s'appuie m.clear;pour fonctionner correctement, ce qui n'est pas le cas dans dmd 2.52 (bug dans le compilateur)

le besoin stdout.flush;dépend de l'activation ou non du rinçage automatique (ce n'est pas le cas sur ma machine)

monstre à cliquet
la source
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
la source