3varインタープリターを作成してください!


24

3varでの変異体であるdeadfish Rは、結果変数として使用されている間、アキュムレータA、B及びR. A及びBであると呼ばれる3つの変数を使用します。

この課題では、この言語の簡略版のインタープリターを作成する必要があります。

必要なコマンド:

i   Increments A
d   Decrements A
s   Squares A
p   Prints A
P   Prints the ASCII character of A
>   Sets A to R
a   Increments B
k   Decrements B
m   Squares B
o   Prints B
O   Prints the ASCII character of B
<   Sets B to R
+   Adds A and B, stores in R
-   Subtracts B from A, stores in R
*   Multiplies A and B, stores in R
/   Divides A by B, stores in R
w   Prints R
@   Resets A to 0
#   Resets B to 0
e   Resets R to 0

他のすべて(空白を含む)は無視されます。

明確化

  • oそしてpそれの後に何もせずに出力すべき。
  • 除算は整数除算です。
  • 255を超える数と0未満の数がサポートされています。
  • 'w'はRの後にスペースまたは改行を出力する必要があります
  • 0による除算はエラーなしで停止します。(STDERRへの出力なし)
  • A、B、Rは最初は0

ルール

  • これはので、最短の答えが勝ちます。
  • 同点の場合、最も古い回答が勝ちます。
  • ファイルは、コマンドライン引数またはSTDINを介して提供されます。
  • 任意の言語が許可されています。
  • 評価が許可されます。

テストケース

Hello world! (エソランから撮影)

iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP

出力20spooky22me

iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO

出力9P-1420 100 3Q-1 162 0

iiispsdPkokmo/w<+w#aaaommO-w@ii*wew

リーダーボード

これは、通常のリーダーボードと言語別の勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
@ Sp3000それについて言えば、私は最近、インタープリターのネストされたループのバグの修正を手伝いました。
LegionMammal978

2
Deadfishに精通している人々への追加の説明:期待どおり、0ではなくdddddp-5およびiiiissp256になります
。– Sp3000

1
テストケースでは何の用量rですか?有効なコマンドのリストに含まれていません
-JimmyJazzx

1
@JimmyJazzxこれでテストケースが編集されましたが、完全な3var言語でrはすべてをリセットします。と同じ@#eです。
DJgamer98

1
インタープリターの開始時にA、B、およびRは0に初期化されていますか?
トニー・エニス

回答:


7

CJam、112

