Cheapo Enigma machine (Копы)


15

Для поста грабителей, машина Cheapo Enigma (Грабители)

Представление полицейского будет состоять из программы / функции, которая принимает один байт данных и возвращает один байт данных. Каждый возможный ввод должен производить уникальный вывод. (Другими словами, ваша функция должна быть биективной)

Грабители попытаются создать вашу обратную функцию, используя как можно более короткий код. Итак, ваша цель - сделать вашу функцию трудной для инвертирования.

Вы не можете использовать встроенные модули, которые имеют единственную цель хеширования или шифрования.

Количество ваших байтов не может превышать 64 байта. 0-байтовые решения не имеют права на выигрыш.

Формат ввода / вывода

8 бит (0 или 1) или целое число-10 в диапазоне 1-256, 0-255 или от -128 до 127. Можно использовать стандартный ввод-вывод или файловый ввод-вывод. Функция также может возвращать значение в качестве вывода. Вход и выход должны принадлежать к одному диапазону (двоичный, 1-256, 0-255 или от -128 до 127). Грабителю также потребуется использовать этот диапазон для ввода и вывода.

счет

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

Вы имеете право выиграть (как полицейский), только если грабитель попытался победить вас. (Этот грабитель может быть вы)

пример

C ++, использует диапазон 0-255, 31 байт

int x;
cin>>x;
cout<<(x+1)%256;

Возможна подача грабителем в C ++, 32 байта

int f(int x)
{return x?x-1:255;}

Использование того же языка или аналогичного алгоритма не является обязательным

Это дает оценку 31/32 = 0,97 для полицейского и грабителя.


1
Из чего состоит представление полицейского? Язык, размер и полный код программы / функции?
Arnauld

1
Разве это не немного сломано, если полицейский может просто сделать произвольно большую вещь?
Разрушаемый Лимон

1
Этот грабитель может быть вами Что, если я отправлю 64-байтовый ответ полицейского, который отображает N на N, и ответ грабителя, который делает то же самое в одном байте?
Arnauld

1
Вы можете указать, следует ли обновлять представление полицейского, когда на него отвечают грабители. (Полагаю, что обычное «взломанное» обновление здесь не применимо. По крайней мере, не как уникальный и окончательный взлом.)
Арно

3
Если подумать, вы можете полностью удалить это правило. Я могу уничтожить большинство ответов, разместив грабителя в желе.
Деннис

Ответы:


7

Javascript, 11 8 байт, оценка: 8/5

x=>x^x/2

Простая реализация серого кода. Для декодирования обычно требуется целый цикл. Посмотрим, кто придет с наименьшей или вообще без петли!


Я думаю, x^x/4будет сложнее, потому что не должно быть встроенных для него ...
Кристоф


1
Как это биективно?
Утренняя монахиня

1
@LeakyNun Хм, я не уверен, какой ответ вы ожидаете, но я попробую: код Грея - это альтернативная форма представления числа, где каждое последующее число изменяется только в 1 бит (расстояние Хаммига всегда равно 1). Для каждого числа существует ровно одна кодировка Грея и одна двоичная кодировка, поэтому они образуют биекцию. Например, 7 - 0111 в двоичном и 0100 в сером, следующее число 8 - 1000 в двоичном и 1100 в сером. Серое кодирование - это, в основном, краевое кодирование двоичного кода.
Кристоф

1
@LeakyNun ^- побитовый xor, а не возведение в степень. В любом случае это выглядит волшебно
Евгений Новиков

7

C, 64 байта, оценка 64/71 = 0,901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

Принимает ввод в диапазоне [0 255].

Попробуйте онлайн! - на TIO (с использованием GCC) это производит:

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

Обратите внимание, что в других системах он может выдавать другой (но все еще действительный) вывод, поскольку C не требует конкретной randреализации. Мое представление - это версия, работающая на TIO (по ссылке).


Я очень разочарован тем, что мне не удалось заставить версию, подобную моей original ( f(x){return rand(srand(x*229))/229%256;}), работать на TIO, так как я думаю, что она намного элегантнее. Так как это работает только на Clang, работающем на OS X, это не справедливо для конкуренции. Это все еще довольно неловко, чтобы повернуть вспять, так что этого достаточно, я думаю.


Ну, это забавно!
Мэтью Ро

Решение здесь , но мне было немного трудно с вами srand(), поэтому вам придется решить, приемлемо ли это в этой форме.
Appleshell

