Sine-Saving Quine

12

Terinspirasi oleh pertanyaan ini .

Buat program yang meminta pengguna untuk menyimpan beberapa data, dan ketika program berhenti, keluarkan program itu sendiri, kecuali data sesi berubah.

Pengguna kemudian membuka program yang baru dibuat, dan dapat memanggil kembali data dari program sebelumnya.

Perintah

  • KEY VALUE: setel variabel sesi KEYmenjadiVALUE
  • *: hapus semua data
  • ! KEY: menghapus KEY
  • ? KEY: permintaan KEY(jika tidak ada: cetak apa-apa dan lanjutkan)
  • jika tidak, keluar dari program

Baik kunci atau nilai tidak dapat berisi spasi apa pun. Nama file program yang baru dibuat harus mengidentifikasi versi program, Anda dapat menggunakan tanggal atau penghitung.

Contoh interaksi:

 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

Pengguna membuka program yang baru dibuat

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

Contoh penerapan: https://gist.github.com/1128876

Aturan

  • Anda tidak perlu menyimpan komentar atau ruang kosong yang tidak signifikan dalam program quined: cukup pertahankan fungsionalitas dan datanya
  • Anda tidak dapat menggunakan penyimpanan eksternal apa pun.
  • Tidak ada quina yang curang, seperti masalah quine lainnya.
  • Kode terpendek menang.
Ming-Tang
sumber
Ini mengingatkan saya pada waktu saya menulis tampilan di SQL Server yang bertindak seperti tabel dengan menggunakan INSERT / UPDATE / DELETE memicu dan menyimpan data dalam tampilan itu sendiriSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb
Apa yang dianggap sebagai selingkuh curang?
Casey Chu
Casey, membaca kode sumber sendiri, biasanya.
Joey
Ah. Solusi JS saya hampir melakukan itu, wah. Oh well, karena speknya tidak begitu jelas tentang itu, saya akan membiarkannya dengan risiko diturunkan.
Casey Chu

Jawaban:

1

Ruby 1.9, 159 156

Program ini menghasilkan file bernama "1", "2", "3" dan seterusnya.

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

D (419 karakter)

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

diformat:

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

varian quine D saya

yang *perintah bergantung pada m.clear;pekerjaan dengan benar yang tidak di DMD 2,52 (bug di compiler)

kebutuhan akan stdout.flush;tergantung apakah penyiraman otomatis diaktifkan (tidak pada mesin saya)

aneh ratchet
sumber
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
sumber