Заплутайте мої спроби вирішити проблему зупинки


31

Зверніть увагу: за своєю природою специфіка цього виклику важко зрозуміти. Ймовірно, потрібен хоча б першокурсник з теорії обчислень або еквівалентного фонового читання. Крім того, сам виклик досить важкий. Якщо відповісти на це, потрібно буде написати цілком перекладача для якоїсь підмножини на вашу обрану мову, і не тільки це, але і перекладач повинен бути у вигляді чогось на зразок квінти. Якщо у вашій відповіді все це не відбувається, майже не можна відповідати специфікації.

Вам не потрібно вирішувати проблему зупинки (навіть частково), щоб вирішити цю проблему. Тим НЕ менше, ви майже напевно зробити потрібно написати інтерпретатор (мови , який ви використовуєте, написані однією мовою він інтерпретує), хоча це не обов'язково повинен бути закінченим продуктом . Саме це робить це цікавим викликом.

Я пообіцяв присвоїти бонус у 500 балів за першу відповідь, що відповідає специфікації, і це буде присвоєно відповіді Джо Кінга BF .

Змагання

Приблизна спрощена версія доказу Алана Тьюрінга про нерозв'язність проблеми зупинки виглядає приблизно так:

Припустимо, я написав програму, Fяка призначена для вирішення програми зупинки. Тобто, Fприймає вихідний код іншої програми як вхідний і F(G)повинен повертатися, 1якщо Gзупиняється, і в 0іншому випадку.

Але якщо я даю вам свою програму, Fви можете побудувати іншу програму H, яка запускає мою програму Hяк її вхід. Якщо F(H)return, 0то Hповертається 0, але в іншому випадку він навмисно переходить у нескінченний цикл. Це призводить до парадоксу, і ми маємо зробити висновок, що Fврешті-решт проблема зупинки не може вирішити.

Ваше завдання - написати програму H, але з поворотом: я не збираюся давати вам свою програму. Натомість ваша програма отримає вихідний код моєї програми як вхідний. Це є:

  • Ваша програма отримає мою програму як вхідний текст у формі вихідного коду. (Наприклад, як файл або як введення командного рядка, деталі залежать від вас.)

  • Моя програма буде написана тією ж мовою, що і ваша програма, а також приймає дані у вигляді рядка вихідного коду.

  • Якщо моя програма повертається, 0коли ваша програма вводиться як вхідна, ваша програма повинна зупинятися (і повертатися 0), коли моя програма вводиться як вхідна. (Точне значення "повернення 0" залежить від вас.)

  • якщо моя програма не зупиняється, або якщо вона не повертає нічого, крім того, 0коли ваша програма була надана як вхідна, програма повинна продовжувати працювати нескінченно.

