Cheapo Enigma machine (Cops)

15

Dla stanowiska rabusiów maszyna Cheapo Enigma (Rabusie)

Zgłoszenie gliniarza będzie się składało z programu / funkcji, która akceptuje jeden bajt danych i zwraca jeden bajt danych. Każde możliwe wejście musi dawać unikalny wynik. (Innymi słowy, twoja funkcja musi być bijectywna)

Rabusie spróbują utworzyć twoją funkcję odwrotną, używając możliwie najkrótszego kodu. Twoim celem jest utrudnienie odwrócenia funkcji.

Nie można używać wbudowanych funkcji, których jedynym celem jest mieszanie lub szyfrowanie.

Liczba bajtów nie może przekraczać 64 bajtów. Rozwiązania 0-bajtowe nie kwalifikują się do wygranej.

Format wejścia / wyjścia

8 bitów (0 lub 1) lub liczba całkowita base-10 w zakresie 1-256, 0-255 lub od -128 do 127. Może używać standardowych we / wy lub we / wy pliku. Funkcja może również zwrócić wartość jako wynik. Wejścia i wyjścia powinny należeć do tego samego zakresu (binarny, 1-256, 0-255 lub od -128 do 127). Złodziej będzie również zobowiązany do korzystania z tego zakresu na wejściu i wyjściu.

Punktacja

Stosunek twojego bajtu liczy się do próby najlepszej rabusia przeciwko tobie. Najniższy wynik wygrywa.

Możesz wygrać (jako policjant) tylko wtedy, gdy złodziej próbował cię pokonać. (Ten rabuś może być tobą)

Przykład

C ++, używa zakresu 0-255, 31 bajtów

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

Możliwe złożenie rabusia w C ++, 32 bajty

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

Używanie tego samego języka lub podobnego algorytmu nie jest wymagane

Daje to wynik 31/32 = 0,97 zarówno gliniarzowi, jak i rabusiom.

ghosts_in_the_code
źródło
1
Z czego składa się zgłoszenie policjanta? Język, rozmiar i pełny kod programu / funkcji?
Arnauld
1
czy to nie jest trochę zepsute, jeśli policjant może zrobić dowolnie dużą rzecz?
Zniszczalna cytryna
1
Tym złodziejem może być Ty Co, jeśli opublikuję 64-bajtową odpowiedź policjanta, która odwzorowuje N na N, i odpowiedź rabusia, która robi to samo w jednym bajcie?
Arnauld
1
Możesz sprecyzować, czy / jak należy przesłać zgłoszenie policjanta, gdy złodzieje odpowiedzą na to pytanie. (Chyba nie dotyczy to zwykłej aktualizacji „cracked”. Przynajmniej nie jako wyjątkowej i ostatecznej crack).
Arnauld
3
Po zastanowieniu, możesz chcieć całkowicie usunąć tę regułę. Mogę zniszczyć większość odpowiedzi, umieszczając rabusia w Galaretce.
Dennis

Odpowiedzi:

7

JavaScript, 11 8 bajtów, wynik: 8/5

x=>x^x/2

Prosta implementacja szarego kodu. Dekodowanie zwykle wymaga całej pętli. Zobaczmy, kto wymyśli najmniejszy, a nawet bez pętli!

Christoph
źródło
Myślę, że x^x/4będzie trudniej, ponieważ nie powinno się na to wbudować ...
Christoph
1
Wynik: 8/25
Arnauld
1
Jak tam ten bijective?
Leaky Nun
1
@LeakyNun Uhm nie jestem pewien, jakiej odpowiedzi oczekujesz, ale spróbuję: szary kod jest alternatywną formą reprezentowania liczby, w której każda kolejna liczba zmienia się tylko w 1 bicie (odległość hammig wynosi zawsze 1). Dla każdej liczby jest dokładnie jedno szare kodowanie i jedno kodowanie binarne, dlatego tworzą one bijection. Np. 7 to 0111 w systemie binarnym i 0100 w kolorze szarym, kolejna liczba 8 to 1000 w systemie binarnym i 1100 w kolorze szarym. Kodowanie szare jest w zasadzie kodowaniem krawędziowym kodu binarnego.
Christoph
1
@LeakyNun ^jest bitowy xor, a nie potęgowanie. W każdym razie wygląda magicznie
Евгений Новиков
7

C, 64 bajty, wynik 64/71 = 0,901

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

Pobiera dane z zakresu [0 255].

Wypróbuj online! - w TIO (przy użyciu GCC) daje to:

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

Zauważ, że w innych systemach może generować inne (ale nadal prawidłowe) dane wyjściowe, ponieważ C nie wymaga konkretnej randimplementacji. Moje zgłoszenie dotyczy konkretnie wersji działającej na TIO (jako link).


Jestem bardzo rozczarowany, że nie byłem w stanie uzyskać wersji takiej jak moja oryginalna ( f(x){return rand(srand(x*229))/229%256;}) do pracy na TIO, ponieważ uważam, że jest to o wiele bardziej eleganckie. Ponieważ działa to tylko na Clang z systemem OS X, nie jest to uczciwe dla konkurencji. Ten wciąż jest dość niewygodny do cofnięcia, więc chyba wystarczy.

