Пожалуйста, обратите внимание: по своей природе спецификации для этой задачи трудно понять. Это, вероятно, требует, по крайней мере, курса новичка в теории вычислимости или эквивалентного базового чтения. Кроме того, сама задача довольно сложная. Ответ на него потребует написания полного переводчика для некоторого подмножества вашего языка по вашему выбору, и не только это, но и переводчик должен быть в форме чего-то похожего на квинну. Если ваш ответ не делает всего этого, почти наверняка не будет соответствовать спецификации.
Вам не нужно решать проблему остановки (даже частично), чтобы решить эту проблему. Тем не менее, вы почти наверняка сделать нужно написать переводчик (язык , который вы используете, написанный на одном языке он интерпретирует), хотя это не обязательно должно быть законченным продукт . Именно это делает это интересным испытанием.
Я обещал присудить награду в 500 баллов за первый ответ, который соответствует спецификации, и это будет за ответ BF Джо Кинга .
Соревнование
Грубая, упрощенная версия доказательства Алана Тьюринга о неразрешимости проблемы остановки выглядит примерно так:
Предположим, я написал программу F
, предназначенную для решения программы остановки. То есть, F
принимает исходный код другой программы в качестве входных данных и F(G)
должен возвращать, 1
если G
останавливается, и в 0
противном случае.
Но если я дам вам свою программу, F
вы можете создать другую программу H
, которая будет запускать мою программу в H
качестве входных данных. Если F(H)
возвращается, 0
то H
возвращается 0
, но в противном случае он намеренно уходит в бесконечный цикл. Это приводит к парадоксу, и мы должны заключить, что F
не можем решить проблему остановки в конце концов.
Ваша задача - написать программу H
, но с изюминкой: я не собираюсь давать вам свою программу. Вместо этого ваша программа получит исходный код моей программы в качестве входных данных. То есть:
Ваша программа получит мою программу в виде ввода в виде исходного кода. (Например, в виде файла или ввода в командной строке, подробности зависят от вас.)
Моя программа будет написана на том же языке, что и ваша программа, и также принимает ввод в виде строки исходного кода.
Если моя программа возвращается,
0
когда ваша программа вводится как ввод, ваша программа должна останавливаться (и возвращаться0
), когда моя программа вводится как ввод. (Точное значение слова «возвращение0
» зависит от вас.)если моя программа не останавливается, или если она возвращает что-либо кроме того,
0
что передается вашей программе в качестве входных данных, ваша программа должна работать бесконечно долго.
Суть в том, что просто чтобы сделать это действительно намного сложнее, вы должны соблюдать следующие правила:
Вы не можете использовать какую-либо встроенную функцию
exec
илиeval
-типа.Вы не можете использовать любые "читерские" методы, чтобы получить исходный код своей программы. (Например, вы не можете сказать «сохраните это в файле под названием« программа »», а затем включите
open(program)
в свою программу ».
Это означает, что ваша программа должна быть своего рода сумасшедшим супер-квинем, который может не только воспроизводить свой собственный исходный код в виде строки, но и способен правильно анализировать и интерпретировать язык, на котором написан.
Чтобы сделать его немного менее безумно сложным, вы можете использовать только (полное по Тьюрингу) подмножество выбранного вами языка. Поэтому, если ваша программа написана на Python и будет работать только в том случае, если моя программа содержит только if
s и while
циклы, а также базовые строковые операции, то это нормально, если ваша программа тоже использует только эти вещи. (Это означает, что вам не нужно беспокоиться о реализации всей стандартной библиотеки выбранного языка!) Однако ваша программа действительно должна работать - вы не можете просто создать свой собственный язык.
Это конкурс популярности , поэтому победит ответ с наибольшим количеством голосов. Тем не менее, как уже упоминалось выше, это просто серьезная задача - просто выполнить спецификацию, поэтому я присуждаю награду в 500 баллов за первый ответ, который отвечает моим требованиям.
пожалуйста, обратите внимание: без сомнения, есть много способов, которыми вы можете «обмануть» в этом задании, учитывая точную формулировку, которую я использовал. Тем не менее, я действительно надеюсь на ответы, которые входят в дух вопроса. Задача, как задумано, очень сложна, но возможна, и я очень надеюсь увидеть ее подлинные решения. Я не буду назначать награду за ответ, который кажется мне обманчивым.
Примечание: этот вызов изначально был объявлен как конкурс популярности , но он был закрыт в 2016 году из-за отсутствия «объективного критерия выигрыша», и я изменил его на code-golf , чтобы открыть его снова. Тем не менее, я обнаружил, что по состоянию на январь 2018 года конкурсы популярности фактически не запрещены для PPCG (с учетом того, что это самая последняя мета-дискуссия), поэтому закрытие его в первую очередь было против политики сайта. Я понимаю, что попконы не популярны в наши дни, но это старая проблема, и ее природа делает ее действительно непригодной для игры в гольф.система баллов. Если кто-то по-прежнему твердо убежден в том, что этого нельзя допустить, тогда давайте проведем мета-обсуждение, прежде чем начнут собираться близкие голоса. Наконец, в связи с тем, что кто-то потратил последний год, пытаясь сыграть в гольф свое решение, будьте уверены, что он будет таким же конкурентоспособным в этом испытании и таким же достойным награды, как это было бы в Code-Golf. версия.
источник
F
в файл иimport
записывать его? ; 3Ответы:
Brainfuck ,
601348774376 байтИзменить: -1136 байт. Перешли на лучший способ генерации данных для квин
Edit2: -501 байт. Пересмотрел мой самоинтерпретатор и сократил пару сотен байтов
Попробуйте онлайн! Здесь вводится простая программа cat (
,[.,]
), которая печатает саму программу.«Возвращение 0» определяется завершением программы в ячейке со значением 0.
Нечестивая комбинация двух программ, которые я написал в прошлом, quine и самоинтерпретатора. Первый раздел - это часть quine, которая берет данные и заполняет ленту генерацией данных, за которой следует исходный код. Далее идет самоинтерпретатор, который берет вашу программу и запускает ее. Это в значительной степени неизмененная копия обычного самостоятельного интерпретатора, за исключением того, что вместо непосредственного ввода данных он получает входные данные в начале раздела данных, устанавливая ячейку в 0, если входных данных больше нет. Наконец, завершите текущую ячейку вашей программы и запустите
[]
. Если возвращаемое значение было 0, моя программа завершится на нуле. Если это что-то еще, он будет запускать бесконечный цикл. Если ваша программа работает вечно,моя программа будет работать вечно.Как это работает:
Часть 1: Генерация данных
Эта часть составляет раздел данных quine и на данный момент составляет большую часть кода в 3270 байтов. Начало
-
является маркером начала данных. Каждый>+++
представляет символ кода после этого раздела.Часть 2. Создание раздела данных с использованием данных
При этом используются данные из первой части для добавления символов, которые используются для генерации данных, в раздел кода. Это добавляет
>
к концу раздела кода и значение этой ячейки много плюсов.Часть 3: Генерация остальной части кода с использованием данных
Уничтожает раздел данных и добавляет оставшуюся часть исходного кода в раздел кода
Часть 4: Получить введенную программу
Получает введенную программу. Удаляет не-мозговые символы и представляет каждого персонажа числом:
Представляет конец программы с
255
.Часть 5: Интерпретация ввода
Интерпретирует программу. Единственное отличие от обычного состоит в том, что ввод берется из начала раздела кода, а не из ввода.
Часть 6: остановка, если возврат не равен 0
Перейдите к конечной ячейке вашей программы и запустите бесконечный цикл, если возвращаемое значение не равно 0. Если оно равно 0, выйдите из цикла и закончите на том же 0.
Тестовые входы:
Всегда возвращает 0 (останавливается и возвращает 0)
Всегда возвращает 1 (работает вечно)
Возвращает все входные данные, добавленные вместе, мод 256 (возвращает 211, поэтому он работает вечно)
Возвращает 0, если последние два символа кода представляют собой бесконечный цикл (
[]
) ( ваша программа возвращает 0, когда передается моя программа , поэтому моя программа останавливается)Интересный факт для тех, кто все еще читает
Если исходные данные для этой программы являются исходным кодом этой программы, то она начнет повторяться, многократно создавая интерпретаторы, которые запускают эту программу, а затем снова передают ей ту же самую программу. Это дает мне некоторые интересные идеи по созданию реальных рекурсивных программ в Brainfuck. Вместо проверки возвращаемого значения и запуска бесконечного цикла, как в этом вопросе, возвращаемое значение может быть сохранено и обработано. Простым примером будет факториальная программа, которая идет
Конечно, это совершенно безумный способ кодирования мозговых ошибок, учитывая, что выполнение рекурсивных самоинтерпретаторов увеличит время выполнения в геометрической прогрессии.
источник
.
. Хотя этот вопрос больше не является вопросом игры в гольф, поддержка всего языка может быть более впечатляющей.