Трансформаторы в маскировке (Нить Копа)


10

Нить грабителя здесь

Задача полицейских состоит в том, чтобы написать функцию или программу, которая, когда ей дают ввод, выводит конечную детерминированную строку. Если программе дан другой ввод, она должна вернуть другой вывод.

Правила:

  • Материалы состоят из
    • Название языка
      • Если используются какие-либо флаги, они должны быть раскрыты.
    • Количество байтов программы
    • Количество байтов вывода
    • Вывод
      • Если это особенно долго, пожалуйста, предоставьте пастин или что-то подобное
      • Если он содержит непечатные документы, предоставьте hexdump.
      • Конечные символы новой строки и пробелы должны быть включены в вывод
    • Откуда поступает ввод (STDIN, командная строка и т. Д. )
  • Если применимо, вы можете предположить, что байт, представляющий EOF, отсутствует во входных данных, если вы не используете этот байт в своей программе.
  • Если ваша программа взломана, добавьте ссылку на соответствующий ответ в ветке грабителя в вашем заголовке.
  • Ваша программа небезопасна до тех пор, пока не пройдет неделя, и вы отмечаете это так.
  • Я не одобряю методы, такие как случайное заполнение с помощью входных или криптографических хеш-функций. Я не могу их остановить, но я не приму решение, которое использует любой из них . Также обратите внимание, что некоторые из этих методов могут иметь коллизии, когда другая строка дает одинаковый результат.
  • Ваша цель - получить максимально короткий результат. Самое короткое безопасное решение, опубликованное в течение трех недель после публикации этого вопроса, выигрывает!

Задача грабителя состоит в том, чтобы найти программу размером, равным или меньшим, чем оригинал, который также подчиняется вышеуказанным правилам.

Если грабитель взломает вашу программу с помощью решения, отличного от предполагаемого, то у вас есть возможность «взломать» его, доказав, что решение грабителя неверно. Вы можете сделать это, найдя вход в программу грабителя, который будет производить тот же результат.

Пример представления:

brainfuck, 10 байт, оценка: 10

]<.[<],>[,

Это решение , [>,] <[. <], Которое просто меняет ввод

Удачи!


«Если программе дается другой ввод, она должна возвращать другой вывод». Означает ли это, что программа никогда не должна выводить одно и то же для других входов? Или это означает, что программа не должна постоянно что-то выводить независимо от ввода? (EXIST вход не равен самому себе, в отличие от входов FORALL, не равных самому себе, возвращает другой выход.)
tsh

@tsh Только сам ввод должен иметь уникальный вывод. Например, допустимым представлением может быть самоидентифицирующаяся программа , которая выводит данные 1для себя и для 0других
целей

@JoKing Итак, ваш пример Python 3 представлен неверно? Потому что он, безусловно, также выводит 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941для некоторых других строк.
Линн

@lynn Ты прав. Я удалил этот пример
Джо Кинг

Ответы:


4

7 , 31 персонаж, 30 баллов, безопасно, но возможно сломано?

Программа 7 обычно представляет собой просто число, но она может содержать пробелы, разбивая ее на несколько чисел. Следовательно, это представление состоит из двух чисел (которые неявно объединяются интерпретатором 7), и программа также принимает два числа в качестве ввода через стандартный ввод. («31 символ» в заголовке - это общая длина двух чисел плюс один разделяющий символ пробела; цифры, составляющие числа, интерпретируются как восьмеричные при использовании в качестве программы, но десятичные при использовании в качестве входных данных, и это цифры, которые одинаковы в обоих случаях, а не фактические числа. Обратите внимание, что это не имеет значения, когда рассматривается как программа или как ввод, разделяете ли вы их пробелом или символом новой строки; я надеюсь, что это не так. не признать недействительным.)

Ожидаемый результат - следующее число (выражается здесь в десятичном виде, поскольку это формат вывода, который использует интерпретатор 7):

238363505302130098723162537059

Обратите внимание, что интерпретатор 7, связанный с вики Esolang, внутренне хранит числа в унарном виде, что означает, что у вас вряд ли будет достаточно памяти, чтобы фактически запустить программу на себя, чтобы посмотреть, что она делает. Я проверил программу, отработав ее поведение вручную и протестировав ее на небольших входах, чтобы убедиться, что она сделала то, что ожидала. Альтернативный подход заключается в написании интерпретатора, который использует более эффективный метод хранения чисел.

Избегать трещин здесь было чем-то вроде боли, но я наконец-то убедился, что никакие два числа, кроме тех, что указаны в самой программе, не могут выдавать 238363505302130098723162537059 в качестве вывода. ( Отредактируйте 1 неделю спустя: возможно, я ошибался, в зависимости от того, как вы интерпретируете вопрос; см. Ниже. )

Решение

Оригинальная программа была:

711170237403706
111723603700633
Эта программа берет два числа Икс и Y и вычисляет результат выражения 3ИксY-Y-2 (т.е. Y(3Икс-1)-2 ). Если мы выполним этот расчет при Иксзнак равно711170237403706 и Yзнак равно111723603700633 , мы получим результат 238363505302130098723162537059 как требуется .

Предполагалось, что никакой другой ввод не даст желаемого результата, потому что:

Ввод должен быть выбран так, чтобы Y(3Икс-1)-2знак равно238363505302130098723162537059 , т. Е. Y(3Икс-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 ).


3

Node.js v10.9.0 , 40 байт, оценка: 40, трещины

вход

Это функция, принимающая ровно один параметр.

Вывод

&`nij.9=j.,)r31n=+(=ooj`[o.o.)1.s](>=6>t

Я могу только переставить o=>[...j=o,].sort(n=>(j+=113)&69).join`` , но jне могу перейти к целому числу
l4m2

Трещины. Это было довольно весело :-)
ETHproductions