Я не вижу, как эта программа выполняет требование Bijection, поскольку выходные данные являются случайными, и не каждый вход имеет уникальный выход.
Пост Рок Гарф Хантер

2
Проблема не в реализации. Проблема заключается в том, что ему не хватает, как мне кажется, всех ключевых идей этой задачи: нахождение тривального алгоритма (следовательно, ограниченного 64 байтами и независимым от языка), который нетривиально обратить. Ваша заявка "чувствует" лазейку: независимость от языка, ограничение в 64 байта путем передачи на аутсорсинг неизвестной реализации встроенной функции (rand зависит не от языка, а от локальной stdlib ) и правила хеширования / шифрования. Это в правилах PPCG, но, конечно, не то, что задумал ghosts_in_the_code со своими правилами.
Кристоф

1
@ghosts_in_the_code хорошие RNG и хэш-функции предназначены для того, чтобы быть едва обратимыми. Поэтому я думаю, что они должны быть включены в это правило (даже если фактическая реализация не может быть разработана таким образом). В любом случае, я не рекомендую менять правила на этом этапе.
Кристоф


2

JavaScript, 44 байта 22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

Использует лексикографическую сортировку (Javascript Default), чтобы переставить все числа от 0 до 255

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


1
22/3 - другой язык кажется приемлемым, хотя и немного странным. Я думал, что у меня было 5, но 256 мешало мне :).
Джонатан Аллан


1

Javascript, 11/8 байт

x=>x**5%257

Домен / диапазон от 1 до 256.


Хм, а Javascript плох с большим количеством показателей? Это работает в Ruby: repl.it/HXvZ/0
гистократ

В JavaScript есть только числа с плавающей запятой двойной точности, поэтому все, что больше, чем ~ 53 бита, не может быть точно представлено. x**3и x**5должен работать.
Деннис

Хорошо, служит мне прямо для предположения. Я поменяю языки.
гистократ

Или сделайте предложение Денниса, учитывая правила, предпочитающие более короткие языки. :) Спасибо!
гистократ

К сожалению, на данный момент правила немного нарушены, и мне было бы позволено перевернуть это на другом языке. Именно из-за предела точности это будет довольно многословно для инвертирования с использованием JS.
Деннис


1

Javascript, 27/29 байт

x=>x-6?x*95%127+x*98%131:65

Изменить: диапазон / домен 1..256. Генерируется грубой силой, более или менее.


К сожалению, это биективно, но не в диапазоне [0,256): значение 130 никогда не выводится, а значение 256 (что не соответствует 8-битному целому числу).
Кристоф

Оценка 27/29 . Мне это нравится !
Кристоф

1
Благодарность! Правила позволяют мне указать диапазон [1256], и он является биективным для этого диапазона.
гистократ

1

1
Оценка: 16/6 (Примечание: я не думаю, что следует разрешить использовать другой язык для представления грабителя, но на данный момент, это так.)
Деннис

1
Также было бы интересно узнать, могу ли я попытаться превзойти ваше представление грабителя, сделав еще одного полицейского (опять же, используя Jelly или MATL)
flawr


1

Рубин, 23 байта

->x{('228'*x).to_i%257}

Диапазон и домен 0..255. Объедините 228 с собой x раз, затем возьмите результат по модулю 257 (от 0 до 0). 228 - это первое магическое число после 9, которое работает для этого диапазона (дает различные значения, которые не включают 256).


0

Python 3, 55 байт

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

Домен / Диапазон 0-255.


0

Python 3, 32 байта 32/23

V=lambda x:((3+x)%16)*16+x//16

Домен / Диапазон 0-255.

Перелистывает первые четыре байта с последними четырьмя и добавляет три к первым байтам.



0

Mathematica, 13 байт

Mod[#^7,257]&

Использует диапазон [1..256], хотя он одинаково действителен для диапазона [0..255]. Чтобы увидеть всю таблицу, скопируйте / вставьте одну из следующих строк кода в песочницу Wolfram :

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)

0

Brainfuck , 37/11

,+++++[>+++++++<-]>++[<+++++++++>-]<.

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

Не очень хорошо, но диапазон 0-255



@ Денис Отличная работа! Я не должен использовать такой язык байтов.
Кристофер

3
Кстати, цензура названий языков не очень хорошая идея. Да, у этого конкретного языка есть обычное и детское имя, но каждый знает, что означает звездочка, и он не может быть найден поисковой системой в ее текущей форме.
Деннис

@Dennis наконец исправил это
Кристофер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.