インタラクティブなDeadfishインタープリターを作成する


30

Deadfishは、4つのコマンドを備えたジョーク「プログラミング言語」です。Esolangページは少し矛盾しており、そのページのインタープリターはまったく同じように機能しないため、次のバリエーションを実装する必要があります。


仕様

  1. 少なくとも 16ビットのサイズのアキュムレータがあり、それ以上は許可されますが、それ以下は許可されません。負の数をサポートする必要はありません。アキュムレーターは0、プログラムの開始時にあります。
  2. 次の2セットの4つのコマンドがあり、プログラムは両方を同時にサポートする必要があります。
      標準Deadfish│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:ルビ入力を使用できますか?
マリヌス

GolfScriptチュートリアルによると、GolfScriptで入力を求めることはできません。すべての入力はSTDINから行われます。
ProgramFOX

@ProgramFOX:何か#{STDIN.gets}がうまくいくと思っていただろうが、実際にはうまくいかない。
マリヌス

代わりに大文字で入力することはできますか?
リトシアスト

回答:


6

K、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であることに注意してください。A 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 初期値でreduceを示します、すなわち 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}では、(null)を-1 256?x返し0N、nullを^検出するという事実に依存しているため、少し改善できます。
  • 「パーサー」は、4つの引数、つまり戻り値をラップ"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に感謝します!@Xcaliのおかげで4バイト節約


1
1アキュムレーターがオーバーフローすると、プログラムが印刷されます。また、あなたが変更することで、5つの文字で、あなたのプログラムを短縮することができます$a$?(に初期化され0、そしてあなたはPerlのからいくつかの外部プログラムを実行するまで変更されません)。
コンラッドボロウスキ

ああ、私は使用できる変数を探していました、完璧です、ありがとう!オーバーフローについてisssoは、個別に実行するのではなく、1つのコマンドとして実行する場合にのみ発生するため、気づいていませんでした$?。これについては後で説明します。ありがとうございました!
ドムヘイスティングス

だから私は''代わりに上部のコードセクションに古いバージョンを残したと思う""のでperl -e '...'、マップで使用すると、s///。再度、感謝します!
ドムヘイスティングス

OK、あなたは一番短いです。
マリヌス14年

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} -試合d-減少$xによって!!$xなり、0場合$x0、かつ1それ以外の場合は。これにより、アキュムレータがに到達しないことが保証され-1ます。
  • "s|k"{$x*=$x} -一致sまたはk-正方形
  • "o|c"{$x} -マッチ oまたはc-アキュムレータを出力
  • $x*=$x-ne256-によって乗算アキュムレータ0それがある場合2561ない場合

出力例

>>: 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私はそれを利用することができない恥、...
ドムヘイスティングス

ちょっとダンコ、テスト出力を投稿してください。非ウィンドウで電源シェルをテストできるとは思わない...(間違っている場合は修正してください!)
Dom Hastings

答えにテスト出力を追加しました。
ダンコドゥル

6

REBOL 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など、解除されました。私はそれをうまく機能させることができませんでしたが、彼らのhaskellを知っている人が行くには良い場所だと思います。
塩奈

@shiona:ええ、物事を維持することIOは、あまりにも頻繁に印刷することです(そのため、r n代わりにを使用しましたx)か、値が要求されないので十分ではありません... だから、どのように私は変わってしまうevオペレーターに?
Ry-

印刷でも同じ問題がありました。(例としてeを使用して)できる演算子に来るもの'i'%x=x+1;'d'%x=x-1...そして、単にvで呼び出しますdo n<-x;r$w$o%n。オペレーターがスペースを節約する理由は、オペレーターの周りにスペースが必要ないためです。
塩奈

@shiona:ああ!よろしくお願いします!
Ry-

問題ない。私は最初に自分の答えを作ることを考えましたが、大きなアイデアを働かせることができなかったので、同じ関数に対してまったく異なる表記でまったく同じコードを無礼に投稿するだけだと思いました。
塩奈

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

K、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実装を以下に示します。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
>>

Adaで実験した一部の人が最適化のヒントをくれたら、ありがたいです。


1
PPCGへようこそ!code-golfの目標は、可能な限り短いコードを作成することです。ヘッダーにプログラムのサイズを含める必要があります(ここでは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

C、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

Pythonの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,""))

これはの後に改行を出力します>>が、OPは許可されていないとは言いませんでした。 もう違います!

おかげでGlitchMrminitechgolfer9338


1
すぐに戻る関数のlambda代わりに使用できdefます。
コンラッドボロスキー

x in(-1,256)2文字を保存します。または、s=lambda x:"a=%d"%(x!=-1and x!=256and x)いくらか節約できます。
Ry-

1
代わりに削除print(">>")して使用できfor i in input(">>")ます。input()プロンプトを指定できます。次に、の後>>に改行がなくなり、文字を保存します。
golfer9338

あなたのスコアは、今、1文字短くなっているはずです。再確認してください。ただし、投稿された162ではなく161のカウントを取得します。3+ 40 + 8 + 107の行と3つの改行です。正直言って、私はjeしています。どちらの場合も、あなたは私のCの答えよりも数文字短いからです。乾杯!
ダレンストーン

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

Python 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,'')+')')

印刷ステートメントは、このためにちょっとトリッキーでした。プロンプトが空白で終わる必要がある場合は、カウントに1文字を追加します。:)

説明

v アキュムレータです。

