Напишіть інтерактивного перекладача Deadfish


30

Deadfish - жартівлива "мова програмування" з чотирма командами. Оскільки сторінка Esolang трохи суперечлива, а перекладачі на цій сторінці працюють не однаково, слід застосувати наступну варіацію:


Специфікація

  1. Є акумулятор розміром принаймні 16 біт, більше дозволено, але менше - ні. Негативні цифри не потрібно підтримувати. Акумулятор - це 0коли програма запускається.
  2. Існують наступні два набори з чотирьох команд, і ваша програма повинна підтримувати обидві одночасно.
      Стандартний мертвий ish Варіант XKCD │ Значення
      ───────────────────────────────────────────────────── ───────────────────────────
            i │ x │ акумулятор приросту
            d │ d │ акумулятор зменшення
            s │ k │ площа (acc = acc * acc)
            o │ c │ Вихідний акумулятор, як число
    
  3. Якщо після виконання команди акумулятор є -1або 256, акумулятор повинен бути скинутий до нуля. Зауважте, що це не нормальне обгортання. Якщо, скажімо, акумулятор є 20, і sкоманда виконується, акумулятор повинен бути 400згодом. Аналогічно, якщо акумулятор є 257і dкоманда виконується, акумулятор повинен стати 0.
  4. Будь-який ввід, який не є однією з цих команд, слід ігнорувати.

Тестові програми

  • xiskso повинен вивести 0
  • xiskisc повинен вивести 289

I / O

Ваша програма повинна відображати підказку: >>. Підказка повинна бути на початку нового рядка. Потім він повинен прочитати рядок введення користувача та запустити задані команди зліва направо. При виведенні чисел цифри повинні бути розділені. Тобто 12 34все в порядку, 12,34це добре,

12
34 

гаразд, але 1234це не так.

Ваша програма повинна робити це в циклі, принаймні, поки не EOFбуде досягнуто.

Приклад сеансу:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> 

