3番目のFlak!


19

このチャレンジは、2018年4月のLotMチャレンジの一部として投稿されました


Brain-Flakはチューリングターピット言語であり、PPCGでかなりの名声を得ています。この言語の記憶は2つのスタックで構成されています、ウィザードのWh eによって「隠された」3番目のスタックが発見され、Brain-Flakプログラムの興味深い新しい考え方につながりました。

だから、その貧しい隠された3番目のスタックの可視性を高めるのはどうですか?3番目のスタックに値する認識を持つ言語を作成しましょう!ここでThird-Flakを紹介します。

言語

Third-Flakには、3番目のスタックと呼ばれるスタックが1つだけあります。オペレータは、彼らが脳高射砲で行うのと同じ方法で、第三スタック上で動作しますが、ここには存在しない[]{}<>niladsなし{...}モナドは(サード高射砲プログラムでのみ許容文字があるので()[]<>)。各演算子の動作は次のとおりです(最後の要素がスタックの一番上にあるリストを持つ3番目のスタックを表す例を示します)。

  • ()Third-Flakで唯一の2文字演算子です。3番目のスタックの最上部を1つ増やします。例:[1,2,3][1,2,4]

  • ([<:前ケースによって覆われていないすべての開口括弧プッシュ0第三のスタックに。例:[1,2,3][1,2,3,0]

  • )3番目のスタックから2つの要素をポップし、それらの合計をプッシュバックします。例:[1,2,3][1,5]

  • ]3番目のスタックから2つの要素をポップし、2番目から1番目を減算した結果をプッシュバックします。例:[1,2,3][1,-1]

  • >3番目のスタックから要素をポップします。例[1,2,3][1,2]