m指定された値が-1またはであるかどうかを確認します256。もしそうなら、0返されます、そうでなければ値。

次の行では、操作は対応する変数に割り当てられます(一部の変数は同じ意味(iおよびなどx)を持っているため、これは新しい辞書をインスタンス化するよりも短いです)。それらはその後で使用されますexec以下でます。

while 1: メインループです

今から楽しみが始まります。@jazzpiのソリューションと同様に、入力の各文字を反復処理します。locals()現在のすべての(可視)変数の辞書です。で.get(n,'')対応するキーは、exec-文字列(キーが(=他の入力)見つからなかった場合は、空の文字列)に入れられます。これは、実行時に連結され、にv渡されmます。戻り値はに格納されますv再びます。

短い例:

Be n = 'i'n= input-char)、valueを持つ変数と同様'+1'locals-block から抜け出しiます'+1'。than
の文字列execは次のようになります'v=m(v+1)'
たぶん、見やすくなりました。実行時にm、の値で呼び出して、そのv+1出力をv再び保存します。

あなたが退屈するまでこれを繰り返します。:)


私はパーティーに非常に遅れていることに気付きますが、mのラムダy*(-1!=y!=256)は-3バイトにすることができます
モニカ

わずか5年:)入力をありがとう。私は答えを修正するのが面倒ですが、心に留めておきます
デイブJ

3

Python 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。最終的には自分自身を呼び出すことでスタックをオーバーフローさせます。While 1これを修正するには、2バイトのコストで再帰をに置き換えます。

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を手動で保存します。

(文字列リテラル内の)小文字がそれぞれ2バイトであることは残念です。そうでなければ、これはDom Hastingsの答えよりも短くなります。

編集:3バイトのコストでゼロ除算(0 ^ 0)エラーを修正しました。

107-> 102:虚数累乗法を使用して4バイト(括弧から1、ルックアップ文字列を長くする-1を含む)を節約し、Xの代わりにYを使用しました。


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実際にはありません。q3回使用されるため、define q2文字まで節約できます。
ジャスティン

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
>>

編集:2文字の最適化のための@mniipのおかげで:until nil->until _


repeat until x(xは定義されていないのでnilです)2文字短く、while 1 do end正確に同じ長さですが、それ以外のluaバージョンは何ですか?256or私の通訳に無効な構文は次のとおりです
mniip

@mniipについてのヒントをありがとうrepeat until xここから最新のWindowsバイナリを使用しています。ご覧のとおり、a=a+1 elseifスペースがあります。これeは、16進数字であるのに対しo、in 256orはそうではないため、インタープリターはor別のステートメント/ブロック/ howYouCallItとして解釈するためです。
Egor305

ええ、かなりのほかに256orも、0repeat1then。lua.orgの公式luaを使用していますが、コードは5.1、5.2、5.3のいずれでもコンパイルされません
mniip

2

Haskell186 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(修正宣言により、他の演算子と組み合わせて使用​​する場合に括弧を削除できます)(+)(-)(^)(:)および(>>)):

  • 最初の2行は状態-1を「修正」し、256
  • 次に、最初の文字に一致し、それに作用します
  • 文字(r#_)がなくなると、新しい文字を読み取り、古い状態を維持してもう一度やり直します

プロセスを開始するには、状態を初期化し0、新しいソース行を読み取ります。空のソースで始まります:

main=0#""

1

Windowsバッチ、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一緒に仕事するした...

編集:

一定:

  • これ以上のすべてのコマンドのエコー
  • / aで実際に数学を行うようにしました
  • -1でリセット
  • サイクルごとに入力をリセット

これには52文字かかります。

修正されなかった:

  • 0を二乗すると、aに「0 * 0」が書き込まれます。
  • スペースを入力すると(または開いたときに何も入力しないと)、スクリプトがクラッシュします。
  • 一度に1つの文字を入力する必要があります。

2
これは単なるプレーンではまったく機能しません(Windows 7)。私は嫌いな人になるつもりはありませんが、これをテストしましたか?
マリヌス

@marinus修正されました。
ティムテック14年

1

Windowsコマンドスクリプト-154

Abusin未知の機能を最大限に。

@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

それは確かにゴルフダウンすることができますが、私は必要な狂気の勇気があるかどうかはわかりません!

Windows 7のcygwinの下でpython 3.5の下で実行されている公式インタープリターでテストし、テスト実行を再現できました:

$ 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"(バイトカウントに含まれます)。プロンプト>>\nが許可されている場合は-2バイト。

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();
}

1

、68B

0{'::"ÿ1+=$0<+['_0"] \>\>\
,,,,?:o=[':."]:i=['1+"]:d=['1-"]:s=[':*"

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

ゴルフベーシック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つの他のソリューションのように、一度に1つのコマンドを要求します。のテスト実行はxiskisc次のとおりです。

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

また、必要にxiskso応じて0を出力します。


一度に1つのコマンドを要求する他のソリューションはどれですか?
Ry-

1
私はHaskellの1つを書きましたが、そうではありません。Perlもそうではないので、あなたが何について話しているのか本当に分かりません。
Ry-

1
これは、I / Oルールに従いません。
マリヌス

1
それでもルールに従わず、小文字ではなく大文字を使用します。
リルトシアスト

1
TI-BASICについて知っている場合、大文字の入力のみをサポートします。
ティムテック

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;}}}}}

関数定義を提供するだけでusingやクラス宣言などを省略できる場合、283バイトになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.