Машина Cheapo Enigma (Cops)


15

Для грабіжних поштов, машина Enigma Cheapo (грабіжники)

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

Розбійники спробують створити вашу зворотну функцію, використовуючи якомога коротший код. Отже, ваша мета - зробити вашу функцію важкою для інвертування.

Ви не можете використовувати вбудовані модулі, які мають єдину мету хешування або шифрування.

Кількість байтів не може перевищувати 64 байт. 0-байтні рішення не підлягають виграшу.

Формат вводу / виводу

8 біт (0 або 1) або ціле число базового 10 в діапазоні 1-256, 0-255 або від -128 до 127. Можна використовувати стандартний введення / вивід або файл I / O. Функція також може повернути значення як вихід. Вхід і вихід повинні належати до одного діапазону (двійкові, 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
З чого складається подання поліцейського? Мова, розмір та повний код програми / функції?
Арнольд

1
це не трохи зламано, якщо поліцейський може просто зробити довільно велику річ?
Зруйнований лимон

1
Цей розбійник може бути ви що , якщо я відправляю 64-байтовий поліцейський відповідь , який відображає N на N і грабіжника відповідь , який робить те ж саме в один байт?
Арнольд

1
Ви можете уточнити, чи / як слід оновлювати подання поліцейських, коли на це відповідають грабіжники. (Здається, звичайне оновлення "тріщинами" тут не застосовується. Принаймні, не як унікальний і остаточний тріщина.)
Арнольд,

3
По-друге, ви можете повністю усунути це правило. Я можу знищити більшість відповідей, розмістивши розбійника в Джелі.
Денніс

Відповіді:


7

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

x=>x^x/2

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


Я думаю, x^x/4буде складніше, тому що для цього не повинно бути вбудованих…
Крістоф


1
Як це біектив?
Leaky Nun

1
@LeakyNun Uhm не впевнений, яку відповідь ви очікуєте, але я спробую: Сірий код - це альтернативна форма подання числа, де кожне число підряд змінюється лише на 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 (як пов'язано).


Я дуже розчарований, що мені не вдалося змусити таку версію, як моя оригінальна ( f(x){return rand(srand(x*229))/229%256;}) працювати над TIO, оскільки я думаю, що це набагато елегантніше. Оскільки це працює тільки на Clang, що працює на OS X, це не справедливо для конкуренції. Це все ще досить незручно, тому я думаю, цього достатньо.


Ну .. Це цікаво!
Меттью Рох

Тут є рішення , але мені було важко з вашим srand(), тому вам доведеться вирішити, чи прийнятно це в цій формі.
Яблуко

Я не бачу, як ця програма відповідає вимозі Bijection, оскільки вихід випадковий, не кожен вхід має унікальний вихід.
Post Rock Garf Hunter

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), щоб переставити всі числа від 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-бітовому int).
Крістоф

Оцінка 27/29 . Мені це подобається !
Крістоф

1
Спасибі! Правила дозволяють мені вказати діапазон [1,256], і це бієктивно для цього діапазону.
гістократ

1

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

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


1

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

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

Діапазон і домен 0..255. Об'єднайте 228 у х разів, а потім візьміть результат по модулю 257 (0 карт до 0). 228 - це перше магічне число після 9, яке працює для цього діапазону (дає чіткі значення, що не включають 256).




0

Математика, 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

мозковий ебать , 37/11

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

Спробуйте в Інтернеті!

Не дуже добре, але діапазон 0-255



@Dennis Nice job! I should not use such a bytey language.
Christopher

3
By the way, censoring language names isn't a good idea. Yes, this particular languages has an ordinary and childish name, but everyone knows what the asterisk stands for, and it cannot be found by the search engine in its current form.
Dennis

@Dennis finally fixed that
Christopher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.