Dave
źródło
Cóż ... to zabawne!
Matthew Roh
Rozwiązanie tutaj , ale miałem trochę trudności z twoim srand(), więc musisz zdecydować, czy jest to dopuszczalne w tej formie.
Jabłkowy
Nie widzę, jak ten program spełnia wymóg Bijection, ponieważ dane wyjściowe są losowe, nie każde dane wejściowe mają unikalne dane wyjściowe.
Post Rock Garf Hunter
2
Problemem nie jest wdrożenie. Problem polega na tym, że brakuje w nim wszystkich kluczowych idei tego wyzwania: znalezienie prostego algorytmu (ograniczonego do 64 bajtów i niezależnego od języka), którego odwrócenie nie jest łatwe. Twoje zgłoszenie „wydaje się” mieć lukę w kwestii: niezależności językowej, limitu 64 bajtów przez outsourcing do nieznanej implementacji wbudowanego (rand nie zależy od języka, ale lokalnego stdlib ) i reguły mieszania / szyfrowania. Jest to zgodne z zasadami PPCG, ale na pewno nie tym, co ghosts_in_the_code zamierzał z jego zasadami.
Christoph
1
@ghosts_in_the_code dobre RNG i funkcje skrótu są zaprojektowane tak, aby były prawie nieodwracalne. Dlatego uważam, że należy je uwzględnić w tej regule (nawet jeśli rzeczywista implementacja może nie zostać zaprojektowana w ten sposób). W każdym razie nie polecam zmiany zasad na tym etapie.
Christoph
2

JavaScript, 44 bajty 22/3

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

Używa sortowania leksykograficznego (domyślnie Javascript), aby zmienić kolejność wszystkich liczb od 0-255

Wypróbuj online!

Fəˈnɛtɪk
źródło
1
22/3 - inny język wydaje się akceptowalny, nawet jeśli jest trochę dziwny. Myślałem, że mam 5, ale 256 mi przeszkadzało :).
Jonathan Allan,
1

JavaScript, 11/8 bajtów

x=>x**5%257

Domena / zakres wynosi od 1 do 256.

histocrat
źródło
Hm, czy JavaScript jest zły z dużą liczbą wykładników? Działa to w Ruby: repl.it/HXvZ/0
histocrat
JavaScript ma tylko zmiennoprzecinkowe podwójnej precyzji, więc nie można dokładnie przedstawić niczego z więcej niż ~ 53 bitami. x**3i x**5powinien działać.
Dennis,
Cóż, słusznie mi zakładam. Zmienię języki.
histocrat
Albo zrób sugestię Dennisa, biorąc pod uwagę zasady sprzyjające językom terser. :) Dziękuję Ci!
histocrat
Niestety, reguły są w tej chwili nieco złamane i pozwoliłbym na odwrócenie tego w innym języku. Właśnie ze względu na limit precyzji będzie to dość szczegółowe, aby odwrócić za pomocą JS.
Dennis,
1

JavaScript, 27/29 bajtów

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

Edycja: Zakres / Domena to 1..256. Generowane brutalnie, mniej więcej.

histocrat
źródło
Niestety jest to bijective, ale nie w zakresie [0,256): wartość 130 nigdy nie jest generowana, ale wartość 256 to (co nie pasuje do 8-bitowej wartości int).
Christoph
Ocena 27/29 . Lubię to !
Christoph
1
Dzięki! Reguły pozwalają mi określić zakres [1,256] i jest ono bijectywne w tym zakresie.
histocrat
1

Oktawa , 16/6

@(x)mod(x*3,256)

Wypróbuj online!

wada
źródło
1
Punktacja: 16/6 (Uwaga: nie sądzę, aby można było używać innego języka do zgłaszania rabusiów, ale w tym momencie tak jest.)
Dennis
1
Interesujące byłoby również wiedzieć, czy mogę spróbować pokonać twojego złodzieja, robiąc kolejnego gliniarza (ponownie używając również Galaretki lub MATL-a)
flawr
1

Java, 35 bajtów

int a(int v){return (v*v+v)%512/2;}

Domena / zakres to 0-255

Targz
źródło
Wynik: 35/7
Dennis
1

Rubinowy, 23 bajty

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

Zasięg i dziedzina to 0..255. Połącz 228 ze sobą x razy, a następnie weź wynik modulo 257 (0 map na 0). 228 to pierwsza magiczna liczba po 9, która działa dla tego zakresu (daje wyraźne wartości, które nie obejmują 256).

histocrat
źródło
0

Python 3, 55 bajtów

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

Domena / zakres wynosi 0–255.

Magenta
źródło
0

Python 3, 32 bajty 32/23

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

Domena / zakres wynosi 0–255.

Odwraca pierwsze cztery bajty z ostatnimi czterema i dodaje trzy do pierwszych bajtów.

Magenta
źródło
1
Punktacja 32/23
Christoph
0

Mathematica, 13 bajtów

Mod[#^7,257]&

Używa zakresu [1..256], chociaż jest równie poprawny w zakresie [0..255]. Aby zobaczyć całą tabelę, skopiuj / wklej jeden z następujących wierszy kodu do piaskownicy 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)
Greg Martin
źródło
0

pieprzenie mózgu , 37/11

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

Wypróbuj online!

Niezbyt dobry, ale zakres 0–255

Krzysztof
źródło
Wynik: 37/11
Dennis
@Dennis Dobra robota! Nie powinienem używać takiego bajkowego języka.
Christopher
3
Nawiasem mówiąc, cenzurowanie nazw języków nie jest dobrym pomysłem. Tak, ten konkretny język ma zwykłą i dziecinną nazwę, ale wszyscy wiedzą, co oznacza gwiazdka, a wyszukiwarka nie może jej znaleźć w obecnej formie.
Dennis
@Dennis ostatecznie to naprawił
Christopher