q{"+-*/dspP>@ikmoO<#awe"_@#\4<"X2 U|{TU :V;}P?"S/f*'T"( _*T cT;V;0)"2/f+":T;"f+_'Tf/'Uf*+"VS 0:V; "S/++=~}%Pa/0=

オンラインで試す

説明:

プログラムは、実行されるコードの配列を作成し、各文字に対応する部分を実行します。CJamにはまだ「ブレーク」演算子がないため、ゼロによる除算を処理することはより困難です。代わりに、プログラムはπをマーカーとしてプッシュし(そうでない場合は浮動小数点数が表示されないため)、最後に最初のπの前の出力のみを保持します。
また、プログラムはCJamで0で事前初期化されているため、A、B、Rの代わりに変数T、U、Vを使用します。

q            read the input
{…}%         transform each character
  "…"        push a string with all the 3var commands, in a convenient order
  _@         duplicate the string and bring the current character to the top
  #          find the index of the character in the string (or -1 if not found)
  \          swap with the other string copy
  4<         keep only the first 4 characters ("+-*/")
  "…"        push a string that will be used for implementing those operators
  S/         split by space into ["X2" "U|{TU" ":V;}P?"]
  f*         join with each of '+', '-', '*', '/' -> 4 strings
  'T         push the 'T' character
  "…"        push a string with implementations of commands involving A
  2/         split into pieces of length 2
  f+         prepend 'T' to each piece
  ":T;"f+    append ":T;"to each piece
  _          duplicate the array (containing full A-command implementations)
  'Tf/       split each piece by the 'T' character
  'Uf*       join each split piece using the 'U' character
              practically replacing 'T' with 'U'
              to obtain B-command implementations
  +          concatenate the 2 arrays
  "…"        push a string containing implementations for "w" and "e", 
              separated by space; the string also ends with a space
  S/         split by space, obtaining the implementations for "w" and "e"
              and an empty string, for handling unrecognized characters
  ++         concatenate with the A and B command and +-*/ implementations
  =          get the corresponding string implementing the current command
              if the character was not found, -1 will get the empty string (no-op)
  ~          execute it
Pa/          split the array of results by the π separator
0=           get the first piece (before the first π, if any)

実際のコマンドの実装(プログラムによって構築):

+: X2+U|{TU+:V;}P?    if (1+2)|U != 0, set V=T+U, else push π
-: X2-U|{TU-:V;}P?    if (1-2)|U != 0, set V=T-U, else push π
*: X2*U|{TU*:V;}P?    if (1*2)|U != 0, set V=T*U, else push π
/: X2/U|{TU/:V;}P?    if (1/2)|U != 0, set V=T/U, else push π
d: T( :T;             set T=T-1
s: T_*:T;             set T=T*T
p: TT :T;             push T and set T=T (no-op)
P: TcT:T;             push T converted to character and set T=T (no-op)
>: T;V:T;             push and pop T (no-op) and set T=V
@: T;0:T;             push and pop T (no-op) and set T=0
i: T):T;              set T=T+1
k: U( :U;             set U=U-1
m: U_*:U;             set U=U*U
o: UU :U;             push U and set U=U (no-op)
O: UcU:U;             push U converted to character and set U=U (no-op)
<: U;V:U;             push and pop U (no-op) and set U=V
#: U;0:U;             push and pop U (no-op) and set U=0
a: U):U;              set U=U+1
w: VS                 push V and a space
e: 0:V;               set V=0
(default): (empty)    no-op

10

JavaScript(ES7)208213223237241 311

Edit3互いにコピーすると、Iとデンドロビウムは一緒に崩壊します。

Edit2 EcmaScript 7を使用してわずか2バイトを節約し、AとBの処理を結合

編集ルールの変更に従ってください。

注、古い例のHello worldrを実行するためだけに、質問に必要のないコマンドを追加しました

V=p=>(o='',[for(c of'@#e'+p)eval('++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'.replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B').split`,`[k%13])],o)

// More readable
U=p=>(
  o='',
  [for(c of'@#e'+p)
   eval(
   '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
   .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
   .split`,`[k%13])]
  ,o
)

// ES6, no array comprehension, 2 bytes more
W=p=>
  [...'@#e'+p].map(c=>
    eval(
    '++x,--x,x*=x,x=R,x=0,o+=x,o+=String.fromCharCode(x),R=A+B,R=A-B,R=A*B,R=A/B|0,R=0,o+=R+` `'
    .replace(/x/g,(k='ids>@pP+-*/ewakm<#oO'.indexOf(c))<13?'A':'B')
    .split`,`[k%13]),
    o=''
  )&&o

// Test
function test() 
{ 
  OUT.innerHTML = V(I.value) 
}

test()
textarea { width: 75%; height: 8em }
Test program <button onclick="test()">Run</button><br><textarea id=I>
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
</textarea><br>Output<pre id=OUT></pre>


次のように、文字列を処理する前に実際の3var関数を使用してこれらの変数を削除および設定すると、2バイトを節約 できますA=B=R=0,[...'@#e'+p]
ここにユーザー名を挿入します

2
@insertusernamehere thx、これが大好きです
-edc65

8

GNU Sed(dc式を評価するevalオプション付き)、254

Deadfishはのサブセットにかなりうまくマッピングされますdc。そのため、マッピングを行うためにsedを使用します。

s/^/@#e/
s/\+/AB+r/g
s/-/AB-r/g
s/\*/AB*r/g
s|/|AB/r|g
s/a/B1+b/g
s/i/A1+a/g
s/d/A1-a/g
s/s/Ad*a/g
s/p/An/g
s/P/AP/g
s/>/Ra/g
s/k/B1-b/g
s/m/Bd*b/g
s/o/Bn/g
s/O/BP/g
s/</Rb/g
s/w/Rn/g
s/@/0a/g
s/#/0b/g
s/e/0r/g
s/[ABR]/l&/g
s/[abr]/s\u&/g
s/.*/dc -e'&'/e

8

JavascriptをES6 ES7、217の 215 213 208バイト

f=s=>(O='',[for(c of'@#e'+s)eval('v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "'.replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]).split`,`[x%13])],O)

非ゴルフ

f=s=>(
    O='',                                                                   // initialize output to empty string
    [for(c of'@#e'+s)eval(                                                  // initialize A, B, and R, loop over all chars in input, eval returned function string
        'v=0,++v,--v,v*=v,O+=v,O+=String.fromCharCode(v),v=R,R=0,R=A+B,R=A-B,R=A*B,R=A/B|0,O+=R+" "' // operation list
            .replace(/v/g,'AB'[(x='@idspP>e+-*/w#akmoO<'.indexOf(c))/13|0]) // replace all instances of v with either A or B
            .split`,`[x%13])],                                              // split ops list, select corresponding function string
    O)                                                                      // return output string

1
+1それほど遠くないが、より良い。今、私は別の何かを試してみる必要があります
-edc65

1
次のように、文字列を処理する前に実際の3var関数を使用してこれらの変数を削除および設定すると、2バイトを節約 できますA=B=R=0,for(c of '@#e'+s)
ここにusernameを挿入します

1
@insertusernamehereああ、かなり賢いですね、ありがとう!
デンドロビウム

あなたの答えを修正すると、コマンドの改行を出力しないことがw
わかりました

「Rの後にすべき出力に空白や改行『W』」明確弾状態のedc65一つ@
デンドロビウム

6

APL、191

{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}

これは、プログラムを引数としてとる関数です。例:

      ∆3var←{0::→⋄A B R←0⋄{⍵∊G←'aikdms<>':⍎'AB'[1+2|G⍳⍵],'+-*∘'[M],'←','112R'[M←⌈2÷⍨G⍳⍵]⋄⍵∊G←'PpOo':⍞←⎕UCS⍣(2|G⍳⍵)⊢A B[⌈2÷⍨G⍳⍵]⋄⍵∊G←'+-*/':R∘←⌊A(⍎'+-×÷'[G⍳⍵])B⋄⍵∊G←'@#e':⍎'ABR'[G⍳⍵],'∘←0'⋄⍵='w':⍞←R}¨⍵}
      ∆3var 'iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO'
20spooky22me

無名関数として使用できますが、わかりやすくするために名前を付けました。

説明:

  • 0::→:エラーが発生した場合(ゼロ除算など)、エラーメッセージを出力せずに停止します
  • A B R←0:変数を初期化する
  • {... }¨⍵:各コマンド:

    • ⍵∊G←'aikdms<>':コマンドがタイプvar←fn(var、x)のいずれかである場合、適切なfnxを見つけ、それらを置き換えて評価します。
      • :評価する
      • 'AB'[1+2|G⍳⍵:in Aの位置が偶数の場合、そうでない場合。'aikdms<>'B
      • '+-*∘'[M]:(M後で定義)に応じて、加算、減算、累乗、またはなし
      • '←': 割り当てます
      • '112R'[M←⌈2÷⍨G⍳⍵]:(1加算と減算の場合)、2(電力の場合)、およびR(何もない場合、つまり変数をに設定するだけですR)に応じてM、コマンドが1番目、2番目、3番目、または4番目のペアに属するかどうかによって異なります。
    • ⍵∊G←'PpOo':出力:
      • ⍞←:出力
      • ⎕UCS⍣(2|G⍳⍵):ASCII(ウェル、ユニコード)またはコマンドが奇数又は偶数位置にあったかどうかに依存して数PpOo
      • ⊢A B[⌈2÷⍨G⍳⍵]AまたはB、コマンドが前半か後半かによって異なります。
    • ⍵∊G←'+-*/:数学:
      • R∘←⌊A(⍎'+-×÷'[G⍳⍵])B:指定さRれた演算子をAand に適用した結果に設定しBます。
    • ⍵∊G←'@#e': リセット:

      • :評価する
      • 'ABR'[G⍳⍵]:適切な変数を選択
      • '∘←0':ゼロに設定
    • ⍵='w':⍞←R:コマンドがw出力の場合R


4

C、253 241バイト

#define _ c--?c--?c--
k="id@s>ak#m<e+-*/wpoPO",*p;main(c,a,b,r){for(a=b=r=0;~c;c=getchar())c=strchr(k,c),c&&(c-=k,p=&a+c/5,*p=_?_?_?_?_?printf(c?c<3?"%d":"%c":"%d ",c?c%2?a:b:r):a/(b?b:exit()):a*b:a-b:a+b:0:r:b*b:0:b-1:b+1:r:a*a:0:a-1:a+1);}

このコードは、文字列id@s>ak#m<e+-*/wpoPOをコマンドのテーブルとして使用します。文字列は、計算された式の宛先に従って配置されます。それぞれの変数を更新する5つのコマンドがあるのは、たまたま起こります。

  • id@s> -更新 a
  • ak#m< -更新 b
  • e+-*/ -更新 r
  • wpoPO-更新... abおよびの後のメモリ位置r。私はそれがあまり重要ではないことを願っています:)

そのため、コマンド文字列内で入力文字を見つけた後、そのインデックスは繰り返し減少し、0に達すると式が選択されます。

15減算しても0にならない場合は、 printf適切に選択された引数が使用されます。

また、除算する場合、次の呼び出しにより0による除算を回避します。 exit()ます。

それはそれを想定しているので、このコードでは、最適化なしでコンパイルされなければならないabr(ないCPUレジスタの)スタックに隣接するアドレスに配置されています。

また、ポインターを整数に、またはその逆に変換するため、32ビットモードでコンパイルする必要があります。


4

VBA、484、453 380バイト

勝つことを切望するが、物事の超シンプルな方法、Nothing Fancy just good old Select Case

整数除算とDiv 0エラー処理を追加する多くのバイトを
削除すると、エラー処理が削除され、通常のエラー処理と同じ機能が得られるようです。Int Divisionが正常に機能するように修正しました。また短くなりました。

Function Y(x)
For Z=1 To Len(x)
w=Mid(x,Z,1)
Select Case w
Case"i":A=A+1
Case"d":A=A-1
Case"s":A=A^2
Case"p":Y=Y &A
Case"P":Y=Y &Chr(A)
Case">":A=R
Case"a":B=B+1
Case"k":B=B-1
Case"m":B=B^2
Case"o":Y=Y &B
Case"O":Y=Y &Chr(B)
Case"<":B=R
Case"+":R=A+B
Case"-":R=A-B
Case"*":R=A*B
Case"/":R=A\B
Case"w":Y=Y &R &vbCrLf
Case"@":A=0
Case"#":B=0
Case"e":R=0
End Select
Next
End Function

31 104バイトを節約してくれたHenrik Ilgenに感謝


2
ない完全に確認してくださいかのVBAで、この作品(それはVB6でない)、しかし、あなたが使用してバイトの束を救うことができるDefInt A-Zことにより、明示的に宣言する必要を省略し、ABおよびRとしてIntegerDefInt A-Z:Dim A, B, R。宣言なしでそれらを割り当てるだけでも同様に機能する可能性がありますA=0:B=0:R=0。計算バリアントでも機能する はずです。
ヘンリックイルゲン

@HenrikIlgen、たくさん感謝DefIntします。私が毎日使っているものではありませんが、将来的には非常に便利なゴルフVBAになることを忘れました。悲しいA=0ことに、私のテストからそれが二重のように振る舞います。そこiiiaa/wでは、全体ではなく小数の結果を生成します。
-JimmyJazzx

1
整数除算に\を試してください;)
ヘンリックイルゲン

1
実際に結果を印刷する必要がないと仮定して、関数にして戻り値を使用して結果を「構築」
すると

3

PHP、310バイト

を使用して私の人生で初めてeval

for($A=$B=$R=0;$c=$argv[1][$i++];)eval([i=>'++$A',d=>'--$A',s=>'$A*=$A',p=>'echo$A',P=>'echo chr($A)','>'=>'$A=$R',a=>'++$B',k=>'--$B',m=>'$B*=$B',o=>'echo$B',O=>'echo chr($B)','<'=>'$B=$R','+'=>'$R=$A+$B','-'=>'$R=$A-$B','*'=>'$R=$A*$B','/'=>'$R=$A/$B',w=>'echo$R','@'=>'$A=0','#'=>'$B=0',e=>'$R=0'][$c].';');

最初のコマンドライン入力を取得します。

php 3var.php "iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO"

例からの出力:

こんにちは世界!
20spooky22me


3

C、357

マクロFTW!

(私は冗談です-cはこれに勝つことはありません)

#define X(p,e) case p:e;break;
#define Y(p,a,b,c,d,e,f) X(a,p++)X(b,p--)X(c,p*=p)X(d,printf("%d",p))X(e,printf("%c",p%256))X(f,p=R)
A,B,R;main(int C,char**V){for(;*V[1];)switch(*V[1]++){Y(A,'i','d','s','p','P','>')Y(B,'a','k','m','o','O','<')X('+',R=A+B)X('-',R=A-B)X('*',R=A*B)X('/',R=A/(B?B:exit(0),1))X('w',printf("%d",R))X('@',A=0)X('#',B=0)X('e',R=0)}}

2

JavaScript(ES6)、293 262バイト

f=x=>(o="",a=b=r=0,p=String.fromCharCode,[...x].map(c=>{if(eval(`m={i_a++,d_a--,s_a*=a,p_o+=a,P_o+=p(a),">"_a=r,a_b++,k_b--,m_b*=b,o_o+=b,O_o+=p(b),"<"_b=r,"+"_r=a+b,"-"_r=a-b,"*"_r=a*b,"/"_r=a/b|0,w_o+=r,"@"_a=0,"#"_b=0,e_r=0}[c]`.replace(/_/g,":_=>")))m()}),o)

使用法

f(`iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP`)

=> "Hello world!"

説明

不明な言語の詳細(整数サイズ、認識できない文字の処理など)がありますが、このソリューションは十分に機能するようで、テストケースの改行のような空白文字を無視します。

f=x=>(
  o="",                           // o = output string
  a=b=r=0,
  p=String.fromCharCode,
  [...x].map(c=>{                 // iterate through each character
    if(                           // if used for NOP characters (whitespace)

      // Functions:
      eval(`m={
        i_a++,
        d_a--,
        s_a*=a,
        p_o+=a,
        P_o+=p(a),
        ">"_a=r,
        a_b++,
        k_b--,
        m_b*=b,
        o_o+=b,
        O_o+=p(b),
        "<"_b=r,
        "+"_r=a+b,
        "-"_r=a-b,
        "*"_r=a*b,
        "/"_r=a/b|0,
        w_o+=r,
        "@"_a=0,
        "#"_b=0,
        e_r=0
      }[c]`.replace(/_/g,":_=>")) // dynamically add common characters

    )m()                          // execute the function
  }),
  o                               // return the output string
)

1
辞書をevalで囲み、すべて:$=>$で置換してから文字列の置換を追加すると、数バイト節約できると思います。
コナーオブライエン

2

シンプレックスv.0.8、211バイト

(UTF-8エンコード。)

h@u]u2ƒ§I]ƒ§M]ƒ§^O]ƒ§o]ƒ§s]ƒ§@]ƒ§Ah]ƒ§Sh]ƒ§Mh]ƒ§Vh]ƒ§&oh]ƒðI]ƒðM]ƒð^O]ƒðo]ƒðs]ƒð@]ƒðAh]ƒðSh]ƒðMh]ƒðVh]ƒð&oh]ƒ§z]ƒðz]ƒuz@]{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}