Через запит на введення я не можу використовувати GolfScript :-(
ProgramFOX

@ProgramFOX: Ви можете використовувати введення рубіну, чи не так?
marinus

Відповідно до підручника GolfScript, ви не можете запросити введення в GolfScript, весь вхід надходить із STDIN.
ProgramFOX

@ProgramFOX: Я б подумав, що щось подібне #{STDIN.gets}буде працювати, але насправді це не так.
marinus

Чи дозволено нам брати введення великими літерами?
lirtosiast

Відповіді:


6

К, 77 байт

  {1">>";0{x*2=-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{-1@$x;x};-1+))@0:0;.z.s`}`
>>xiskso
0
>>xiskisc
289

Зауважте, це K4 . Рішення K6 трохи довше, тому що дієслова IO довші, навіть якщо все інше краще:

{""0:">>";0{x*^-1 256?x:y@x}/("xkcdiso"!7#(1+;{x*x};{""0:,$x;x};-1+))@0:"";o`}`
  • ""0:друкує та повертає свій аргумент. Примітка в K4 ми просто застосовуємо до 1 .
  • 0 f/ args демонструє зменшення з початковим значенням, тобто f[f[0;first arg];second arg]…
  • {x*2=-1 256?x…класифікує x на 0 (для -1), 1 (для 256) та 2 для всіх інших значень. 2=означає, що ми отримуємо 1для некласифікованих значень, 0інакше множення на xкоротше, ніж умовне. У K6 ми можемо зробити трохи краще, оскільки {x*^-1 256?x:y@x}покладаємося на те, що -1 256?xповертає 0N(null) і ^виявляє нулі.
  • "Аналізатор" - це карта "xkcdiso"замість запропонованого порядку, оскільки вона 7#обернеться навколо чотирьох аргументів, тобто 7#"abcd"повернень, "abcdabc"що робить нашу таблицю меншою
  • Карта перекладається "x"і "i"на проекцію, 1+яка еквівалентна функції, {1+x}але коротша.
  • Карта перекладається "d"на проекцію, -1+яка еквівалентна функції, {-1+x}але коротша.
  • Карта перекладає "k"і "s"на функцію{x*x}
  • Карта переводить "c"і "o"на функцію виведення, {-1@$x;x}яка знову-таки у K6 трохи довша: {""0:,$x;x}але обидва друкують її вихід, а потім новий рядок, а потім повертають аргумент.
  • .zs - саморекурсія . У K6 ми можемо просто сказати, o`що коротше.

8

Perl 5 , 90 байт

do{print+(map{$?+=/i|x/-/d/;$?**=1+/s|k/;$?=~s/-1|^256$/0/;"$?
"x/o|c/}/./g),'>> '}while<>

Спробуйте в Інтернеті!

Дякуємо @xfix за його допомогу з цього питання раніше! Збережено 4 байти завдяки @Xcali !


1
Ваша програма друкує, 1коли акумулятор переповнюється. Крім того, ви можете скоротити свою програму на п'ять символів, змінивши $aна $?(яка ініціалізована в 0і не зміниться, доки не запустите якусь зовнішню програму з Perl).
Конрад Боровський

Ааааа, я полював на змінну, яку я міг би використати, ідеально, дякую! Щодо переповнення, я цього не помічав, оскільки це відбувається лише в тому випадку, якщо ви запускаєтесь isssoяк одна команда, а не якщо ви виконуєте кожну окремо ... Я перегляну це згодом і обов'язково буду використовувати $?. Дякую!
Дом Гастінгс

Тому я думаю, що я залишив старішу версію в розділі коду вгорі, ''замість того, ""щоб при використанні з perl -e '...'картою закінчився результатом s///. Знову дякую!
Дом Гастінгс

Гаразд, ти найкоротший.
Марина

1
Більше не найкоротша відповідь.
геокар

6

Powershell, 131 126 121 114 113

for($x=0){[char[]](read-host ">>")|%{switch -r($_){"i|x"{$x++}"d"{$x-=!!$x}"s|k"{$x*=$x}"o|c"{$x}}
$x*=$x-ne256}}
  • for($x=0){...} - встановити акумулятор на 0 і циклічно назавжди
  • read-host '>>' - отримати запит користувача з підказкою >>
  • [char[]](...) - перетворити вхід користувача в масив символів
  • |%{...} - виконайте те, що всередині {}кожного персонажа
  • switch -r($_) - перемикач регулярних виразів для кожного символу
  • "i|x"{$x++} - відповідати iабо x- збільшити акумулятор
  • "d"{$x-=!!$x} - match d- зменшити $xна !!$x, що буде, 0якщо $xє 0, і в 1іншому випадку. Це гарантує, що акумулятор ніколи не дістанеться -1.
  • "s|k"{$x*=$x} - сірник sабо k- квадрат
  • "o|c"{$x} - відповідати oабо c- вивести акумулятор
  • $x*=$x-ne256- помножте акумулятор на, 0якщо він є, 256або 1іншим способом

Приклад виведення

>>: xiskso
0
>>: xiskisc
289
>>: ddddo ddddo
285
281
>>: ddddo ddddo
277
273
>>: dddddddo
266
>>: dddddddddo
257
>>: do
0
>>: do
0
>>: io
1
>>:

Я думаю, що реалізація read-hostхост-специфіки, тому цей хост Powershell (ConsoleHost) додає :до зазначеного запиту.


Приємно! Любіть декремент !!$x, сором, я не можу це використати ...
Дом Гастінгс

Гей, Данко, чи не могли б ви опублікувати якийсь тестовий вихід? Я не думаю, що я можу перевірити силову оболонку на не-вікнах ... (будь ласка, виправте мене, якщо я помиляюся!)
Дом Гастінгс,

Я додав кілька відповідей тесту до відповіді.
Данько Дурбич

6

Ребол 3, 178 169 161 159

f: does [if a = -1 or (a = 256)[a: 0]]d: [any[["i"|"x"](++ a f)|["d"](-- a f)|["s"|"k"](a: a * a f)|["o"|"c"](print a)| skip]]a: 0 forever [parse (ask ">>") d]

Гарніша версія:

f: does [if a = -1 or (a = 256) [a: 0]]
d: [
    any [
        ["i"|"x"] (++ a f) |
        ["d"] (-- a f) |
        ["s"|"k"] (a: a * a f) |
        ["o"|"c"] (print a) |
        skip
    ]
]
a: 0 
forever [parse (ask ">>") d]

6

Хаскелл, 202

r=pure;-1%c=0%c;256%c=0%c;s%'o'=s<$print s;s%'c'=s%'o';s%'i'=r$s+1;s%'x'=s%'i'
s%'d'=r$s-1;s%'s'=r$s^2;s%'k'=s%'s';s%_=r s;n s(c:[])=s%c;n s(c:f)=s%c>>=(`n`f)
main=p 0;p s=putStr">> ">>getLine>>=n s>>=p

Ви могли б заощадити кілька персонажів, змінюючи eі vв оператори. Я також спробував переписати vі gтак, щоб параметр xзалишався в IO, і printт.д. піднімався. Мені не вдалося змусити його працювати, але я думаю, що це може бути гарним місцем для того, щоб поїхати хтось, хто знає їх хескелл.
shiona

@shiona: Так, річ у IOтому, щоб зберігати речі, полягає в тому, що вони друкуються занадто часто (тому я використовував r nзамість цього x) або недостатньо, оскільки значення ніколи не запитується… Так як я б змінити eі vв оператори?
Ри-

У мене були ті ж проблеми з друком. Що стосується операторів, які ви можете зробити (використовуючи e як приклад) 'i'%x=x+1;'d'%x=x-1... І просто назвати це в v do n<-x;r$w$o%n. Причина, що оператори економлять місце, полягає в тому, що їм не потрібні місця навколо них.
shiona

@shiona: О! Гарний дзвінок, дякую!
Ри-

Без проблем. Я спершу подумав над тим, як зробити власну відповідь, але, оскільки я не міг змусити своїх великих ідей працювати, я подумав, що це буде просто грубий пост саме того самого коду з просто різними позначеннями для тих же функцій.
shiona

4

Рубі, 140 138

a=0
loop{$><<'>> '
eval gets.gsub(/./){|c|({i:i='a+=1',x:i,d:'a-=1',s:s='a**=2',k:s,o:o='p a',c:o}[:"#{c}"]||'')+';a=a==-1||a==256?0:a;'}}

Зразок сеансу (такий же, як і ваш):

c:\a\ruby>deadfish
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

4

К, 121

i:0;while[1;1">> ";{i{(r;0)(-1~r)|256~r:y x}/d{x@&x in y}[x;!d:"ixdskoc"!,/(2#(1+);-1+;2#{x*x};2#{-1@$i::x;})]}'" "\:0:0]

.

C:\q>q deadfish.k -q
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Моя версія коротша. Я стиснув карту, покладався на ? класифікувати для "обгортання" значень, використовувані рекурсії замість while, а функціональний інтерпретатор замість поправок.
геокар

4

Ада

Ось реалізація Ada для небагатьох, хто цікавиться цією мовою. Мені знадобилося досить багато часу, щоб використати деякі кращі практики Ада (наприклад, використання Indefinite_Holders замість доступу), а також повністю зрозуміти, як «Deadfish» повинен працювати.

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Indefinite_Holders;
with Ada.Integer_Text_IO;

procedure Deadfish is
   package String_Holder is new Ada.Containers.Indefinite_Holders(String);
   use String_Holder;

   value_output : Natural := 0;
   str_input : String_Holder.Holder := To_Holder("");
begin
   Prompt :
   loop
      Put(">> ");
      String_Holder.Replace_Element(str_input, Get_Line);
      for rg in str_input.Element'Range loop
         case str_input.Element(rg) is
            when 'i' | 'x' => 
               case value_output is
                  when 255 => value_output := 0;
                  when others => value_output := Natural'Succ(value_output);
               end case;

            when 'd'       =>                   
               case value_output is
                  when 257 => value_output := 0;
                  when 0 => null;
                  when others => value_output := Natural'Pred(value_output);
               end case;
            when 's' | 'k' => 
               case value_output is
                  when 16 => value_output := 0;
                  when others =>value_output := value_output * value_output;
               end case;
            when 'o' | 'c' => Ada.Integer_Text_IO.Put(value_output, Width => 0); Put_Line("");
            when others => null;
         end case;
      end loop;
   end loop Prompt;
end Deadfish;

І вихід:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Якби деякі люди, що експериментували на Ада, могли дати мені підказки щодо оптимізації, я був би вдячний.


1
Ласкаво просимо до PPCG! Мета коду-гольфу - створити найкоротший можливий код, і ви повинні включити розмір програми в заголовок (тут 1396 байт)
TuxCrafting

4

C, 159 символів

A; main(c) {
  printf(">> ");
  while (c = getchar(), ~c)
    A = c - 'i' & c - 'x'?
        c - 'd'?
        c - 's' & c - 'k'?
        c - 'o' & c - 'c'?
        c - '\n'?
        A :
        printf(">> "), A :
        printf("%d\n", A), A :
        A * A :
        A - 1 :
        A + 1,
    A *= ~A && A - 256;
}

Я спробував інший підхід, заснований на створенні таблиці пошуку для декодування інструкцій, але, на жаль, це закінчилося довше ( 169 ). Я включив його, оскільки хтось може придумати розумний твіт, щоб зменшити розмір. (Потрібно запустити без аргументів)

#define X !--c?A

A,M[256];
main(c) {
  for(; !M['x']; c++) M["@osid\nckx"[c]]-=c%5+1;
  for (printf(">> "); c = ~M[getchar()]; A *= ~A && A - 256)
  A= X,printf("%d\n", A),A:X*A:X+1:X-1:A;
  main();
}

3

С, 163

#define i(u,v);if(c==u+89|c==v+89)
a;main(c){printf(">>");while(c=getchar()-10){i(6,21)a++i(1,1)a--i(8,16)a*=a;i(0,12)printf("%d\n",a);a=a==-1|a==256?0:a;}main();}

3

Пітон 3, 181 175 171 162

a=0
s=lambda x:"a=%d"%(x!=-1and x!=256and x)
while 1:
 for i in input(">>"):u,b,o=s(a+1),s(a*a),"print(a)";exec(dict(i=u,x=u,d=s(a-1),s=b,k=b,o=o,c=o).get(i,""))

Це виводить новий рядок після >>, але ОП не сказала, що це не було дозволено. Більше не!

Дякую GlitchMr, minitechі golfer9338!


1
Ви можете використовувати lambdaзамість defфункції, яка негайно повертається.
Конрад Боровський

x in(-1,256)зберігає два символи. Як варіант, s=lambda x:"a=%d"%(x!=-1and x!=256and x)можна врятувати деякі.
Ри-

1
Ви можете замість цього видалити print(">>")та використовувати for i in input(">>"); input()дозволяє вказати підказку. Потім після цього не буде нового рядка >>, і ви збережете символи.
golfer9338

Я думаю, ваша оцінка повинна бути на одну таблицю коротшою . Будь ласка, повторіть позначку, але я отримаю кількість 161 замість опублікованих 162: рядки 3 + 40 + 8 + 107, плюс 3 нові рядки. Правду кажучи, я заздрю, бо в будь-якому випадку ти на кілька символів коротший моєї відповіді на С. Ура!
Даррен Стоун

3

R, 161 , 148 , 138

a=0;repeat{x=readline(">> ");for(i in utf8ToInt(x)-99){a=a^((i==8|i==16)+1)+(i==6|i==21)-(i==1&a);a=a*(a!=256);if(i==0|i==12)cat(a,"\n")}}

Безгольова версія:

a = 0
repeat{
  x = readline(">> ")
  for(i in utf8ToInt(x) - 99) {
    a = a ^ ((i == 8 | i == 16) + 1) + (i == 6 | i == 21) - (i == 1 & a)
    a = a * (a != 256)
    if(i == 0 | i == 12) cat (a, "\n")
  }
}

Приклад сеансу (в інтерактивному режимі):

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> 

3

Пітон 3, 141

Я знаю, що спізнююсь, але хотів скористатися можливістю опублікувати більш коротку версію Python (і свою першу спробу CodeGolf). :)

v=0
m=lambda y:(0,y)[-1!=y!=256]
i=x='+1'
d='-1'
s=k='*v'
c=o=');print(v'
while 1:
 for n in input('>>'):exec('v=m(v'+locals().get(n,'')+')')

Виписка-заява була для цього трохи хитра. Якщо підказка має закінчитися пробілом, додайте до числа один знак. :)

Пояснення

v є акумулятором.

mперевіряє , чи є дане значення -1або 256. Якщо так, 0буде повернуто значення, в іншому випадку.

У наступних рядках операції призначаються відповідним змінним (оскільки деякі мають однакове значення (як iі x), це коротше, ніж інстанціювання нового словника). Потім вони використовуються execнижче.

while 1: є основним циклом

Зараз починається веселощі. Як і рішення @jazzpi , воно повторює кожну таблицю введення. locals()це словник усіх поточних (видимих) змінних. З .get(n,'')відповідним ключем буде поміщено у рядок exec (порожній рядок, якщо ключ (= інший вхід) не знайдено). Це буде, після виконання, об'єднане vі передане назустріч m. Повернене значення буде збережено vзнову.

Короткий приклад:

Якщо n = 'i'( n= input-char), ми виходимо '+1'з locals-block, як iі змінна зі значенням '+1'.
Рядок для execніж виглядає наступним чином : 'v=m(v+1)'.
Можливо, тепер простіше бачити, що при виконанні він буде викликати mзначення v+1і зберігати його в vзнову.

Повторіть це, поки вам не набридне. :)


Я розумію, Я ДУЖЕ запізнююся на вечірку, але лямбда на м може бути y*(-1!=y!=256)на -3 байти
Відновіть Моніку

всього 5 років :) спасибі за вклад, хоча. Я занадто ледачий , щоб виправити відповідь немає , але я буду тримати це на увазі
Dave J

3

Пітон 2, 139

a=0
while 1:
 for c in raw_input(">> "):
  if c in'ix':a+=1
  if c=='d':a-=1
  if c in'sk':a*=a
  if c in'oc':print a
  if a in(-1,256):a=0

Це акуратно, але також досить просто. Ось довша, крутіша версія:

def i(a):
 while 1:
  c=yield
  if c in'ix':a+=1
  if c=='d':a-=1
  if c in'sk':a*=a
  if c in'oc':print a
  if a in(-1,256):a=0
 j=i(0);next(j)
while 1: 
 for c in raw_input(">> "):j.send(c)

Вага в 190 символів, це, мабуть, не найконкурентніша відповідь. З іншого боку, супроводи є доволі раді, і я завжди шукаю привід використовувати (і ділитися) ними


3

TI-BASIC, 104 107 102 100 98

Для калькуляторів серії TI-83 + / 84 +.

Назвіть це prgmD; він врешті-решт переповнює стек, називаючи себе. Замініть рекурсію на a While 1, ціною двох байтів, щоб виправити це.

Input ">>",Str1
For(I,1,length(Str1
int(.5inString("?ixskd?oc",sub(Str1,I,1
If Ans=4
Disp Y
imag(i^Ans)+Y^int(e^(Ans=2     //decrements when Ans=3; increments when Ans=1
min(0,Ans(Ans≠256→Y
End
prgmD

Y за замовчуванням дорівнює 0, тому будь-ласка, запустіть це за допомогою калькулятора, щойно очищений пам'яттю, або збережіть 0 до Y вручну, перш ніж це запустити.

Шкода, що малі літери (у рядкових літералах) - два байти кожна; інакше це буде коротше, ніж відповідь Дома Гастінгса.

EDIT: виправлено помилку ділення на нуль (0 ^ 0) вартістю трьох байтів.

107 -> 102: Використовував уявний трюк експоненціації для збереження чотирьох байтів (включаючи 1 з дужок та -1 від подовження рядка пошуку) та використовував Y замість X, для ініціалізації потрібен один менший байт.


2

Постскрипт 272

/cmd<</i{1 add}/x 1 index/d{1 sub}/s{dup mul}/k 1 index/o{dup =}/c 1 index>>def
0{(>> )print flush{/f(%lineedit)(r)file def}stopped{exit}if{f
1 string readstring not{exit}if cmd exch 2 copy known{get exec}{pop pop}ifelse
dup -1 eq 1 index 256 eq or{pop 0}if}loop pop}loop

Безголовки:

/cmd <<  % define commands
/i { 1 add }
/x 1 index
/d { 1 sub }
/s { dup mul }
/k 1 index
/o { dup = }
/c 1 index
>> def
0        % accumulator on stack
{
    (>> )print flush   % print prompt
    { /f (%lineedit) (r) file def } stopped {exit} if  % read input line or quit
    {
        f 1 string readstring not {exit} if   % read 1-char string from line
        cmd exch 2 copy known { get exec }{ pop pop } ifelse   % execute command or don't
        dup -1 eq 1 index 256 eq or { pop 0 } if   % adjust accumulator if needed
    } loop
    pop
}loop

2

C (224 212 символів)

Це, мабуть, поганий вибір мови, але добре. Це не така мова, як C, може зробити краще, ніж деяка динамічна мова програмування. У Clang вам потрібно буде вказати значення return(це не потрібно для gcc).

#define s(x,y)case x:y;break;
main(){int c=10,a=0;for(;;){switch(c){s(-1,return)s('i':case'x',++a)s('d',--a)s('s':case'k',a*=a)s('c':case'o',printf("%d\n",a))s(10,printf(">> "))}a!=-1&a!=256||(a=0);c=getchar();}}

Чи не буде коротше просто видалити define qта просто використовувати printf?
Дверна ручка

@DoorknobofSnow Насправді ні. qвикористовується 3 рази, тому define qекономить ~ 2 символи.
Джастін

2

Луа, 230 228

a=0repeat io.write(">> ")x=io.read()for i=1,#x do c=x:sub(i,i)if c=="i"or c=="x"then a=a+1 elseif c=="d"then a=a-1 elseif c=="s"or c=="k"then a=a*a elseif c=="o"or c=="c"then print(a)end if a==256or a==-1then a=0 end end until _

Не найгірший, не найкращий.

ПРИМІТКА: як повідомляє @mniip, 256or можливо, не працює у вашому перекладачі. Більше інформації в коментарях.

(більш-менш) читана версія:

a=0
repeat
  io.write(">> ")
  x=io.read()
  for i=1,#x do
    c=x:sub(i,i)
    if c=="i"or c=="x"then
      a=a+1
    elseif c=="d"then
      a=a-1
    elseif c=="s"or c=="k"then
      a=a*a
    elseif c=="o"or c=="c"then
      print(a)
    end
    if a==256or a==-1then
      a=0
    end
  end  
until _

Вихід:

>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>

Редагувати: завдяки @mniip за оптимізацію 2 символів: until nil->until _


repeat until x(x дорівнює нулю, як це не було визначено) на 2 символи коротше, і while 1 do endточно такої ж довжини, крім тієї, яка версія lua це? 256orнедійсний синтаксис в моєму перекладачі
mniip

@mniip Дякую за підказку про repeat until x. Я використовую останні вікна двійкові звідси . Як ви бачите, a=a+1 elseifє місце. Це тому, що eце шістнадцяткова цифра, а oв 256or- ні, тому мій інтерпретатор приймає orяк інше твердження / блок / howYouCallIt.
Egor305

так, крім того 256or, також 0repeatі 1then; Я використовую офіційний lua від lua.org, ваш код не компілюється ні в 5.1, 5.2, ні в 5.3
mniip

2

Haskell , 186 178 байт

Це повинно виконуватися з runhaskell(або всередині ghci) , так як вони обидва встановити BufferModeв NoBufferingза замовчуванням , які сейфи досить багато байт:

infix 4#
-1#x=0#x
256#x=0#x
r#x:y=case x of 'i'->r+1#y;'x'->r+1#y;'d'->r-1#y;'s'->r^2#y;'k'->r^2#y;'o'->print r>>r#y;'c'->r#'o':y;_->r#y
r#_=putStr">> ">>getLine>>=(r#)
main=0#""

Спробуйте в Інтернеті!

Пояснення

Це визначає новий оператор state # source(декларація нерухомості дозволяє нам відмовитися від круглих дужок при використанні його в сполученні з іншими операторами (+), (-), (^), (:)і (>>)):

  • перші два рядки "фіксують" стани -1і256
  • Потім він відповідає першому персонажу і діє на нього
  • як тільки у нього не вистачає символів ( r#_), він читає нові та починає знову зберігати старий стан

Для запуску процесу ми ініціалізуємо стан з 0і читаємо новий рядок джерела, тобто. Почніть з порожнього джерела:

main=0#""

1

Windows Batch, 204 256

@echo off
set a=0
:a
set /p i=^>^> 
if %i%==i set /a a=%a%+1
if %i%==x set /a a=%a%+1
if %i%==d set /a a=%a%-1
if %i%==s set /a a=%a%*%a%
if %i%==k set /a a=%a%*%a%
if %i%==o echo %a%
if %i%==c echo %a%
if %a%==256 set a=0
if %a%==-1 set a=0
set i=n
goto a

Інші команди успішно ігнорує. Дійсно роздувся без orроботи з ...

Редагувати:

Виправлено:

  • Більше немає Відлуння всіх команд
  • Зробили це насправді ДО математики з / а
  • Скинути на -1
  • Скидання вводу після кожного циклу

Це коштувало 52 символи.

Не виправлено:

  • Квадратура 0 пише "0 * 0" в а.
  • Простір, що вводиться (або нічого не вводиться, коли ви тільки що відкрили його), завершує роботу сценарію.
  • Вам потрібно Вводити по одному знаку за раз.

2
Цей просто звичайний не працює взагалі (Windows 7). Я не хочу бути мудаком, але ти це тестував?
Марін

@marinus Це виправлено.
Timtech

1

Сценарій команд Windows - 154

Абусін невідомі особливості до макс.

@echo off
set i=1
set x=1
set d=-1
set/as=[*[-[
set/ak=[*[-[
set.=0
set/p.=^>^> 
set/a[=[+%.%
e%.:o=c%h%.:c=o% %[% 2>nul
set[=%[:-1=%
if;%[%==256 set[=
%0

1

> <> , 258 байт

Я зробив ще один відповідь, оскільки не міг перевірити фази, і він використовував попередньо складені команди, а не емуляцію оболонки.

0v
"<vooo">> 
!~>i:0)?v~ >
 ^?=a:  /  ^!?="c"v?="o":v?="s":v?="k":v?="d":v?="x":v?="i":
   voan:<        ~<  v*:~<      <  v-1~<  v+1~<      <
   <                 <             <      <vv?=-10:v?=*:+1f:
  v                                        <>      >~0

Це , безумовно , може бути golfed вниз, але я не впевнений , що я буду мати необхідну неосудність відвагу!

Я перевірив його з офіційним інтерпретатором, який працює під python 3.5 під cygwin під Windows 7 і міг відтворити тестовий запуск:

$ python fish.py deadfish.fish
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>> (pressed ctrl-Z)Stopped

Якщо ви не можете запустити його на вашій машині (введення здається складним) або ви просто хочете спробувати його без будь-якого іншого програмного забезпечення, ви можете використовувати наступну версію в онлайн-перекладачі .

0v
 <vooo">> "<
  >i:0)?v~
      o:/  ^!?="c"v?="o":v?="s":v?="k":v?="d":v?="x":v?="i":
 ^oanoa:<        ~<  v*:~<      <  v-1~<  v+1~<      <
   <                 <             <      <vv?=-10:v?=*:+1f:
  v                                        <>      >~0

Він, очевидно, не враховує \ n та EOF, оскільки ви не можете ввести їх в онлайн-інтерпретаторі, але буде вести себе так, ніби натискали клавішу Enter після кожної команди виводу.


1

C (gcc) , 139 байт

Компілювати з -Dk="_nZZiaeY"(включеним у кількість байтів). -2 байти, якщо >>\nдозволено запит .

x;f(c){for(printf(">>");c=getchar()-10;x+=c--?c--?c--?c||printf("%i\n",x),0:x*x-x:-1:1,x*=~x&&x^256)c=strchr(k,c)-k>>1;f();}

Спробуйте в Інтернеті!

Дегольф

/** Preprocessor **/
-Dk="_nZZiaeY" // This is a lookup string; it corresponds to "ixddskoc",
               // with 10 deducted from each character. Upon compilation, 
               // all occurences of the string literal are replaced with a 
               // pointer to its location in memory.

/** Source **/
x;f(c){ // x: 32-bit accumulator, c: local variable for read character
    for(printf(">>"); // Start for-loop and print prompt.
            c=getchar()-10; // Read a character from STDIN.
                            // Loop breaks if it is '\n'.

            // The below happens at the end of each iteration.
            x+=c--?c--?c--? 
               // Find the correct operation by testing c and post-
               // decrementing with multiple ternary-ifs. If c is 0, 
               // operation was found, add the else-value to the 
               // accumulator x.
               //     If the character is invalid, the value of c is
               // very large, and will not reach 0 with 3 decrements.

               c||printf("%i\n",x),0 
               // If c-3 is 0, print accumulator, else do nothing.
               // Returns 0 regardless of what happens. (No change to x)
               :x*x-x 
               // Square. Results in x=x+x*x-x, and is shorter than (x*=x)
               :-1:1, 
               // Decrement, Increment.
               x*=~x&&x^256 
               // Because -1==0xffffffff, ~x==0 when x==-1. Likewise,
               // x^256==0 only when x==256. The logical-AND coerces the result
               // to boolean 1 (no match) or 0 (match). Multiplication resets
               // the accumulator as appropriate.
           )
        // This is the actual body of the for-loop
        c=strchr(k,c)-k>>1; 
           // Finds the index of the read character in the lookup string,
           // then "divides" it by two.
           // Because strchr() returns NULL (0) when character is not found,
           // deducting k from it results in a very negative number.
           // The right-shift results in division by 2 for positive numbers, 
           // while the negative numbers become very large positive numbers
           // (c >= 0x70000000) because of the 2's complement representation.
    // Finally, recurse until forceful termination.
    f();
}


0

Хаскелл, 230

import System.IO
i""n=[]
i(a:b)n 
 |a=='o'||a=='c'=[n]++i b n
 |True=i b$v a n
v a n=w(case a of 'i'->n+1;'x'->n+1;'d'->n-1;'s'->n^2;'k'->n^2)
w(-1)=0
w 256=0
w n=n
main=do;putStr ">> ";hFlush stdout;s <- getLine;print$i s 0;main

Якби тільки я міг позбутися цього примхливого hFlush stdoutдзвінка! Без нього підказка не відображається, поки не oбуде виконана операція. Будь-яка порада?


Ви можете позбутися від цього hFlush, використовуючи runhaskellзамість компіляції (див. Мою відповідь ), але щодо цього рішення воно недійсне і помилки виходять.
ბიმო

0

PHP + HTML 345

<form><?php $i=0;$o='';if(isset($_GET[i])){$i=$_GET[a];foreach(@str_split($_GET[i]) as $j=>$v){$v==i||$v==x?$i++:($v==d?$i--:($v==k||$v==s?$i*=$i:($v==o||$v==c?$o.=$i."\n":'')));($i==256||$i==-1)&&$i=0;}$_GET[p].='>> '.$_GET[i]."\n".$o;echo"<textarea locked name=p>$_GET[p]</textarea><input type=hidden name=a value=$i><br>";}?>>> <input name=i>

вихід трохи схематичний (історія / сеанс відображається на текстовій області, і при включеному повідомленні про помилки друкується багато попереджень), але все працює


0

> <>, 239

v
\r0&
v                  <
\&::&01-=$f1+:*=+?v
v             &0~&<
\:"i"=?v
       >~&1+&      ^
\:"d"=?v
       >~&1-&      ^
\:"s"=?v
       >~&:*&      ^
\:"o"=?v
       >~&:o&      ^
\:"h"=?v
       >~;        (^)
>~                 ^

Початковий стек - це вхід. Ви можете спробувати онлайн тут .


0

Golf-Basic 84, 88 символів

:0_A:0_O:1_I:2_D:3_S:O_C:I_X:S_Kl`1i`N@A=256:0_A@N=0d`A@N=1:A+1_A@N=2:A-1_A@N=3:A^2_Ag`1

Запрошує по одній команді одночасно, як принаймні у 3 інших рішеннях. Ось пробний запуск для xiskisc:

?X
?I
?S
?K
?I
?S
?C
             289

Також xisksoвиводить 0, як слід.


Які інші рішення підказують по одній команді одночасно?
Ри-

1
Я написав Haskell, і ні, це не так. Так само, як і Perl, я не знаю, про що ти говориш.
Ри-

1
Це не відповідає правилам вводу / виводу.
marinus

1
Все ще не дотримується правил, і використовує великі літери, а не малі.
lirtosiast

1
Якщо ви знаєте про TI-BASIC, він підтримує лише великі літери.
Timtech

0

JavaScript (Node.js), 204 байт

process.openStdin(f=a=>process.stdout.write((i=0,""+a).split` `.map(x=>([...x.slice(0,-1)].map(d=>({i:x=e=>i++,d:e=>i--,s:k=e=>i*=i,o:c=e=>e,x,k,c})[d](i=-1||i==256?i=0:0)),i))+"\n>> "),f``).on("data",f)

Це, ймовірно, може бути гольф. Node.js знову доводить, що це дивне замасковане багатослів’я ще раз. Код пояснено:

process.openStdin( // This function has to be called to take input, but doesn't have arguments
  f=a=> // Define a function f. This is the deadfish interpreter. It takes an argument `a` which is a Buffer
  process.stdout.write( // Same as console.log, but doesn't output trailing newline
    (i = 0, "" + a) // Take advantage of comma operator to (A) define the accumulator i, and casts a (which is a Buffer) to a String
      .split` ` // Split the string a at spaces, making it an array
      .map(     // Map through each element of the array
        x=>     // Map function, takes argument x, the value in the array (string)
          ([...x.slice(0,-1)] // Remove the last character (newline) and than use the spread operator to divide the string into an array of it's chars
            .map(d=> // Map function, you know how this works
              ({ // Here I define the various deadfish commands
                i: x = e => i++,
                d: e => i--,
                s: k = e => i*=i,
                o: c = e => e,
                // Take advantage of ES6 object notation. Equivilent to {"x": x, "k": k, "c", c}
                x,
                k,
                c
              })
              [d] // Get the command to execute. If this is passed something which isn't valid, a giant error will appear
              (
                i==-1 || i==256 ? i = 0 : 0 // Take advantage of the fact that none of the command functions take arguments to handle the strange "overflow"
              )
            ),
          i)
      ) +
  "\n>> "), // Display the prompt again, as well as a newline
  f`` // Initalize the prompt by passing an empty script
)
.on("data",f) // Bind the f function to newline on STDIN

0

C #, 311 байт

using System;class p{static void Main(){int a=0;int s(int b)=>b==-1||b==256?0:b;while(true){Console.Write(">>");var c=Console.ReadLine();for(int i=0;i<c.Length;i++){switch(c[i]){case'i':case'x':a=s(a+1);break;case'd':a=s(a-1);break;case's':case'k':a=s(a*a);break;case'o':case'c':Console.WriteLine(a);break;}}}}}

було б 283 байт, якщо вставки та декларації класу тощо можуть бути опущені, просто надавши визначення функції

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.