止まる問題を解決する私の試みを混乱させる


31

注:その性質上、この課題の仕様を理解することは困難です。少なくとも、計算可能性理論の新入生コース、または同等のバックグラウンドリーディングが必要です。さらに、チャレンジ自体はかなり難しいです。それに答えるには、選択した言語の一部のインタープリター全体を書く必要があり、それだけでなく、インタープリターはクインのようなものの形である必要があります。答えがこれをすべて行っていない場合、仕様を満たさないことはほぼ確実です。

この課題を解決するために、停止問題を(部分的にでも)解決する必要はありません。しかし、あなたはほぼ確実に行うことがフィーチャ、完全である必要はないが、(それが解釈し、同じ言語で書かれた、使用している言語の)インタプリタを書く必要があります。これが、これを興味深い挑戦にしています。

私は、仕様を満たす最初の回答に対して500ポイントの報奨金を授与することを約束しました。これは、ジョー・キングのBF回答に授与されます

チャレンジ

停止問題の解決不可能性のアランチューリングの証明の大まかな簡略版は、次のようになります。

F停止しているプログラムを解決するためのプログラムを書いたとします。つまりF、別のプログラムのソースコードを入力として受け取り、停止F(G)した1場合に戻りG0そうでない場合に戻ります。

しかし、プログラムを提供すると、入力としてプログラムを実行するF別のプログラムを作成できます。場合戻り、その後を返し、そうでなければ、それは意図的に無限ループに入ります。これは逆説につながり、結局停止問題を解決できないと結論付けなければなりません。HHF(H)0H0F

あなたの仕事はプログラムを書くHことですが、ひねりを加えて:私はあなたに私のプログラムを提供するつもりはありません。代わりに、プログラムは入力としてプログラムのソースコードを受け取ります。あれは:

  • あなたのプログラムは、私のプログラムをソースコード形式で入力として受け取ります。(たとえば、ファイルまたはコマンドライン入力として、詳細はあなた次第です。)

  • 私のプログラムはあなたのプログラムと同じ言語で書かれ、ソースコード文字列の形式で入力を受け取ります。

  • 場合は私のプログラムのリターンが0与えられたとき、あなたのプログラムを入力として、あなたのプログラムが停止(と返す必要があります0与えられたときに)私のプログラムを入力として。(「リテーリング0」の正確な意味はあなた次第です。)

  • 私のプログラムが停止しない場合、または0プログラムが入力として与えられた場合以外の何かを返す場合、プログラムは無期限に実行し続ける必要があります

ひねりは、それを本当にかなり難しくするために、次の規則に従う必要があるということです:

  1. いかなる種類の組み込み関数execまたはeval-type関数も使用できません。

  2. 独自のプログラムのソースコードを取得するために、「チート」メソッドを使用することはできません。(たとえば、「これを「プログラム」というファイルに保存する」と言ってopen(program)から、プログラムに入れることはできません。)

これは、プログラムが文字列の形式で独自のソースコードを再現できるだけでなく、記述された言語を正しく解析および解釈できる、ある種のクレイジーなスーパークインでなければならないことを意味します。

非常に難しいことを少し減らすために、選択した言語の(チューリング完全な)サブセットのみを使用することができます。あなたのプログラムがPythonで書かれていて、私のプログラムにifsとwhileループと基本的な文字列操作しか含まれていない場合にのみ機能するのであれば、あなたのプログラムもこれらのものだけを使用していれば問題ありません。(つまり、選択した言語の標準ライブラリ全体の実装について心配する必要はありません!)ただし、プログラムを実際に実行する必要があります-独自の言語を作成することはできません。

これはので、投票数が最も多い答えが勝ちます。ただし、上記のように、仕様を満たすことは非常に難しい課題であるため、私の判断に従って、最初の回答に対して500ポイントの賞金を授与します。

注意してください:私が使用した正確な言葉遣いを考えると、間違いなくこの挑戦​​で「だます」ことができる多くの方法があります。しかし、質問の精神に入る答えを本当に望んでいます。意図したとおりの挑戦は非常に難しいが可能ですが、私は本当にそれに対する真の解決策を期待しています。私の判断でチートな感じがする答えには賞金を授与しません。


注:このチャレンジは元々、として投稿されましが、「客観的な勝利基準」がないため2016年に終了し、再開するためにに変更しました。ただし、2018年1月の時点で、PPCGのは実際には禁止されていないことがわかりました(これが最新のメタディスカッションであるため)、そもそもサイトのポリシーに反することです。ポプコンは最近人気がないことを理解していますが、これは古い挑戦であり、その性質によりは本当に不適切ですスコアリングシステム。まだ許可されてはならないと強く感じている人がいる場合は、投票を開始する前にメタディスカッションをしましょう。最後に、去年誰かがソリューションをゴルフしようとして過ごしたという偶然について、それはこの挑戦と同じくらい競争力があり、と同じように賞金に値することを保証しバージョン。


