Quine ประหยัดเซสชัน


12

แรงบันดาลใจจากคำถามนี้

สร้างโปรแกรมที่พร้อมท์ให้ผู้ใช้จัดเก็บข้อมูลบางอย่างและเมื่อโปรแกรมเลิกให้คายโปรแกรมเองยกเว้นข้อมูลเซสชันจะเปลี่ยนไป

จากนั้นผู้ใช้เปิดโปรแกรมที่สร้างขึ้นใหม่และสามารถเรียกคืนข้อมูลจากโปรแกรมก่อนหน้า

คำสั่ง

  • KEY VALUE: ตั้งค่าตัวแปรเซสชันKEYเป็นVALUE
  • *: ล้างข้อมูลทั้งหมด
  • ! KEY: ลบ KEY
  • ? KEY: แบบสอบถามKEY(หากไม่มี: พิมพ์อะไรเลยและไปต่อ)
  • มิฉะนั้นให้ออกจากโปรแกรม

คีย์หรือค่าไม่สามารถมีช่องว่างใด ๆ ชื่อไฟล์ของโปรแกรมที่สร้างขึ้นใหม่จะต้องระบุเวอร์ชันของโปรแกรมคุณสามารถใช้วันที่หรือตัวนับ

ตัวอย่างการโต้ตอบ:

 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

ผู้ใช้เปิดโปรแกรมที่สร้างขึ้นใหม่

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

การใช้งานตัวอย่าง: https://gist.github.com/1128876

กฎระเบียบ

  • คุณไม่จำเป็นต้องเก็บความคิดเห็นหรือช่องว่างที่ไม่สำคัญในโปรแกรม quined: เพียงแค่รักษาฟังก์ชันการทำงานและข้อมูล
  • คุณไม่สามารถใช้ที่เก็บข้อมูลภายนอก
  • ไม่มีปัญหาการโกงเหมือนปัญหาควินอื่น ๆ
  • รหัสที่สั้นที่สุดชนะ

สิ่งนี้ทำให้ฉันนึกถึงเวลาที่ฉันเขียนมุมมองใน SQL Server ที่ทำหน้าที่เหมือนตารางโดยใช้ INSERT / UPDATE / DELETE ทริกเกอร์และเก็บข้อมูลในมุมมองของตัวเองเป็นSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

สิ่งที่ถือว่าเป็นควินโกง?
Casey Chu

เคซี่ย์อ่านรหัสต้นฉบับของตัวเองมักจะ
Joey

อา. โซลูชัน JS ของฉันใกล้จะทำเช่นนั้นแล้ว โอ้เพราะข้อมูลจำเพาะไม่ชัดเจนเกี่ยวกับเรื่องนั้นฉันจะปล่อยให้มันเสี่ยงต่อการถูกลงคะแนน
Casey Chu

คำตอบ:


1

ทับทิม 1.9, 159 156

โปรแกรมนี้สร้างไฟล์ชื่อ "1", "2", "3" และอื่น ๆ

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 ตัวอักษร)

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

จัดรูปแบบ:

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

ตัวแปรของควินดีของฉัน

*คำสั่งต้องอาศัยm.clear;การทำงานอย่างถูกต้องซึ่งมันไม่ได้อยู่ใน DMD 2.52 (ข้อผิดพลาดในคอมไพเลอร์)

ความจำเป็นในการstdout.flush;ขึ้นอยู่กับว่าล้างอัตโนมัติเปิดใช้งาน (ไม่ได้อยู่ในเครื่องของฉัน)


1

จาวาสคริปต์, 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)+')')}({}))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.