そして、言語の他の規則は次のとおりです。

  • 実行の開始時に、3番目のスタックには単一の0のみが含まれます。

  • []または<>プログラム内に置くことは禁じられています(Third-Flakのセマンティクスに従う場合は、とにかく何もしませんが、実際にはBrain-Flakではここで再作成することはできません)。

  • プログラムの最後にある末尾の閉じ括弧が欠落している可能性があるという事実を除いて、括弧は常にバランスを取る必要があります。例として、[()<(()有効なThird-Flakプログラムがあります(プログラムの最後の3番目のスタックはになります[1,0,1])。

  • プログラムには、許可された6文字のみを含めることができます()[]<>。プログラムは空でないことが保証されています。

注:これは、空のスタックからポップする必要がある状況に対処する必要がないという以前のルールによって暗示されています。

チャレンジ

シンプルで、Third-Flakのインタープリターを作成します。プログラムは、入力としてThird-Flakプログラムを受け取り、プログラムの最後の3番目のスタックの状態を出力として返す必要があります。

出力形式は、3番目のスタックの状態を明確に読み取ることができ、同じ番号が常に同じ方法でエンコードされる限り柔軟です(これは、出力形式が露骨な方法ではないことを示す方法です)不正行為を試みることは問題ありません)。

出力の選択により、チャレンジが簡単にならない限り、管理できる数値の範囲が制限される場合があります(これがデフォルトの抜け穴になるため)。

テストケース

各テストケースでは、最初の行が入力であり、2行目が出力スタックであり、スタックの最上部が最後の要素である数字のスペース区切りリストとして表されています。

[()<(()
0 1 0 1

[((((()()()()()))
0 0 0 5

((([()][()][()])))
-3

[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0

[()]<(([()])><[()]
-1 0 -1

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2

スタックは0で初期化されていますか?それ以外の場合[()]は、空のスタックからポップすることを心配する必要がないというルールを破ります
ジョーキング

1
@JoKing Yep:「実行の開始時に、3番目のスタックには単一の0のみが含まれます」。その部分を少し強調する必要があるかもしれませんが、見逃しがちだったのではないかと思いました。
レオ

おっと、どうしてそれを見逃したのかわからない
ジョーキング

7
eはまだeです。
小麦ウィザード

2
誰もそれを見ることができない場合、バツ印eここにあります
user202729

回答:


21

Brain-Flak、276バイト

{({}<>)<>}<>{(((()()()()()){})((({}){})())(({})({}{}([{}])(<>))))((()()(){[()]<{}>}{}){()<{{}}>}{}<<>({}({})())>{()(<{}>)}{}<>)<>}<>{(([{}]()<>)){{}({}())((){[()](<({}())((){[()](<({}())((){[()](<{}([{}]{})>)}{}){(<{}{}>)}{}>)}{}){(<{}({}{})>)}{}>)}{}){(<{}{}({}())>)}}{}<>}<>

オンラインでお試しください!

これが来ることを知らなければなりませんでした。


4

網膜0.8.264の 48 46バイト

\(\)
_
[([<]
¶
+1`¶(.*)\)|(.*)¶\2]|¶.*>
$1
%`_

オンラインでお試しください!スタックを下から上に出力します。負でない整数でのみ機能し、最後のテストケースは遅すぎるため、リンクには3つのテストケースのみが含まれます。説明:スタックは暗黙的にプログラムの前にあるため、単一のゼロを表す空のストリングとして開始されます。()niladがになっている_他のオープンブラケットは、彼らが直面しているとしてスタックに上のゼロを押して改行になっている間に、単項でカウントするために使用されています。閉じ括弧は一度に1つずつ処理されるため、スタックは正しくなります。)一緒に上の2つの要素を追加し、前の改行を削除し、]トップ要素を削除し、従って、それを減算スタックに前の要素からそれを一致し、そして>一番上の要素を削除するだけです。最後に、スタックが10進数に変換されます。編集:@Leoのおかげで2バイト保存されました。


何の$3ためですか?(とにかく素晴らしい答え!)
レオ

@Leoこれは以前のゴルフの残り物です。見つけてくれてありがとう!
ニール

4

Pythonの3145の144 132 122 116 109 104バイト

レオのおかげで-7バイト!

そして-Lynnに感謝します!

s=[0]
for i in input().replace('()',' '):s+=i in']>) 'and(i<'!'or(2-ord(i)%5)*s.pop())+s.pop(),
print(s)

オンラインでお試しください!

かなり標準的な実装。しかし、今ではあまり読めません。しかし、開始ブラケットと終了ブラケットを確認するより短い方法を見つけられなかったのは残念です。

ワンライナーでのいくつかの試み:

  • 124バイト(無名関数):

    lambda c:[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())or s for s in[[0]]for i in c.replace('()',' ')][0]
  • 115バイト(フルプログラム):

    s=[0];[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())for i in input().replace('()',' ')];print(s)

追加は、単純な割り当てよりも煩わしく長い


~-']>)'.index(i)(2-ord(i)%5)4バイトを節約することができます。
リン

2

ルビー98 91バイト

->s{a=[i=0];s.chars{|c|a<<("([<"[c]?s[i,2]["()"]?1:0:a.pop*~-"]>)".index(c)+a.pop);i+=1};a}

オンラインでお試しください!

私の最初のコードは、Jo KingのPythonの答えと同じように機能しました。そのため、ソース文字をループする前に、すべての()部分文字列を別の文字で置き換え、個別の演算子として使用しました。

しかし、少なくともRubyでは、これを行わないのがゴルファーであることが判明しましたが、むしろ少し面倒なアプローチを採用しています。ここではi、ソース文字列内での位置を追跡する追加のインデクサーを維持し、開始ブラケットに遭遇するたびに、現在の文字と次の文字s[i,2]()演算子を形成しているかどうかを先読みチェックします。その場合、スタックの先頭に0ではなく1をプッシュ)し、次のステップでクロージングにその仕事をさせます。


1

05AB1E、25バイト

΄()1:v"0+0\0->"žuykè.V})

オンラインでお試しください!

説明

Î                           # initialize the stack with 0 and the input
 „()1:                      # replace any occurrence of "()" in the input with 1
      v                }    # for each char y in this string
                žuyk        # get its index in the string "()[]<>{}"
       "0+0\0->"    è       # use this to index into the string "0+0\0->"
                     .V     # eval
                        )   # wrap the stack in a list


1

R182 177バイト

function(P){for(k in utf8ToInt(gsub("\\(\\)",7,P))%%8){if(k%in%0:4)F=c(0,F)
if(k==7)F[1]=F[1]+1
if(k==1)F=c(F[2]+F[3],F[-3:0])
if(k==5)F=c(F[2]-F[1],F[-2:0])
if(k==6)F=F[-1]}
F}

オンラインでお試しください!

スタックの一番上が最初で一番下が最後であるスタックを返します。

スワップ()7して、コードポイントが文字列よりで作業が容易とgolfierある個別の数値を、取得するために8を国防省計算します。

Rのベクトルの先頭で作業する方がゴルファーなので、スタックをそのように構築します。

それから)、またはを見ると、k==1追加して削除するのがゴルファーなので、スタックの一番上に余分なゼロを追加します。