1
戻るということは、終了コードまたは標準出力を意味しますか?または、両方とも受け入れられますか?
PlasmaPower

両方とも許容されます。
ナサニエル

@Nathaniel受け取ったコードをFファイルにエクスポートしてそれを送信することは違法importだと思いますか?; 3
cjfaure

1
私はこの質問がとても好きですが、理解するのは難しいです。他の誰かが問題を抱えている場合、これら2つのスライド(Javaの擬似コード)により、理解しやすくなりました。imgur.com
ハリー

1
「質問の精神」と「本物の解決策」に言及します。それはどういう意味ですか?私たちは自分たちの言語の通訳を自分で書くことになっていますか?別の方法を想像することはできません。
KSFT

回答:


23

brainfuck6013 4877 4376バイト

編集:-1136バイト。馬のデータを生成するより良い方法に切り替えました

Edit2:-501バイト。私の通訳を再訪し、数百バイトを削減しました

->++>++++>+>++>+++>>++++>>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>++++>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>+++>>+++>+>+++++>+++++>++++>>++>+>++>++>++>++>++>++>+++>>++>++>>++++>>+++>++>++>++>++>++>++++>+++++>>++>++>++>+>+++>>++++>>++>++>++>>++>++>++>>++>++>++>>++>++>++>++>++>++>>++>++>++>++>++>++>>++>++>++>>++>++>++>++>>++>++>++>++>++++>+>+++>>+++++>+++>>++>>+++++>>>++>>++>++>++>>+++++>+++++>>>++>++>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>++++>++++>++++>>+++>>>++++>>+++>>>++++>>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++++>+++>>++++>>+++>>>++++>>+++>>>++++>>+++>>>++++>+++++>+>+>++>++++>+>+++>+>++>>>++++>>+++>>+++>+>+>++++>++++>+++++>>++>+>+++>+>+++>>>++++>>+++>>++++>++++>+++++>+>++>>+++>>+++>+>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++>>>>++++>>+++>>>++++>>+++>+>++++>++++>+++++>+++>+>+++>>>>++++++>++++>>++>++>++>++>++>++>++>++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++++>+++>++>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>>>>>+++>+>+>+>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>++>++>++>++>>>>>+++>+>+>++>++>++>++>++++>+++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++>++>+>++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>>>>>+++>+>+>+++++>+>++++>++>+++>+>++++>>+++>>++++++>+++>>>>++>+>+>+>+>+++++>++++>+>+++>>++++>+++++>++++>+>+>+++>>++++>+>++>++++>>+++>>>++++>+>+++>+>+>++++>>>++>++++>+>+>++++>+>+++>+>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>++>+>+>++++>+>+++>+>+++>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>+>++>++>++++>+++++>>>++>+>+>+++>>>++++>>+++>>+++>+>+++>+>++++>+>+++>>+++++>+>+++>>+++++>++++>+>+>+++>>++++>+>++>++>++++>>+++>>>++++>+>+>+++>>++++>+>+>++>++++>+>+>++++>+>+++>>++++>+++++>+>+>++>>>+++>>+++++>+++++>++++>+>+>+++>>++++>++++>>+++>>++>+>+>++++>+>+++>+>+++>>++>++++>+>+>+++>>++++>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>>++>++++>>+++>>+++>+++>+>+>++++>+>+++>>+++++>+++++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++++++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>++++>++++>>+++>>++++>>+++>>>>++++>>+++>>>++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>+++++>+++>>++++>>+++>>++++>>+++>>>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>>++++>>>+++>>++++>+>+>+>++++>+>+>+++>+>++>>>>++++>>>+++>>+++++>+++>>++++>+++++>+++>+>+>++>++++>+>++++>+++++>>>++>+>+>+++>+>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>++>++>++++>+++++>+++++>>++++>+++++>+>+>++>>>+++>>+++>++>+>+>+++++>++++>++>++>+>+>+++>+>++++>+++++>>>>++++>>>+++>>++>+>+>+>++++>+>+>+++>+>+++>+>++++>+>+++>+>+++>+>++>++>++>++>++>++>++>++>>>++++>++>+>+>+++++>>>+++>>+++>>>++++>++++[<+]>[>[>]>[>]>++++++++++[-<++++++>]<++[<]<[<]<+>>-[[>]>[>]>+++++++[-<++++++>]<+[<]<[<]<+>>-]>]<--[>+<++++++]>++>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]>+>->>+>+++>-->>++[<]<<[<]<<[<]>[[[>]>>[>]>>[>]<[->>+<<]<[<]<<[<]<<[<]>-]>[>]>>[>]>>[>]>>[-<<+[<]<+>>[>]>]<<[[->+<]<]>>[>]>[[-<+>]>]<<[<]<<[<]<<[<]>]>>>[>]>>[>]<[[-]<]>>>,[>+++++++[<------>-]+<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<-<+++>>>>]<<<--------------[>]>[<++<+>>>>]<<<--[>]>[<-<+++++++>>>>]<<++++[-<------>]+<+[>]>[<++<+>>>>]<<<--[>]>[<-<+>>>>]<<-<[+]<[>]>,]>>>+<<<<-[<]>[-[<<]>[<+[>]>>[<]<<[>>+[<<[<]<<-[>>]<[>>>>[>]>+<<[<]<]<-[>>]<[>>>>[>]>-<<[<]<]<++[->>+<<]>>[>]>]<]<[<]>-<]>-[<<]>[<++[>]>>[<<]>[<<+[<<[<]>[-<<+>>]>--[<<]>[[>]>+<<[<]<]>+[<<]>[[>]>-<<[<]<]>+[>]>]]<<[<]>--<]>-[<<]>[[>]>>.<<<[<]<]>-[<<]>[[>]>>-<<<[<]<]>-[<<]>[[>]>>,<<<[<]<<<[<]<[<]>[[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]>[>]>[>]>>[<]<]>-[<<]>[[>]>>+<<<[<]<]>-[<<]>[[>]>>>[>>]>[<<<[<<]<+>>>[>>]>-]>[-]<<+[<[->>+<<]<]<[->>+<<]<[<]<]>-[<<]>[[>]>++[-->[-<<+>>]>]+<<-[++<<]<[->>>[>>]>+<<<[<<]<]<[<]<]<++++++++>>[+<<->>]>]>>[]

オンラインでお試しください!ここでの入力は,[.,]、プログラム自体を出力する単純なcatプログラム()です。

「リターン0」は、値0のセルでプログラムを終了することで定義されます。

私が過去に書いた2つのプログラム、馬と自己通訳の不浄な組み合わせ。最初のセクションはクイン部分で、データを取得して、データ生成とそれに続くソースコードをテープに取り込みます。次は自己解釈プログラム、プログラムを取得して実行します。これは通常のセルフインタープリターのほとんど変更されていないコピーです。ただし、入力を直接取得する代わりに、データセクションの先頭から入力を取得し、入力がない場合はセルを0に設定します。最後に、プログラムの現在のセルで終了してを実行し[]ます。戻り値が0の場合、私のプログラムはゼロで終了します。それ以外の場合は、無限ループを実行します。プログラムが永久に実行される場合、私のプログラムは永遠に実行されます。

使い方:

パート1:データ生成

->++>++++> ....... >+++++>>>+++>>+++>>>++++>+++

この部分は、クインのデータセクションを構成し、3270バイトのコードの圧倒的多数です。初めは、-データの先頭のマーカーです。それぞれ>+++は、このセクションの後のコードの文字を表します。

Number of Pluses
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
> | < | + | ] | [ | - | , | . |

パート2:データを使用してデータセクションを生成する

+[<+]>

[
    Add a right arrow
    >[>]>[>]>(10++++++++++)[-<(6++++++)>]<++[<]<[<]
    <+>>-
    Add the right amount of pluses
    [
        [>]>[>]>(7+++++++)[-<(6++++++)>]<+[<]<[<]<+>>-
    ]
    >
]
Add the beginning minus
<--[>+<++++++]>++

これは、パート1のデータを使用して、データの生成に使用される文字をコードセクションに追加します。>コードセクションの末尾にa を追加し、そのセルの値に多くのプラスを追加します。

パート3:データを使用して残りのコードを生成する

Initialises the 8 characters of brainfuck
>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]
>+>->>+>+++>-->>++[<]<<[<]<<[<]>