説明

これは私がこれまで書いた中で最も長いシンプレックスプログラムであるため、一般にこれがどのように機能するかを箇条書きで説明します。

  • h@u] -マクロ0を定義します。このマクロは単にレジスタに書き込み、ラムダが何も返さないようにします。
  • u2-上記のストリップに移動し、現在のバイトを2に設定します。これは、定義されるラムダのアリティを定義します。
  • ƒ-ラムダ式の開始。一度完了]、ラムダ関数をラムダスタックにプッシュします。ポインタから(アリティ)セルをローカルストリップに取り込み、完了後、現在のバイトが書き込まれていない限り、ローカルストリップを取り込まれたセルに設定します。ポインターは影響を受けません。マクロ0を使用すると、ストリップ内の何も変更せずに関数を返すことができます。
  • § -現在のストリップの最初に書き込まれたセルに移動 Aます。
  • ð-現在のストリップの最後に書き込まれたセルに移動しBます。
  • {"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
    • {...Ï} 入力スタックが空になるまで繰り返します
    • "idspP>akmoO<+-*/w@#e" -コマンド
    • Rly -ストリップをタプルに入れます
    • G^u -タプルの入力のインデックス
    • ·-現在のバイトthをラムダエバリュエーターにロードする
    • uRL-ストリップ保持に移動しAB(書き込みA、およびBそれらが存在しない場合)
    • -ラムダを実行します(これはラムダエバリュエーターです)
    • -ストリップの下でリセット

あー私は感銘を受けています。シンプレックスの場合は長いですが、他のすべての場合は短いです。;)


