7 , 31 персонаж, оцінка 30, безпечний, але можливо зламаний?
Програма 7 зазвичай є просто числом, але вона може містити пробіл, розділяючи її на кілька чисел. Таким чином, ця заявка складається з двох чисел (які неявно об'єднані 7 перекладачем), і програма також приймає два числа як вхідні дані за допомогою стандартного введення. ("31 символ" у заголовку - загальна довжина двох чисел плюс один розділовий символ пробілу; цифри, що складають числа, інтерпретуються як вісімкові, коли вони використовуються як програма, але десяткові, коли використовуються як вхідні дані, і це цифри, однакові в двох випадках, а не фактичні числа. Зверніть увагу, що це не має значення ні тоді, коли вони розглядаються як програма, ні вони розглядаються як вхідні дані, незалежно від того, розділяєте ви їх пробілом чи новим рядком; я сподіваюся, що це не недійсне подання.)
Очікуваний вихід - наступне число (виражене тут у десятковій формі, оскільки це вихідний формат, який використовує 7 перекладач):
238363505302130098723162537059
Зауважте, що 7 інтерпретаторів, пов’язаних із вікі Esolang, внутрішньо зберігають номери в одинаковому значенні, тобто ви навряд чи матимете достатньо пам’яті, щоб насправді запустити програму, щоб побачити, що вона робить. Я перевірив програму, опрацювавши її поведінку вручну і випробувавши її на невеликих входах, щоб переконатися, що вона зробила те, що я очікувала. Альтернативним підходом було б написання перекладача, який використовує більш ефективний метод зберігання чисел.
Уникнення тріщин тут було чимось болем, але я нарешті переконався, що жодне два числа, крім тих, що є в самій програмі, не здатні видавати 238363505302130098723162537059 як вихід. ( EDIT через 1 тиждень. Можливо, я помилився, залежно від того, як ви інтерпретуєте питання; див. Нижче. )
Рішення
Початкова програма була:
711170237403706
111723603700633
Ця програма приймає два числа х і у і обчислює результат виразу 3 х у- у- 2 (тобто у( 3 х - 1 ) - 2 ). Якщо ми виконаємо цей обчислення за x = 711170237403706 і у= 111723603700633 , отримаємо результат 238363505302130098723162537059 як потрібно .
Передбачалося, що жоден інший внесок не дасть бажаного результату, оскільки:
Вхід повинен бути обраний таким чином, щоб у( 3 х - 1 ) - 2 = 238363505302130098723162537059 , тобто у( 3 х - 1 ) = 238363505302130098723162537061 (додаючи 2 в обидві сторони). Це число є напівприміром, має лише два фактори: 111723603700633 та 2133510712211117 . Тільки одне з цих чисел, 2133510712211117 , може бути виражене у формі 3 х - 1 (надання ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Тож ми можемо однозначно визначити, яке число єх а якеу , тобто лише один вхід працює.
Однак, залежно від того, як ви інтерпретуєте питання, може бути другий вхід, який дає бажаний результат (таким чином, це рішення буде недійсним):
113 х - 1х79454501767376699574387512354189), які не містяться в наборі символів для 7 програм. Отже, якщо вхід обмежений тим, що він є тим самим набором символів, що і програма, це рішення є дійсним; але якщо дозволено введення символів, що містять символи за межами набору символів програми, це рішення недійсне.
Пояснення
Ось як функціонує призначене рішення:
711170237403706 111723603700633
7 7 7 Розділювачі елементів стеку
111 023 403706 111723603700633 Початкові елементи стеки
111 Число 3, в одн
023 DSL вводу / виводу для "введення номера"
403706 111723603700633 Основна програма
(Неявне: виконати копію основного елемента програми, зберігши оригінал)
40 Зміна {023} вище {програма}, уникаючи цього
3 Чи виконувати введення / виведення за допомогою {023}; поп {програма}
0 I / O: числовий
23 Введіть число, копіюючи {111} стільки разів
706 Додайте "6" до числа (декрементуючи його)
11 Натисніть два порожні елементи стека
17236 Натисніть на елемент стеки "23" (без набору розмірів)
0 Escape {23}, споживаючи порожній елемент
3 Чи виконувати введення / виведення за допомогою {23}; поп {елемент нижче}
23 Копіюйте верхню частину вводу багато разів
7006 Додайте "66" (тобто віднімайте 2)
3 Вихід {як число}
3 Вийти з програми (через низький стек)
1
7
0
6
66
12345
3123451234512345