Tape looks like:
data 0 0 code 0 0 characters

Runs through the data destructively and adds the represented symbol to the code section
[
    [
        For each plus in this cell
            Shift the gap in the characters over one
        [>]>>[>]>>[>]<[->>+<<]
        <[<]<<[<]<<[<]>-
    ]
    Navigate to character
    >[>]>>[>]>>[>]>>
    Copy the character to the end of the code section
    [-<<+[<]<+>>[>]>]

    Shift the symbol section over one
    <<[[->+<]<]
    >>[>]>[[-<+>]>]

    Navigate to next byte of data
    <<[<]<<[<]<<[<]>
]

Remove characters
>>[>]>>[>]<[[-]<]

データセクションを破棄し、ソースコードの残りをコードセクションに追加します

パート4:入力プログラムを取得する

>>>,
[
    >(7+++++++)[<(6------)>-]+<-
    [>]>
    [plus <+<+>>>>]<<<
    -[>]>
    [comma <+<+>>>>]<<<
    -[>]>
    [minus <+<+>>>>]<<<
    -[>]>
    [dot <-<+++>>>>]<<<
    (14--------------)[>]>
    [left <++<+>>>>]<<<
    --[>]>
    [right <-<+++++++>>>>]<<
    (29++++[-<------>]+<+)
    [>]>
    [start loop <++<+>>>>]<<<
    --[>]>
    [end loop <-<+>>>>]<<
    -<[+]<[>]>,
]

