节省会话的Quine


12

受到这个问题的启发。

创建一个程序,提示用户存储一些数据,并在退出程序时吐出程序本身,但会话数据已更改。

然后,用户打开新生成的程序,并可以从先前的程序中调出数据。

指令

  • KEY VALUEKEY将会话变量设置为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

规则

  • 您无需在奎纳德程序中保留注释或无关紧要的空格:只需保留功能和数据即可
  • 您不能使用任何外部存储。
  • 像其他任何问题一样,没有作弊的问题。
  • 最短的代码获胜。

这让我想起了我在SQL Server中编写一个视图的时间,即使用INSERT / UPDATE / DELETE触发器并将数据存储在视图本身中的时间为SELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

什么是作弊奎因?
Casey Chu

凯西,通常阅读自己的源代码。
乔伊,

啊。我的JS解决方案几乎可以做到这一点,哎呀。哦,好吧,由于规范尚不明确,我将其保留下来以免被否决。
Casey Chu

Answers:


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

我的D奎因变体

*命令依赖于m.clear;它在dmd 2.52中无法正常运行(编译器中的错误)

stdout.flush;是否需要取决于是否启用了自动刷新(不在我的计算机上)


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)+')')}({}))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.