Это менты-и-разбойники головоломка нить разбойников можно найти здесь .
Ваша задача состоит в том, чтобы написать две программы (или функции) так, чтобы они представляли собой анаграммы друг друга, и одна из них выполняет левую инверсию другой. Эти программы могут принимать и выводить столько целых или комплексных чисел, сколько вы пожелаете. Если вы выбираете брать числа в качестве символов или любым другим разумным способом, вы должны указать, что делаете это в своем ответе. Если вы решите ограничить домен вашей функции, вы также должны указать ограниченный домен в своем ответе.
Затем вы представите первую программу в форме ответа с скрытым слева, чтобы грабители могли его найти.
Показанная программа должна реализовывать инъективную функцию (иначе скрытый ответ был бы невозможен).
Если ваш ответ не был взломан в течение одной недели, вы можете открыть скрытый ответ и пометить его как безопасный . Безопасные ответы не могут быть взломаны грабителями и останутся без взлома бесконечно.
Целью будет создание кратчайшего неоткрытого ответа в байтах.
пример
Вы можете показать следующую программу на Python, которая добавляет одну к входу
lambda x:~-x
Решение может быть:
lambda x:-~x
Это вычитает один из входных
источник
Ответы:
Python 3, 80 байт ( треснувший )
Домен: положительные целые числа. Функция - это просто квадрат числа. Ввод в stdin, вывод в stdout, а также в обратную функцию. Обратите внимание, что Python здесь игнорирует третью строку, потому что она синтаксически действительна, а 1 уже является истинным значением, поэтому Python даже не смотрит, правильно ли определена правая часть «или».
Грабители должны написать функцию sqrt, которая будет работать корректно на всех ненулевых квадратах, печатая целочисленное значение как есть, без плавающей запятой (поэтому при вводе '4' вывод должен быть '2' или '2 \ n', а не '2.0' или '2.0 \ n').
источник
Python 3, 46 байт, взломан
Удваивает ввод.
источник
/
как и деление поплавков.7 , 9 байт, трещины
Эта программа полна непечатаемых символов, поэтому вот hexdump:
Примечание: при этом используется процедура ввода чисел, которая не может вводить отрицательные числа, поэтому эта отправка ограничена только неотрицательными целыми числами.
Одна из проблем, с которыми сталкиваются полицейские и грабители, заключается в том, что вы не пишете объяснения кода (чтобы его было сложнее взломать). С другой стороны, это означает, что мне здесь не нужно беспокоиться.
Я выбрал 7 в качестве языка, потому что, особенно в сжатом виде, его довольно сложно читать, и я не понимаю, почему это должен быть только я должен идти по пути перемещения по 8-битным фрагментам программ, написанных на 3-х битная кодировка. Удачи!
объяснение
Теперь, когда программа взломана (к сожалению, грубой силой; в этих коротких решениях это всегда опасно), я могу также объяснить, к чему я стремился. Это было на самом деле довольно решаемо, читая программу; Я мог бы сделать это намного сложнее, но это казалось плохой идеей, когда существуют грубые трещины.
Начнем с представления программы в более естественной кодировке. Как обычно, полужирный цифры показывают команды , которые выполняются немедленно (не все из которых представима в программе,
6
и7
являются , но2
для5
не являются), unbolded числа представляют их уцелевшие эквиваленты (0
к5
, все из которых представима в исходной программе, к сведению что0
сбежал6
и1
сбежал7
):Набор команд, доступных в программном источнике 7, означает, что это в основном просто литерал, представляющий исходный стек (больше ничего вы не можете сделать с помощью только экранированных команд
6
и7
). Итак, первое, что сделает программа, это поместит кучу вещей в стек. Вот как выглядит стек после запуска программы (|
разделяет элементы стека, как обычно в 7):Последний элемент стека затем копируется, чтобы стать кодом для запуска (оставаясь в стеке). Как это бывает, это единственная часть программы, которая является кодом; все остальное - просто данные. Вот что это переводит на:
Другими словами, это в основном просто набор инструкций ввода / вывода. Давайте проанализируем это подробно:
73
сбрасывает73363
это все еще на вершине стека.3
выводит023
и отбрасывает34662
. Таким образом, можно видеть, что34662
это комментарий, который использовался для хранения байтов, необходимых в другой версии программы. Что касается того, что023
происходит при выводе, он выбирает формат ввода / вывода 0 (целые числа), а затем23
является директивой, которая запрашивает реализацию для ввода целого числа (в 7 вы вводите с помощью вывода определенных кодов, которые запрашивают ввод). Ввод осуществляется путем создания копий элемента стека, указанного ниже, например, если целое число ввода равно 10, следующий элемент стека (в настоящее время7
) станет7777777777
. Таким образом, мы принимаем ввод от пользователя в десятичном виде, но он сохраняется как унарный.6
экранирует верхний элемент стека (изменяя каждый экземпляр7
на1
; таким образом7
экранируются строки, состоящие полностью из s), затем добавляет его к элементу стека before (772
). Таким образом, наши данные теперь что-то вроде7721111111111
.3
выводит соответствующий элемент стека (и выводит пустой элемент стека, который является частью начального стека по умолчанию). Его значение рассчитывается путем взятия числа1
s и7
s и вычитания числа0
s и6
s. (2
Посередине в большинстве случаев игнорируется; если он находится в конце строки, он будет становиться завершающим символом новой строки вместо того, чтобы игнорироваться, но правила PPCG не заботятся об этом.) Таким образом, вывод является исходным вход плюс 2.На данный момент в стеке нет ничего полезного и ничего в программе, поэтому программа завершается.
Как мы можем изменить это? Это простой вопрос об изменении
11
в00
, так что мы добавляем символы на входе , которые делают его 2 ниже, а не 2 выше. Там в00
удобно скрытые восемь восьмеричных цифр далее в программе (так что восьмеричные цифры и байты выстраиваются друг с другом), поэтому мы просто не можем поменять его с11
самого начала.источник
JavaScript (ES6), 21 bytes, Cracked
This is an easy one.
Returns the cube of the input.
источник
Python 2, 83 bytes, cracked
This is similar to my other answer. However, this uses 64-bit RSA, and is cryptographically quite weak. If you can rob this answer, you can theoretically rob my other one as well, given enough time.
источник
Python 2, 47 bytes, Cracked
The domain for this function is {x ∈ ℤ | x > 0}. It squares its input.
nmjcman101 found the intended solution:
источник
JavaScript (ES6), 46 bytes, Cracked
This function returns
ln(x+1)
wherex
is a non-negative number.Usage
Note: Due to the nature of floating point numbers
f(g(x))
may not exactly equalx
. Example:f(g(4))=3.9999999999999996
источник
J, 8 bytes, cracked
Another simple one to start off with.
Doubles the input.
источник
Processing.js, 59 bytes, Cracked!
This function multiplies the input by
204
(17*-4*-3=204
). It takes in an int as input and outputs a float. As expected, the inverse divides the input by204
.An online interpreter for processing-js can be found here.
источник
J, 10 bytes, cracked
Another simple one. Returns n2-1.
источник
JavaScript (ES6), 15 bytes, cracked by Emigna
You can test it like:
Cracked
My intended solution is a bit different than Emigna's crack:
источник
J, 29 bytes (Cracked by miles)
This is a verb that takes a positive integer as input, and does the following:
Try it online!
My solution
The logic is pretty much the same as in the crack. The rank conjunction
"
can be stuck in many different places (and I use it to get rid of the unnecessary0
and3
), since it doesn't really do anything in the solution.источник
Processing (java), 59 bytes, SAFE
This function multiplies the input by
204
(17*-4*-3=204
). It takes in an int as input and outputs a float. As expected, the inverse divides the input by204
. Note: both programs take an int as input and output a float.This answer is exactly the same as my other answer, except that my other answer was written in Processing.js. Meet Processing-java, the less verbose cousin of Java. You can download Processing here at processing.org.
The Crack
This program divides the argument by
204
. But how? Let's go inside the function.Simple enough, but how does
blue( get(0, 0) )
become204
? This is the centrepiece of this submission. First of all,get(0,0)
gets the colour of the pixel located at(0,0)
(the top left corner of the window, which always opens in a Processing sketch). Next,blue()
gets the blue value of that pixel, which is204
!To come up with this submission, I experimented by printing the different attributes of the colour obtained by
get(0,0)
. I have found out that the red, green, blue, alpha values are204
,204
,204
and255
respectively. From this, I decided to do a simple operation with this number and ended up with this post.источник
JavaScript (ES6), 63 bytes Cracked by Ilmari Karonen
Time for some
atob
nonesense. This function returnsx*x+1
wherex
is a non-negative number.Usage
Intended
There's a large number of potential solutions, but I was hoping that the leading characters would throw off the byte order enough to make this harder. C'est la
atob
источник
Brain-Flak, 26 bytes, Cracked
Original
My Crack
1000000000's Crack
источник
Python 2, 225 bytes, cracked by Sp3000
Domain of this function is [0, n), where n is the huge number above. Yes, this function is invertible on this domain. And unless I messed up, breaking this answer is as hard as breaking 512 bit RSA.
источник
J, 15 bytes
Takes a non-negative integer n, converts it to a list of binary digits, and combines those digits as a base 10 number.
Try it online!
источник