중지 문제를 해결하려는 나의 시도를 혼란스럽게한다


31

참고 : 특성상이 문제에 대한 사양은 이해하기 어렵습니다. 아마도 계산 이론 또는 동등한 배경 읽기에 대한 신입생 과정이 필요합니다. 또한 도전 자체는 다소 어렵습니다. 응답하려면 선택한 언어의 일부 하위 집합에 대해 전체 통역사를 작성해야하며 통역사는 퀴네와 같은 형식이어야합니다. 귀하의 답변이이 모든 것을 수행하지 않는다면 사양을 충족시키지 않는 것이 거의 확실합니다.

이 문제를 해결하기 위해 정지 문제를 (일부라도) 해결할 필요는 없습니다. 그러나, 당신은 거의 확실 이 기능을 완료 할 필요는 있지만, (이 해석 같은 언어로 작성된 사용하는 언어의) 통역을 작성해야합니다. 이것이 흥미로운 도전이되는 이유입니다.

나는 사양을 충족하는 첫 번째 답변에 500 포인트 현상금을 수여하기로 약속했으며 이는 Jo King의 BF 답변에 수여됩니다 .

도전

중지 문제의 해결할 수 없다는 Alan Turing의 증명의 거칠고 단순화 된 버전은 다음과 같습니다.

F중지 프로그램을 해결하기 위한 프로그램 을 작성했다고 가정하십시오 . 즉, F다른 프로그램의 소스 코드를 입력으로 취하고 정지하면 F(G)리턴 되고 그렇지 않으면 리턴 1됩니다 .G0

그러나 내 프로그램 F을 제공하면 다른 프로그램을 구성 H하여 프로그램을 H입력으로 실행 합니다. Returns F(H)0then을 H반환 0하지만, 그렇지 않으면 의도적으로 무한 루프로 들어갑니다. 이로 인해 역설 F이 생겨 중단 문제를 해결할 수 없다는 결론을 내릴 수 있습니다.

당신의 임무는 프로그램을 작성하는 H것이지만 꼬인 것입니다 : 나는 당신에게 내 프로그램을주지 않을 것입니다. 대신, 프로그램은 내 프로그램의 소스 코드를 입력으로받습니다. 그건:

  • 귀하의 프로그램 은 소스 코드 형식의 입력으로 내 프로그램 을 수신 합니다. (예를 들어 파일 또는 명령 줄 입력으로 세부 정보는 사용자에게 달려 있습니다.)

  • 내 프로그램프로그램 과 같은 언어로 작성되며 소스 코드 문자열 형식으로 입력됩니다.

  • 경우 내 프로그램에 반환 0할 때 주어진 프로그램을 입력으로, 프로그램이 중단 (그리고 반환해야합니다 0) 주어진 내 프로그램 입력으로합니다. "복구 0" 의 정확한 의미는 귀하에게 달려 있습니다.

  • 경우 내 프로그램이 중단되지 않거나, 그 이외의 반환하는 경우 0입력으로 프로그램을 제공 할 때를, 프로그램이 무기한 계속 실행해야합니다.

트위스트는 실제로 훨씬 더 어렵게 만들려면 다음 규칙을 준수해야한다는 것입니다.

  1. 내장 함수 exec또는 eval-type 함수 는 사용할 수 없습니다 .

  2. 자신의 프로그램 소스 코드를 얻기 위해 "속임수"메서드를 사용할 수 없습니다. 예를 들어 "이 파일을 '프로그램'이라는 파일에 저장 한 다음 프로그램에 포함시킬 수는 없습니다 open(program).)

즉, 프로그램은 문자열 형식으로 자체 소스 코드를 재생할 수있을뿐만 아니라 작성된 언어를 올바르게 구문 분석하고 해석 할 수있는 일종의 미친 슈퍼 퀸이어야합니다.

약간 어렵게 만들기 위해 선택한 언어의 (완전한) 하위 집합 만 사용할 수 있습니다. 따라서 프로그램이 Python으로 작성되어 있고 내 프로그램에 ifs 및 while루프와 기본 문자열 연산 만 포함되어있는 경우에만 작동하는 경우 프로그램에서 해당 항목 만 사용하는 한 괜찮습니다. (이것은 선택한 언어의 전체 표준 라이브러리를 구현하는 것에 대해 걱정할 필요가 없음을 의미합니다!) 그러나 프로그램은 실제로 실행되어야합니다. 단지 자신의 언어를 구성 할 수는 없습니다.

이것은 이므로 가장 많은 표를 얻은 답이 이깁니다. 그러나 위에서 언급했듯이 스펙을 전혀 충족시키는 것은 심각한 도전이므로 판단에 따라 첫 번째 답변에 500 포인트 현상금을 부여합니다.

참고 : 내가 사용한 정확한 단어를 고려할 때,이 도전에서 "속임수"를 할 수있는 방법이 많이 있습니다. 그러나 나는 실제로 질문의 정신에 들어가는 답변을 기대하고 있습니다. 의도 한 도전은 매우 어렵지만 가능하며, 진정한 해결책을 찾고자합니다. 나는 내 판단에 불쾌감을 느끼는 답변에 현상금을 수여하지 않습니다.


