セッション保存クイン


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

ルール

  • カインプログラムでコメントや重要でない空白を保持する必要はありません。機能とデータを保持するだけです
  • 外部ストレージは使用できません。
  • 他の馬の問題のように、不正行為のクインはありません。
  • 最短のコードが優先されます。

これは私のようにINSERT / UPDATE / DELETEトリガーを使用して、ビュー自体にデータを格納することによって、ちょうどテーブルのように行動しているSQL Serverのビューを書いた時のことを思い出すSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

不正行為と見なされるものは何ですか?
ケーシーチュー

ケーシー、通常は独自のソースコードを読み取ります。
ジョーイ

あ。私のJSソリューションはそれを実現することに近づいています。まあ、それについては仕様がそれほど明確ではないので、私はそれを降格される危険にさらしておきます。
ケーシーチュー

回答:


1

Ruby 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)+')')}({}))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.