1

セイロン、285 266バイト

function f(variable String c){variable Integer[]s=[0];value o=>[s[0]else nothing,s=s.rest][0];void u(Integer i)=>s=[i,*s];while(c!=""){if(c[0:2]=="()"){u(1);c=c.rest;}switch(c[0])case(')'){u(o+o);}case(']'){u(-o+o);}case('>'){noop(o);}else{u(0);}c=c.rest;}return s;}

オンラインでお試しください!

(Leoの提案により、19バイト保存されました。)

フォーマットおよびコメント:

// Interpreter for ThirdFlak
// Question:    /codegolf//q/163242/2338
// This answer: /codegolf//a/163403/2338
//
// This function takes the code as a string, and returns the value
// of the stack as a sequence of Integers.
function f(variable String c) {
    // stack, in the beginning just a single 0.
    // Top element of the stack is the first, because push + pop is easier this way.
    variable Integer[] s = [0];
    // pop – used like an Integer variable (not a function – this saves the `()`), but has side effects.
    value o =>
        // `s[0]` is the first element of the stack. We tell the compiler
        // that it is non-null (otherwise we'll get an error at run time)
        // using the `else nothing`. `s.rest` is `s` without its first element.
        // Both together are wrapped into a 2-tuple, of which we then take just
        // the first element, to have both together in an expression instead
        // the longer way using an accessor block with a temporary variable and a return.
        // value o {
        //   value r = s[0] else nothing;
        //   s = s.rest;
        //   return r;
        // }
        [s[0] else nothing, s = s.rest][0];
    // push
    void u(Integer i) =>
        // a tuple enumeration, using the spread argument.
        s = [i, *s];
    // the main loop
    while (c != "") {
        if (c[0:2] == "()") {
            // »`()` is the only two-characters operator in Third-Flak. It increases the top of the third stack by 1.«
            // As `)` alone adds the two top elements together, we can just push a one here, and let the handling for `)` do the rest.
            u(1);
            c = c.rest;
        }
        switch (c[0])
        case (')') {
            // »`)` pops two elements from the third stack and pushes back their sum.«
            u(o + o);
        }
        case (']') {
            // »`]` pops two elements from the third stack and pushes back the result of subtracting the first from the second.«
            // As the o written first is the first one, we can't write this as a subtraction.
            u(-o + o);
        }
        case ('>') {
            // »`>` pops an element from the third stack.«
            // `o;` alone is not a valid statement, so we pass it to the `noop` function.
            noop(o);
        }
        else {
            // all other valid code characters are `(`, `[`, `<`, which all just push a 0.
            u(0);
        }
        c = c.rest;
    }
    return s;
}

オンラインでお試しください!


:)私は本当にセイロンを知らないが、多分あなたは、スイッチの最初のケースを削除し、すべての開口部ブラケットを管理するために、他の部分を使用することができます
レオ

うーん、それはうまくいくと思います...無効な入力の動作を変更しますが、それは問題ではありません。
パエロエベルマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.