入力されたプログラムを取得します。非ブレーンファック文字を削除し、各文字を数字で表します。

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
] | [ | . | - | , | + | > | < |

プログラムの終了を表します 255ます。

パート5:入力の解釈

Initialise simulated tape
>>>+<<<<-

[<]>
[
    -[<<]>
    [end loop
        co 0 0 0 e:  _1 0 0 0 1 ?
        Check if current cell is one
        <+[>]>>[<]<<
        co 0 0 1 e _1: 0 0 !0 1
        or
        co 0 0 1 e _1 0: 0 0 1
        [ If current cell is one navigate to corresponding start loop
            Create counter
            >>+
            [
                co 0 0 de _1 0 c: !0 1
                checks if next instruction is an end loop
                <<[<]<<-
                [>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>+<<[<]<] Add one to counter if it is
                checks if start loop
                <-[>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>-<<[<]<] Subtract one from counter if it is
                c ? 0: 0 de _1 0 c !0 1
                Adds two to counteract checks and move to the next instruction
                <++[->>+<<]
                >>[>]>
                c 0 0 ode _1 0 c: !0 1
                End on the counter
                    If the counter is 0 then we have reached the corresponding bracket
            ]
            c 0 0 2 de _1 0 0: !0 1 0
            <
        ]
        c 0 0 1?2 de _1 0: 0 0 1 0
        Subtract one from current instruction
            This executes the start loop code next but that does nothing
        <[<]>-<
    ]
    >-[<<]>
    [start loop
        c 0 0 0 de:  _1 0 0 ? 1
        <++[>]>>[<<]>
        c 0 0 2 de _1 0 0 0 1:
        or
        c 0 0 2 de _1 0 0: !0 1
        [ If current cell is 0 navigate to corresponding end loop
            Initialise counter
            <<+
            c 0 0 ode _1 0 c: 0 1
            [ While counter is not 0
                Transfer current instruction over (first instruction is guaranteed to be start loop)
                <<[<]>[-<<+>>]>
                co 0 0 de _1 0 c: 0 1
                Check if start loop
                --[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e _1 0 c 0 1
                [[>]>+<<[<]<] Add one to counter if so
                checks if end loop
                >+[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e:  _1 0 c 0 1
                [[>]>-<<[<]<] Subtract one from counter if so
                Add one to counteract checks and navigate to counter
                >+[>]>
                co 0 0 de _1 0 c: 0 1
                End on counter
                    If counter is 0 then we have reached the corresponding end loop
            ]
            co 0 1 e _1 0 0: 0 1
        ]
        co 0 0 2?1 e _1 0 0: ? 1
        Subtract two from the current instruction to bring it back up to the right value
        <<[<]>--<
    ]
    3 of these are pretty self explanatory
    Navigate to the current cell and execute the instruction on it
    >-[<<]>
    [output
        [>]>>.<<<[<]<
    ]
    >-[<<]>
    [minus
        [>]>>-<<<[<]<
    ]
    >-[<<]>
    [input
        Reset current cell
        [>]>>, (no more input so this is set to 0)
        co 0 0 0 e:  _1 0 0 0: 1 b 1 a 0 d 1 e 1 f
        Navigate to start of code section
        <<<[<]<<<[<]<[<]>
        d: ata 0 co 0 0 0 e _1 0 0 0 1 b
        or
        0: co 0 0 0 e _1
        Transfer next instruction to current cell
        [[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]
        0: ata 0 co 0 0 0 e _1 0 0 d 1 b
        or
        0: co 0 0 0 e _1
        Navigate back to the normal spot
        >[>]>[>]>>[<]<
    ]
    >-[<<]>
    [plus
        [>]>>+<<<[<]<
    ]
    >-[<<]>
    [right
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0 e:  _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Navigate to value of cell to the right
        [>]>>>[>>]>
        co 0 0 0 e _1 0 0 c 1 b 1 a 0 d: 1 e 1 f
        Transfer it to temporary cell
        [<<<[<<]<+>>>[>>]>-]
        co 0 0 0 e _1 d 0 c 1 b 1 a 0 0: 1 e 1 f
        Pop extra marker if it exists from the right cells and add one to the left
        >[-]<<+
        co 0 0 0 e _1 d 0 c 1 b 1 a 1: 0 0 e 1 f
        Transfer all left cells over 2 cells
        [<[->>+<<]<]<[->>+<<]
        co 0 0 0 e _1 0: 0 d 1 c 1 b 1: a 0 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    >-[<<]>
    [left
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0: e _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Add temporary marker
        [>]>++
        co 0 0 0 e _1 0 2: c 1 b 1 a 0 d 1 e 1 f
        Remove temporary marker and transfer all left cells over two
        [-->[-<<+>>]>]
        co 0 0 0 e _1 c 0 b _1 a _1 0 0: d 1 e 1 f
        Add marker to right cells remove marker from left cells and reset left cell's markers
        +<<-[++<<]<
        co 0 0 0 e _1 c: 0 b 1 a 0 0 1 d 1 e 1 f
        Transfer current cell to to right cells
        [->>>[>>]>+<<<[<<]<]
        co 0 0 0 e _1 0: 0 b 1 a 0 c 1 d 1 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    Add 8 to reverse checks
    <(8++++++++)>>

    Execute next instruction
    [+<<->>]>
]

プログラムを解釈します。通常のものとの唯一の違いは、入力が入力ではなくコードセクションの先頭から取得されることです。

パート6:戻り値が0でない場合は停止する

>>[]

プログラムの終了セルに移動します、戻り値が0でない場合は無限ループを実行し。0の場合、ループを終了して同じ0で終了します。

テスト入力:

常に0を返します(停止して0を返します)

(empty program)

常に1を返します(永久に実行されます)

+

256を加算したすべての入力を返します(211を返すため、永久に実行されます)

,[[->+<],]>

コードの最後の2文字が無限ループ([])の場合、0を返します(プログラムを指定すると、プログラムは0を返します。したがって、プログラムは停止します)

,[>,]>(9+++++++++)[-<(10++++++++++)>]<[-<-<->>]+<---[[-]>[-]<]<-[[-]>>[-]<<]>+>[-<->]<    

まだ読んでいる人のための楽しい事実

このプログラムへの入力がこのプログラムのソースコードである場合、再帰を開始し、このプログラムを実行する自己通訳を繰り返し作成してから、同じプログラムを再度提供します。これにより、brainfuckで実際の再帰プログラムを作成する上で興味深いアイデアが得られます。この質問のように戻り値をチェックして無限ループを開始する代わりに、戻り値を保存して処理することができます。簡単な例は、次のような階乗プログラムです。

If cell1 == 0:
    Get input into cell1
If cell1 == 1 or cell1 == 0:
    Return 1
Else:
    Initialise self-interpreter-quine function
    Pass cell1-1 into cell1 of the function
    Run function
    Multiply cell1 by the return value
    Return cell1

もちろん、再帰的な自己通訳を実行するとランタイムが指数関数的に増加することを考えると、これは完全に狂ったコーディング方法です。


わーい!ところで、もしあなたがこれをゴルフしたいなら、あなたの帰国大会を考えると、私はあなたがサポートをやめることができると思います.。これはもはやコードゴルフの質問ではないので、言語全体をサポートする方が印象的かもしれません。
Ørjanヨハンセン

@ØrjanJohansen、別のデータ生成方法だけに切り替えることで、おそらく1,000バイトほどゴルフをすることができます。また、ネガティブなセルをサポートしているため、自己通訳は私が書くことができる最小のものではありません。
ジョーキング

これは賞金を獲得するように見えますが、BFの専門家であるのではなく、それを理解するために時間をかけたいです。来週中に返事がない場合、私にpingできますか?
ナサニエル

1
私が知る限り、これが仕様を満たしていることを確認します。報奨金がまもなくあなたに届くはずです。(システムが私にそれを授与する前に遅れがあります。)答えてくれてありがとう、それは大歓迎です。
ナサニエル

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