세션 저장 퀸


12

이 질문에서 영감을 얻었습니다 .

사용자에게 일부 데이터를 저장하도록 요청하는 프로그램을 작성하고 프로그램이 종료되면 세션 데이터가 변경된 것을 제외하고 프로그램 자체를 뱉어 내십시오.

그런 다음 사용자는 새로 생성 된 프로그램을 열고 이전 프로그램의 데이터를 호출 할 수 있습니다.

명령

  • KEY VALUE: 세션 변수 KEYVALUE
  • *: 모든 데이터 지우기
  • ! 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 프로그램에서 주석이나 중요하지 않은 공백을 보존 할 필요는 없습니다. 기능과 데이터 만 보존하십시오.
  • 외부 저장소는 사용할 수 없습니다.
  • 다른 quine 문제와 마찬가지로 부정 행위 quine이 없습니다.
  • 가장 짧은 코드가 승리합니다.

INSERT / UPDATE / DELETE 트리거를 사용하고 뷰 자체에 데이터를 다음과 같이 저장하여 테이블처럼 작동하는 SQL Server에서 뷰를 작성했음을 상기시켜줍니다.SELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

부정 행위로 간주되는 것은 무엇입니까?
Casey Chu

Casey, 보통 자체 소스 코드를 읽습니다.
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);

D quine의 변형

*명령은 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.