Поворот полягає в тому, що, щоб зробити це справді набагато складніше, ви повинні дотримуватися наступних правил:

  1. Ви не можете використовувати будь-яку функцію вбудованого execабо eval-типу.

  2. Ви не можете використовувати жодних методів "обману", щоб отримати вихідний код власної програми. (Наприклад, ви не можете сказати "збережіть це у файлі під назвою" програма ", а потім open(program)у своїй програмі.)

Це означає, що у вашій програмі має бути якась божевільна суперкінка, яка може не тільки відтворити власний вихідний код у вигляді рядка, але й здатна правильно розбирати та інтерпретувати мову, на якій написана.

Щоб зробити це трохи менш шалено важким, вам дозволяється використовувати лише (набір Turing) підбірки вибраної вами мови. Отже, якщо ваша програма написана на Python і працюватиме лише у тому випадку, якщо моя програма містить лише ifs та whileциклі та основні рядкові операції, тоді це нормально, доки ваша програма теж використовує ці речі. (Це означає, що вам не доведеться турбуватися про впровадження всієї стандартної бібліотеки вибраної вами мови!) Однак ваша програма дійсно повинна запускатися - ви не можете просто скласти свою мову.

Це , тому відповідь з найбільшою кількістю голосів виграє. Однак, як було сказано вище, це серйозне завдання просто задовольнити специфікацію, тому я присуджую першовідкладну суму в 500 балів, яка робить це відповідно до мого рішення.

Зверніть увагу: без сумніву, існує багато способів "обдурити" на цьому виклику, враховуючи точну формулювання, яку я використав. Однак я дуже сподіваюся на відповіді, що входять у дух питання. Виклик за задумом дуже важкий, але можливий, і я дуже сподіваюся побачити справжні рішення для нього. Я не присуджую нагороду за відповідь, яка в моїх оцінках почувається хитрою.


Примітка: цей виклик спочатку був розміщений як , але він був закритий у 2016 році через відсутність "об'єктивного критерію виграшу", і я змінив його на , щоб відновити його. Однак я виявив, що станом на січень 2018 року насправді не заборонена на PPCG (при цьому це остання мета-дискусія), тому закриття її в першу чергу було проти політики щодо сайтів. Я розумію, що попкони сьогодні не користуються популярністю, але це давнє завдання, і його природа робить його справді непридатним для система балів. Якщо хтось все ще сильно відчуває, що цього не можна допускати, то давайте проведемо мета-дискусію, перш ніж тісні голоси почнуть кидатися навколо. Нарешті, не випадково, що хтось витратив останній рік, намагаючись розіграти їх рішення, будьте впевнені, що він буде настільки ж конкурентоспроможним у цьому виклику і таким же гідним щедрості, як це було б у версія.


1
Повертаючись, ви маєте на увазі код виходу або stdout? Або обидва прийнятні?
PlasmaPower

Обидва прийнятні.
Натаніель

@Nathaniel Я вважаю, що експортувати отриманий код Fу файл було б незаконно import? ; 3
cjfaure

1
Мені це питання дуже подобається, але важко зрозуміти. Якщо хтось має проблеми, ці два слайди (на псуедо коді Java) мені значно полегшили розуміння: imgur.com/a/NRmyO
Гаррі

1
Ви згадуєте "дух питання" та "справжні рішення". Що ти маєш на увазі? Чи повинні ми самі писати перекладача для нашої мови? Я не уявляю іншого способу зробити це.
KSFT

Відповіді:


23

brainfuck , 6013 4877 4376 байт

Редагувати: -1136 байт Переключено на кращий спосіб генерування даних для quine

Edit2: -501 байт. Переглянув мій самоперекладач і скоротив його на пару сотень байт

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

Спробуйте в Інтернеті! Тут введена проста програма для котів (,[.,]), яка буде друкувати програму.

"Повернення 0" визначається закінченням програми на комірці зі значенням 0.

Нечесна комбінація двох програм, про які я писав у минулому, квине та самоперекладача. Перший розділ являє собою частину quine, яка приймає дані та заповнює стрічку з генеруванням даних з подальшим вихідним кодом. Далі йде самоперекладач, який бере вашу програму і запускає її. Це майже незмінна копія звичайного інтерпретатора, за винятком того, що замість того, щоб безпосередньо вводити дані, він отримує введення з початку розділу даних, встановлюючи комірок на 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
<--[>+<++++++]>++

При цьому використовуються дані з першої частини для додавання символів, які використовуються для генерації даних, до розділу коду. Він додає 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++++++++++)>]<[-<-<->>]+<---[[-]>[-]<]<-[[-]>>[-]<<]>+>[-<->]<    

Факт забавки для тих, хто ще читає

Якщо вхідним кодом для цієї програми є вихідний код цієї програми, то вона почне повторюватися, повторно створюючи самоперекладачі, які виконують цю програму, а потім надають їй ту саму програму знову. Це дає мені декілька цікавих ідей щодо створення реальних рекурсивних програм у мозковому завданні. Замість того, щоб перевіряти повернене значення та запускати нескінченний цикл, як у цьому питанні, повернене значення можна зберегти та діяти. Простим прикладом може бути фактична програма, яка йде

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 Johansen

@ ØrjanJohansen, я, мабуть, можу гольф на тисячу або більше байтів, перейшовши на інший метод генерації даних. Крім того, самоперекладач не найменший, що я міг написати, оскільки він підтримує негативні комірки.
Джо Кінг

Це виглядає так, що воно повинно виграти щедрість, але я хочу витратити свій час, щоб зрозуміти це, не будучи самим експертом з БФ. Чи можете ви пінг мені, якщо наступного тижня ви не почуєте?
Натаніел

1
Я підтверджую, що це відповідає специфікації, наскільки я можу сказати. Невдовзі щедрота повинна крилати собі шлях до вас. (Існує затримка, перш ніж система дозволить мені її присудити.) Дякую за відповідь, це дуже цінується.
Натаніел

1
Можливо, вас зацікавить Мурієль .
PyRulez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.