Quine tiết kiệm phiên


12

Lấy cảm hứng từ câu hỏi này .

Tạo một chương trình nhắc người dùng lưu trữ một số dữ liệu và khi chương trình thoát ra, hãy tự nhổ chương trình, ngoại trừ dữ liệu phiên đã thay đổi.

Sau đó, người dùng sẽ mở chương trình mới được tạo và có thể gọi lại dữ liệu từ chương trình trước đó.

Các lệnh

  • KEY VALUE: đặt biến phiên KEYthànhVALUE
  • *: xóa tất cả dữ liệu
  • ! KEY: xóa bỏ KEY
  • ? KEY: truy vấn KEY(nếu không tồn tại: không in gì và tiếp tục)
  • nếu không, hãy rời khỏi chương trình

Không có khóa hoặc giá trị không thể chứa bất kỳ khoảng trắng. Tên tệp của chương trình mới được tạo phải xác định phiên bản của chương trình, bạn có thể sử dụng ngày hoặc bộ đếm.

Tương tác ví dụ:

 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

Người dùng mở chương trình mới được tạo

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

Mẫu thực hiện: https://gist.github.com/1128876

Quy tắc

  • Bạn không cần phải giữ bình luận hoặc khoảng trắng không đáng kể trong chương trình được đặt ra: chỉ cần giữ nguyên chức năng và dữ liệu
  • Bạn không thể sử dụng bất kỳ lưu trữ bên ngoài.
  • Không có quine gian lận, như bất kỳ vấn đề quine khác.
  • Mã ngắn nhất sẽ thắng.

Điều này nhắc nhở tôi về thời gian tôi đã viết một khung nhìn trong SQL Server hoạt động giống như một bảng bằng cách sử dụng các trình kích hoạt INSERT / UPDATE / DELETE và lưu trữ dữ liệu trong chế độ xem nhưSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

Điều gì được coi là một gian lận gian lận?
Casey Chu

Casey, đọc mã nguồn riêng, thường.
Joey

Ah. Giải pháp JS của tôi đến gần để làm điều đó, rất tiếc. Ồ, vì thông số kỹ thuật không rõ ràng về điều đó, tôi sẽ bỏ qua nguy cơ bị hạ cấp.
Casey Chu

Câu trả lời:


1

Hồng ngọc 1.9, 159 156

Chương trình này tạo các tệp có tên "1", "2", "3", v.v.

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 ký tự)

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

định dạng:

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ến thể của quine D của tôi

các *lệnh dựa vào m.clear;để làm việc một cách chính xác mà nó không ở DMD 2,52 (lỗi trong trình biên dịch)

nhu cầu stdout.flush;phụ thuộc vào việc tự động xả có được bật hay không (không có trên máy của tôi)


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)+')')}({}))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.