Сесійна економія


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

Правила

  • Вам не потрібно зберігати коментарі чи незначні пробіли у програмі, що склалася: просто збережіть функціональність та дані
  • Ви не можете використовувати будь-яке зовнішнє сховище.
  • Жодних обманних лайків, як і будь-які інші проблеми з лайкою.
  • Найкоротший код виграє.

Це нагадує мені час, коли я написав перегляд у SQL Server, який діяв так само, як таблиця, використовуючи тригери INSERT / UPDATE / DELETE та зберігаючи дані у самому поданні якSELECT 1 AS ID, NAME AS BLAH UNION...
mellamokb

Що вважається обманом?
Кейсі Чу

Кейсі, як правило, читає власний вихідний код.
Joey

Ага. Моє рішення JS наближається до того, щоб це зробити. Ну добре, оскільки специфікація не настільки зрозуміла з цього приводу, я залишаю це, ризикуючи бути прихильним.
Кейсі Чу

Відповіді:


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;працювати правильно , коли воно не в МДД 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)+')')}({}))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.