3

Груша , 46 байтов ASCII, оценка 0, треснувший

Ввод взят из стандартного ввода. Ожидаемый вывод (при стандартном выводе) представляет собой пустую строку (т. Е. Когда программа задается в качестве аргумента, вывод не должен выводиться).

Другими словами, задача здесь состоит в том, чтобы написать программу Pear Tree, которая ничего не выводит на стандартный вывод, когда она дает себя на стандартный ввод, и которая выводит что-то на стандартный вывод, когда на стандартный ввод что-то другое, чем она сама, используя no более 46 байт. (Мне удалось сделать это, когда я держал программу в печатном ASCII, несмотря на то, что A Pear Tree часто использовал не ASCII и непечатные символы.) Это фактически задача написания самоидентифицирующейся программы с определенным форматом вывода. (т. е. пустая строка при успешной самоидентификации); однако, у Грушевого дерева есть по крайней мере два поворота, которые делают задачу несколько более сложной, чем это выглядит на конкретном языке (именно поэтому я выбрал его для представления в полицию).

Мое решение

Мое решение немного отличается от трещины:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

Попробуйте онлайн!

Вместо использования exitя вместо этого устанавливаю $_(неявный вывод) и $\(перевод строки после вывода, включая неявный вывод) в нулевую строку, если есть совпадение (и 1если нет совпадения). A printпо-прежнему требуется, потому что неявный вывод включается только в том случае, если имеется хотя бы один байт ввода (таким образом, нам нужно явно печатать что-то, если в качестве входных данных нам дается пустая строка, отличная от программы).

Каждая программа A Pear Tree должна где-то содержать контрольную сумму (именно MZpaв этом решении). И моё решение, и взломанные имена переменных (и другие мелкие детали кода), чтобы контрольная сумма состояла полностью из букв ASCII.



3

Perl 5 -p0777, 10 байт, оценка 10, безопасная

W)9r46<(k

Последний символ здесь - «сдвиг», код символа 14 (десятичный) / 0E (шестнадцатеричный). Все остальные для печати ASCII.

Поскольку мы используем неявный аргумент ввода / вывода Perl -p0777, ввод поступает со стандартного ввода, а вывод - со стандартным выводом.

Решение

Программа делает следующее:

NUL-ввод вводит не менее 10 символов, затем XOR со строкой svgOUT_TOP

Это означает, что сама программа, единственный вход, производящий желаемый результат, является:

$ _ ^ = А | $ ^

Попробуйте онлайн!

объяснение

В Perl есть несколько переменных специального назначения. Например, при использовании -p0777для неявного ввода-вывода $_вводится в начале программы и выводится в конце программы.

Большинство из этих переменных имеют очень простое значение по умолчанию. Однако значением по умолчанию $^, выбранным в настоящее время форматом верхней части страницы, является намного более длинная строка STDOUT_TOP. Таким образом, мы можем использовать это как очень краткий метод запутывания через XORing $^со значением, которое мы хотим запутать (в данном случае, программой).

Чтобы спрятать контрольный сигнал _TOPв конце, я добавил саму программу к 10 символам, добавив в нее abc|значение, означающее, что все символы STDOUT_TOPбудут XORed с чем-то; выбор с abc|самого начала был простым способом сохранить выходные данные в основном для печати (и чтобы было сложнее обнаружить, что я выполнял XOR со строкой, состоящей в основном из заглавных букв, потому что в ASCII строчные буквы XOR строчными являются строчными).


3

Python 3, взломан 50 байт

Ввод и вывод из / в stdin / -out. Выход различен для каждого отдельного входа. Уникальный вывод при наличии исходного кода:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Это 150 цифр)

