7 , 31 персонаж, 30 баллов, безопасно, но возможно сломано?
Программа 7 обычно представляет собой просто число, но она может содержать пробелы, разбивая ее на несколько чисел. Следовательно, это представление состоит из двух чисел (которые неявно объединяются интерпретатором 7), и программа также принимает два числа в качестве ввода через стандартный ввод. («31 символ» в заголовке - это общая длина двух чисел плюс один разделяющий символ пробела; цифры, составляющие числа, интерпретируются как восьмеричные при использовании в качестве программы, но десятичные при использовании в качестве входных данных, и это цифры, которые одинаковы в обоих случаях, а не фактические числа. Обратите внимание, что это не имеет значения, когда рассматривается как программа или как ввод, разделяете ли вы их пробелом или символом новой строки; я надеюсь, что это не так. не признать недействительным.)
Ожидаемый результат - следующее число (выражается здесь в десятичном виде, поскольку это формат вывода, который использует интерпретатор 7):
238363505302130098723162537059
Обратите внимание, что интерпретатор 7, связанный с вики Esolang, внутренне хранит числа в унарном виде, что означает, что у вас вряд ли будет достаточно памяти, чтобы фактически запустить программу на себя, чтобы посмотреть, что она делает. Я проверил программу, отработав ее поведение вручную и протестировав ее на небольших входах, чтобы убедиться, что она сделала то, что ожидала. Альтернативный подход заключается в написании интерпретатора, который использует более эффективный метод хранения чисел.
Избегать трещин здесь было чем-то вроде боли, но я наконец-то убедился, что никакие два числа, кроме тех, что указаны в самой программе, не могут выдавать 238363505302130098723162537059 в качестве вывода. ( Отредактируйте 1 неделю спустя: возможно, я ошибался, в зависимости от того, как вы интерпретируете вопрос; см. Ниже. )
Решение
Оригинальная программа была:
711170237403706
111723603700633
Эта программа берет два числа Икс и Y и вычисляет результат выражения 3 х у- у- 2 (т.е. Y( 3 х - 1 ) - 2 ). Если мы выполним этот расчет при х = 711170237403706 и Y= 111723603700633 , мы получим результат 238363505302130098723162537059 как требуется .
Предполагалось, что никакой другой ввод не даст желаемого результата, потому что:
Ввод должен быть выбран так, чтобы Y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , т. Е. Y( 3 x - 1 ) = 238363505302130098723162537061 (добавление 2 в обе стороны). Это число является полупростым, с двумя факторами: 111723603700633 и 2133510712211117 . Только одно из этих чисел, 2133510712211117 , может быть выражено в виде 3 х - 1 (предоставление ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Таким образом, мы можем однозначно определить, какое число равноИкс а какоеY , что означает, что работает только один вход.
Однако, в зависимости от того, как вы интерпретируете вопрос, может быть второй вход, который производит желаемый результат (таким образом, лишает законной силы это решение):
К сожалению, есть два мультипликативных разбиения полупростой на два фактора: один состоит в том, чтобы разделить это на два главных фактора, но другой - тривиальное разбиение, состоящее из 1 и самого числа. 1 нельзя записать в виде 3 х - 1 с целым числом Икс , но желаемый результат может быть; таким образом, потенциальная мета-трещина включает в себя ввод +79454501767376699574387512354 и 1 . Однако первое число здесь включает символы ( 8 и 9), которых нет в наборе символов для 7 программ. Таким образом, если ввод ограничен тем же набором символов, что и программа, это решение действительно; но если разрешен ввод, содержащий символы вне набора символов программы, это решение недействительно.
объяснение
Вот как функционирует предполагаемое решение:
711170237403706 111723603700633
7 7 7 Разделители элементов стека
111 023 403706 111723603700633 Начальные элементы стека
111 номер 3, в одинарном
023 I / O DSL для «ввода числа»
403706 111723603700633 Основная программа
(Неявный: выполнить копию основного элемента программы, сохранив оригинал)
40 Swap {023} выше {program}, избегая его
3 Выполните ввод-вывод, используя {023}; pop {program}
0 I / O: числовой
23 Введите число, копируя {111} столько раз
706 Добавить «6» к номеру (уменьшив его)
11 Нажмите два пустых элемента стека
17236 Вставить элемент стека "23" (без выхода)
0 Escape {23}, использующий пустой элемент
3 Выполните ввод-вывод, используя {23}; pop {элемент ниже}
23 Скопируйте верхнюю часть стека ввода много раз
7006 Добавить "66" (т.е. вычесть 2)
3 Вывод {как число}
3 Выход из программы (из-за низкого стека)
Первые 7 и конечные 3 не являются необходимыми для функциональности программы, они просто предназначены для правильного определения основных факторов вывода. Это помогает следовать этой программе, если вы понимаете числовой формат; числа хранятся в одноместной варианте , в котором 1
и 7
увеличить значение на 1, а также 0
и 6
уменьшить значение на 1 (таким образом , добавляя 66
значение уменьшается на 2, повторяя число умножает его, и так далее). Ввод выполняется путем повторения элемента стека (таким образом, если элемент стека 12345
равен 3 , а новый элемент стека будет 123451234512345 ).