2

ミンコラン0.11バイト

これはさらにゴルフができると確信していますが、楽しかったです。また、別の言語の最初のMinkolangインタープリター!

>I3&000V$Vod?.45*[di1q=5&]x00wx1i2+kw
idspP>akmoO<+-*/w@#e
vr1+r
vr1-r
vr2;r
v0c1$((dl%"0"+$rl:d)$Ok
v0cO
vrx0cr
v1g1+1G
v1g1-1G
v1g2;1G
v1c1$((dl%"0"+$rl:d)$Ok
v1cO
v1gxd1G
vx$d+
vx$d-
vx$d*
vx$dd?.:
vdN
vrx0r
v1gx01G
vx0

ここで試してみてください。

説明

>I3&000                    Initializes A, B, and R if they don't already exist.
V$V                        An idiom that ensures no time-travel.
od?.                       Reads in a character and halts if input is empty.
45*[di1q=5&]               Looks through the second row for a matching character.
            x00w           Jumps back to beginning if no match.
                x1i2+kw    Jumps to corresponding line upon match.

残りの行は非常に単純です。ただし、おそらくを含むものは例外で1$((dl%"0"+$rl:d)$Ok、末尾のスペースなしで数字を出力するイディオムです。(私はまだ、これを数値に文字列に変換する機能を実装していません1Z。これはそうなります。)ああ、はい、それらはすべてv先頭にあり、それが先頭に戻ります。


2

GNU Sed(DC式を評価するevalオプション付き)、289

a)違法文字は無視する必要があり、b)dcは1つの引数で変換されたプログラム全体を必要とし、c)0で除算するとプログラムがエラーなしで終了する必要があることに気づかなかったDigital Traumaに触発されました。

