首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话-节省Quine

会话-节省Quine
EN

Code Golf用户
提问于 2011-08-06 01:20:12
回答 2查看 433关注 0票数 12

这个问题的启发。

创建一个程序,提示用户存储一些数据,当程序退出时,吐出程序本身,除非会话数据发生了更改。

然后,用户打开新生成的程序,并可以回忆以前程序中的数据。

命令

  • KEY VALUE:将会话变量KEY设置为VALUE
  • *:清除所有数据
  • ! KEY:删除KEY
  • ? KEY:查询KEY (如果不存在:不打印并继续前进)
  • 否则,退出程序。

键或值都不能包含任何空格。新生成的程序的文件名必须标识程序的版本,可以使用日期或计数器。

示例交互:

代码语言:javascript
复制
 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

用户打开新生成的程序。

代码语言:javascript
复制
 ? name                       output: test
 name retest                  data is now { name: retest }
 *                            clear
                              data is now { }

示例实现:https://gist.github.com/1128876

规则

  • 您不需要在被查询的程序中保留注释或不重要的空白:只需保留功能和数据
  • 您不能使用任何外部存储。
  • 没有作弊,就像其他奎因问题一样。
  • 最短代码获胜。
EN

回答 2

Code Golf用户

发布于 2011-08-06 13:13:54

D (419个字符)

代码语言:javascript
复制
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);

格式化:

代码语言:javascript
复制
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;才能正确工作,而在DMD2.52(编译器中的错误)中却不正确。

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

票数 1
EN

Code Golf用户

发布于 2011-08-08 08:21:57

JavaScript,245

代码语言:javascript
复制
(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)+')')}({}))
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/3351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档