Oturum Tasarruflu Quine


12

Bu sorudan ilham alındı .

Kullanıcıdan bazı verileri saklamasını isteyen bir program oluşturun ve program sonlandırıldığında, oturum verileri değiştiği sürece programın kendisini tükürün.

Kullanıcı daha sonra yeni oluşturulan programı açar ve verileri önceki programdan geri çağırabilir.

Komutları

  • KEY VALUE: Setleri oturum değişkeni KEYiçinVALUE
  • *: tüm verileri temizle
  • ! KEY: sil KEY
  • ? KEY: query KEY(yoksa: hiçbir şey yazdırmaz ve devam eder)
  • aksi takdirde programdan çıkın

Hiçbir anahtar veya değer boşluk içeremez. Yeni oluşturulan programın dosya adı programın sürümünü belirlemelidir, tarihleri ​​veya sayaçları kullanabilirsiniz.

Örnek etkileşim:

 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

Kullanıcı yeni oluşturulan programı açar

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

Örnek uygulama: https://gist.github.com/1128876

kurallar

  • Quined programdaki yorumları veya önemsiz beyaz alanları korumanıza gerek yoktur: sadece işlevselliği ve verileri koruyun
  • Harici depolama kullanamazsınız.
  • Hile yok, diğer quine problemleri gibi.
  • En kısa kod kazanır.

Bu bana SQL Server'da INSERT / UPDATE / DELETE tetikleyicilerini kullanarak ve tablodaki verileri şu şekilde depolayarak bir tablo gibi davranan bir görünüm yazdığımı hatırlatıyorSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

Hile kini olarak kabul edilen nedir?
Casey Chu

Casey, genellikle kendi kaynak kodunu okuyor.
Joey

Ah. JS çözümüm bunu yapmaya yakışıyor, hatalar. Oh, spesifikasyon bu konuda net olmadığı için, aşağı düşürülme riskini bırakacağım.
Casey Chu

Yanıtlar:


1

Yakut 1.9, 159 156

Bu program "1", "2", "3" ve benzeri dosyaları üretir.

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

biçimlendirilmiş:

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

benim D quine varyantı

*Komut dayanır m.clear;o (derleyicisi hata) dmd 2,52 içinde değil doğru işe

ihtiyacı stdout.flush;oto floş etkin olup olmadığını bağlıdır (bu benim makinede değildir)


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)+')')}({}))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.