Удачи!


Упс! Теперь я вижу, что этот вызов давно закончился ... Странно, что оно появилось в моей хронологии / ленте. Любопытно посмотреть,
откликнется



2

Cubix , 18 байт, оценка 18, сейф

Обидно, что эта проблема не привлекла больше внимания, но иногда так и происходит. Я собирался оставить это небезопасным, но решил опубликовать решение, прежде чем я забыл об этом.

Это должно быть довольно легко взломать.

Вход отstdin

Вывод

$`*2aJPJ#74(o);89

Изменить: я должен отметить, что это ожидает источник в его сокращенной форме ... и теперь я заметил, что есть пропущенный байт (непечатный) из результата, который я сломал, когда я отправил. Нужно скопировать сейчас. Шестнадцатеричные значения24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

Концепция заключалась в том, чтобы удалить печать первого символа, а затем удалить обратный индекс из символа, например [chars] - [0, len ([chars]) .. 2]

Код

$r;#AoW\U-@</u.?;;

который отображается на следующий куб

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Попробуй здесь


2

Желе , 14 байт, Оценка: 21, Сейф

И программа, и размер вывода подсчитываются с использованием кодовой страницы Jelly.

вход

Первый аргумент командной строки.

Вывод

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Решение

ØJiⱮÄÆNPḃØ⁵ịØJ

Попробуйте онлайн!


Поскольку преобразование из / в кодировку Jelly является сложным, было бы полезно иметь верификатор (который принимает программу, конвертирует ее из UTF8 в Jelly, передает ее себе, конвертирует из Jelly в UTF8 и проверяет, равна ли она ожидаемой выходной)
user202729

@ user202729 эта программа Jellyv⁼ , выдаст, 1если вход, оцененный как код Jelly с входом ввода, равен входу и будет либо давать, либо выдавать 0ошибку (если вход является недопустимым кодом Jelly), если нет.
Джонатан Аллан

1

JavaScript Firefox, <10 байт, Оценка: 52, из ввода аргументов функции, Cracked

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) кодирует следующую строку:

function btoa() {
    [native code]
}

который дает:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

только что скопировал


Прежде всего, после очевидного, это не настоящий код? Во-вторых, вы не указываете, откуда поступает информация. Я бы опубликовал кряк, но, честно говоря, я не уверен, что это представление действительно.
Quintec


Я не думаю, что в этот пост необходимо включать сообщение о взломе - люди могут просто щелкнуть ссылку, чтобы посмотреть взломать.
user202729

1

GCC 61-> 61 байт

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Полная программа, принимает вход от stdin и выводит на stdout


Итак, есть ли место после последнего 50?
февраля

@tsh Это шестнадцатеричный дамп
l4m2

1

Perl 6, 43 байта, оценка: 15, из стандартного ввода

49671296789805

2
Просто проверка, так как ваш предыдущий ответ не соответствовал правилам уникального вывода для вашей программы в качестве входных данных, можете ли вы подтвердить, что это представление соответствует?
Джо Кинг,

Да, я так думаю.
Дональд


1

J , 26 байт, оценка: 52, сейф

Программа не REPL, а полный скрипт, который принимает stdinи явно печатаетstdout .

вход

Стандартный ввод.

Вывод

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Нет, это не метод шифрования.


Решение

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Попробуйте онлайн!



0

 Perl 6, 31 байт, Оценка: 39, из stdin - Cracked

Трещины здесь

().1111111111112222235abcegijkmnorstvy

Грубое решение. Мог бы выжить.


Я уверен, что взломал ваше решение и подозреваю, что ваша программа не следует правилу, согласно которому разные входные данные должны давать разные выходные данные.
nwellnhof
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.