참고 :이 도전 과제는 원래 로 게시 되었지만 "객관적인 승리 기준"이 없어 2016 년에 문을 닫았으며 다시 열기 위해 로 변경했습니다 . 그러나, 나는 월 2018대로, 것으로 나타났습니다 들 (과 PPCG에 금지 사실에없는 먼저 그것을 닫으면 사이트 정책에 반대했다, 그래서 가장 최근의 메타 논의되는). 나는 팝콘이 요즘 인기가 없다는 것을 이해하지만, 이것은 오래된 도전이며, 그 성격 때문에 부적합합니다.점수 시스템. 누구도 여전히 허용해서는 안된다고 강하게 느끼면 가까운 투표가 시작되기 전에 메타 토론을합시다. 마지막으로, 누군가가 작년에 자신의 솔루션을 골프화하려고 시도한 오프 기회에서 에서와 마찬가지로이 도전과 마찬가지로 경쟁력이 있으며 현상금에 걸 맞는 가치가 있음을 안심하십시오. 번역.


1
돌아온다는 것은 종료 코드 또는 표준 출력을 의미합니까? 아니면 둘 다 받아 들일 수 있습니까?
PlasmaPower

둘 다 허용됩니다.
Nathaniel

@Nathaniel 그것을 받아 들인 코드를 F파일로 내보내고 importing하는 것은 불법 입니까? ; 3
cjfaure

1
나는이 질문을 많이 좋아하지만 이해하기 어렵다. 다른 사람이 어려움을 겪고 있다면이 두 슬라이드 (Java psuedocode)를 이해하기가 훨씬 쉬워졌습니다. imgur.com/a/NRmyO
Harry

1
당신은 "질문의 정신"과 "진정한 해결책"을 언급합니다. 그게 무슨 뜻 이니? 우리는 우리 자신의 언어에 대한 통역을 직접 작성해야합니까? 다른 방법으로는 상상할 수 없습니다.
KSFT

답변:


23

brainfuck , 6013 4877 4376 바이트

편집 : -1136 바이트 quine에 대한 데이터를 생성하는 더 좋은 방법으로 전환

편집 2 : -501 바이트 내 통역을 다시 방문하여 수백 바이트를 줄였습니다.

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

온라인으로 사용해보십시오! 여기에 입력 된 것은,[.,]프로그램 자체를 인쇄하는 간단한 고양이 프로그램 ()입니다.

"Return 0"은 값이 0 인 셀에서 프로그램을 종료하여 정의됩니다.

과거에 내가 작성한 두 프로그램의 부정한 조합, 퀴네와 자기 해석기. 첫 번째 섹션은 quine 부분으로, 데이터를 가져 와서 테이프를 데이터 생성 및 소스 코드로 채 웁니다. 다음은 프로그램 을 취해 실행 하는 자체 통역사 입니다. 이것은 직접 입력하는 대신 데이터 섹션의 시작 부분에서 입력을 받고 더 이상 입력이 없으면 셀을 0으로 설정한다는 점을 제외하고는 일반적인 자체 인터프리터의 변경되지 않은 사본입니다. 마지막으로, 프로그램 의 현재 셀을 끝내고를 실행하십시오 []. 반환 값이 0이면 프로그램 이 0으로 끝납니다. 다른 것이면 무한 루프가 실행됩니다. 경우 프로그램이 영원히 실행,내 프로그램 은 영원히 실행됩니다.

작동 방식 :

1 부 : 데이터 생성

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

이 부분은 quine의 데이터 섹션을 구성하며 코드의 대부분은 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을 반환합니다 (영원히 실행 됨)

+

함께 추가 된 모든 입력, mod 256을 반환합니다 (211을 반환하므로 영원히 실행 됨).

,[[->+<],]>

코드의 마지막 두 문자가 무한 루프 경우 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

물론, 반복되는 자기 인터프리터를 실행하면 런타임이 기하 급수적으로 증가한다는 것을 감안할 때 이것은 완전히 미친 방식으로 코딩하는 방식입니다.


예이! BTW 만약 당신이 골프를 원한다면, 당신의 반환 컨벤션이 주어지면 나는 당신이지지를 떨어 뜨릴 수 있다고 생각합니다 .. 이것이 더 이상 코드 골프 문제는 아니지만 전체 언어를 지원하는 것이 더 인상적 일 수 있습니다.
Ørjan Johansen

@ ØrjanJohansen, 아마도 다른 데이터 생성 방법으로 전환하여 천 바이트 정도를 골프를 칠 수 있습니다. 또한, 자기 해석기는 음성 셀을 지원하기 때문에 내가 작성할 수있는 가장 작은 것이 아닙니다.
Jo King

이것은 현상금을이기는 것처럼 보이지만 BF 전문가가 아닌 시간을내어 이해하고 싶습니다. 다음 주에 시간이 들리지 않으면 핑 (ping) 할 수 있습니까?
Nathaniel

1
내가 알 수있는 한 이것이 사양을 충족한다는 것을 확인합니다. 현상금이 곧 당신에게 다가오고 있습니다. (시스템에서 수여하기까지 지연이 있습니다.) 답변 감사합니다. 대단히 감사합니다.
Nathaniel

1
Muriel에 관심이있을 수 있습니다 .
PyRulez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.