Quine de economia de sessão

12

Inspirado por esta pergunta .

Crie um programa que solicite ao usuário que armazene alguns dados e, quando o programa estiver encerrado, cuspa o próprio programa, exceto os dados da sessão alterados.

O usuário abre o programa recém-gerado e pode recuperar os dados do programa anterior.

Comandos

  • KEY VALUE: define a variável de sessão KEYcomoVALUE
  • *: limpar todos os dados
  • ! KEY: excluir KEY
  • ? KEY: query KEY(se não existir: imprima nada e siga em frente)
  • caso contrário, saia do programa

Nenhuma chave ou valor não pode conter espaços. O nome do arquivo do programa recém-gerado deve identificar a versão do programa, você pode usar datas ou contadores.

Exemplo de interação:

 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

O usuário abre o programa recém-gerado

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

Implementação de amostra: https://gist.github.com/1128876

Regras

  • Você não precisa preservar comentários ou espaços em branco insignificantes no programa em questão: basta preservar a funcionalidade e os dados
  • Você não pode usar nenhum armazenamento externo.
  • Sem trapaça, como qualquer outro problema.
  • O menor código vence.
Ming-Tang
fonte
Isso me faz lembrar do tempo que eu escrevi uma exibição em SQL Server que agiu apenas como uma tabela usando ATUALIZAÇÃO gatilhos Delete Insert / / e armazenar os dados na própria vista comoSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb
O que é considerado uma trapaça?
Casey Chu
Casey, lendo o código-fonte próprio, geralmente.
Joey
Ah Minha solução JS chega perto de fazer isso, ups. Oh, bem, como as especificações não são tão claras quanto a isso, vou deixar o risco de ser rebaixado.
Casey Chu

Respostas:

1

Rubi 1.9, 159 156

Este programa gera arquivos com o nome "1", "2", "3" e assim por diante.

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
fonte
1

D (419 caracteres)

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

formatado:

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 do meu D quine

o *comando depende m.clear;para funcionar corretamente, o que não ocorre no dmd 2.52 (erro no compilador)

a necessidade stdout.flush;depende se a liberação automática está ativada (não está na minha máquina)

catraca arrepiante
fonte
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
fonte