これらのすべてのルールが適用されない場合、私の解決策はたった235バイトの長さです;)

H
$!d
x
s/^/@#e/
s:[^-a><de/+i*k@w#opsmOP]::g
s:[e@#]:0&:g
s:[-*+/pPid]:Q&:g
s:[-kaoO*+/]:H&:g
s:[><w]:Z&:g
s:[diak]:1&:g
s:s:Q2^>:g
s:m:H2^<:g
s:[-+*/]:&e:g
s:[ia]:+&:g
s:[dk]:-&:g
y:Oop:Pnn:
s:w:n32P:g
s:[id>@]:sq:g
s:e:sz:g
s:[#<ka]:sh:g
s:[QHZ]:l\l&:g
s:/:d0=t/:g
s/.*/dc -e'[q]st&'/e

2

AWK、311 309

func p(z,f,x){if(c~z)printf"%"f,x}BEGIN{FS=z}{for(i=0;++i<=NF;){c=$i;A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;p("p","d",A);p("P","c",A);B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;p("o","d",B);p("O","c",B);R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;if(c~"/")if(B)R=A/B;else exit;p("w","d ",R)}}

printfの周りにTIL括弧は必要ありません。2バイトが節約されました!

読みやすくするためのゴルフのないバージョン:

func p(z,f,x) {
    if(c~z) printf "%"f,x
}

BEGIN {
    FS=z
}

{
    for(i=0;++i<=NF;){
        c=$i;
        A=c~/i/?A+1:c~/d/?A-1:c~/s/?A*A:c~/@/?0:c~/>/?R:A;
        p("p","d",A);
        p("P","c",A);
        B=c~/a/?B+1:c~/k/?B-1:c~/m/?B*B:c~/#/?0:c~/</?R:B;
        p("o","d",B);
        p("O","c",B);
        R=c~/+/?A+B:c~/-/?A-B:c~/*/?A*B:c~/e/?0:R;
        if(c~"/")if(B)R=A/B;else exit;
        p("w","d ",R)
    }
}

1

Python 2、272

import sys;a,b,r=0,0,0;exec';'.join(filter(None,map(dict(x.split(':')for x in"a:b+=1|@:a=0|#:b=0|/:r=a/b|d:a-=1|PXchr(a)|i:a+=1|-:r=a-b|k:b-=1|*:r=a*b|m:b*=b|oXb|pXa|s:a*=a|OXchr(b)|wXr|+:r=a+b|e:r=0|<:b=r|>:a=r".replace('X',':print ').split('|')).get,sys.stdin.read())))

これは機能しません。あなたのprint文は、末尾の改行が含まれます。
グリフィン

1

ルビー、199バイト

a=b=r=0
$<.read.chars{|c|eval %w{a+=1
a-=1
a*=a
$><<a
$><<a.chr
a=r
b+=1
b-=1
b*=b
$><<b
$><<b.chr
b=r
r=a+b
r=a-b
r=a*b
b==0&&exit||r=a/b
puts\ r
a=0
b=0
r=0
p}["idspP>akmoO<+-*/w@#e".index(c)||-1]}

.read新しいバージョンのRubyでstderrに出力される警告を許容できる場合は、2行目から削除することで5バイトを節約できます。


1

Python、244

import sys;P=sys.stdout.write;A=B=R=0;exec';'.join(filter(None,map(dict(zip('idspP>akmoO<+-*/w@#e','A+=1 A-=1 A**=2 P(`A`) P(chr(A)) A=R B+=1 B-=1 B**=2 P(`B`) P(chr(B)) B=R R=A+B R=A-B R=A*B R=A/B print(R) A=0 B=0 R=0'.split())).get,input())))

少し遅れましたが、行きたいと思いました。


1

プロローグ、759バイト

最短のプログラムではありませんが、少なくとも構造化され、読みやすいプログラムです。

q(A,B,R,i,X,B,R):-X is A+1.
q(A,B,R,d,X,B,R):-X is A-1.
q(A,B,R,s,X,B,R):-X is A*A.
q(_,B,R,>,R,B,R).
q(A,B,R,a,A,X,R):-X is B+1.
q(A,B,R,k,A,X,R):-X is B-1.
q(A,B,R,m,A,X,R):-X is B*B.
q(A,_,R,<,A,R,R).
q(A,B,_,+,A,B,X):-X is A+B.
q(A,B,_,-,A,B,X):-X is A-B.
q(A,B,_,*,A,B,X):-X is A*B.
q(_,0,_,/,_,_,_):-!,1=2.
q(A,B,_,/,A,B,X):-B>0,X is A/B.
q(_,B,R,@,0,B,R).
q(A,_,R,#,A,0,R).
q(A,B,_,e,A,B,0).
q(A,B,R,p,A,B,R):-write(A).
q(A,B,R,'P',A,B,R):-A>0,format('~c',A).
q(A,B,R,'P',A,B,R):-write(A).
q(A,B,R,o,A,B,R):-write(B).
q(A,B,R,'O',A,B,R):-format('~c',B).
q(A,B,R,'O',A,B,R):-write(B).
q(A,B,R,w,A,B,R):-write(R),nl.
q(A,B,R,_,A,B,R).
f([],_,_,_).
f([H|T],A,B,R):-q(A,B,R,H,X,Y,Z),f(T,X,Y,Z),!.
p(X):-atom_chars(X,Y),f(Y,0,0,0).

入力例

p('iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO').

こちらからオンラインでお試しください

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