La sfida
Vi presento un'altra sfida spia contro spia che mette gli offuscatori contro i cracker. In questo caso, tuttavia, il dato da proteggere non è un input ma un output .
Le regole della sfida sono semplici. Scrivi una routine con le seguenti specifiche:
- La routine può essere scritta in qualsiasi lingua ma non può superare i 320 byte.
- La routine deve accettare tre numeri interi con segno a 32 bit come input. Può assumere la forma di una funzione che accetta 3 argomenti, una funzione che accetta un singolo array di 3 elementi o un programma completo che legge 3 numeri interi da qualsiasi input standard.
- La routine deve generare un intero a 32 bit con segno.
- Su tutti i possibili input, la routine deve produrre tra 2 e 1000 valori univoci (inclusi). Il numero di valori univoci che una routine può generare è chiamato chiave .
Ad esempio, il programma C.
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
ha una chiave di 9, dato che (si spera) può solo emettere i nove valori 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, e 24
.
Alcune limitazioni aggiuntive sono le seguenti:
- La routine deve essere completamente deterministica e invariante nel tempo, restituendo output identici per input identici. La routine non dovrebbe effettuare chiamate a generatori di numeri pseudocasuali.
- La routine potrebbe non basarsi su "variabili nascoste" come dati in file, variabili di sistema o funzionalità del linguaggio esoterico. Ad esempio, le routine in genere non devono fare riferimento a costanti a meno che le costanti non siano chiaramente definite nel codice stesso. Anche le routine che si basano su stranezze del compilatore, output da operazioni matematicamente indefinite, errori aritmetici, ecc. Sono fortemente scoraggiate. In caso di dubbi, si prega di chiedere.
- Tu (il programmatore) devi sapere con precisione quanti output unici può produrre la routine e dovresti essere in grado di fornire almeno una sequenza di input che produce ogni output. (Poiché potrebbero esserci centinaia di output univoci, questo set verrà sempre e solo richiesto nel caso in cui la tua chiave venga contestata.)
Poiché questo problema mostra molto meno la somiglianza con la crittografia classica rispetto alla precedente, mi aspetto che sia accessibile a un pubblico più ampio.
Più creativo è, meglio è.
Il punteggio
Il numero più basso di invii non crackati per numero di byte verrà dichiarato vincitore.
In caso di confusione, non esitare a chiedere o commentare.
La contro-sfida
Tutti i lettori, compresi quelli che hanno presentato la propria routine, sono incoraggiati a "infrangere" le richieste. Un invio viene decifrato quando la sua chiave viene pubblicata nella sezione commenti associati. Se un invio persiste per 72 ore senza essere modificato o crackato, viene considerato "sicuro" e qualsiasi successivo successo nel cracking verrà ignorato per motivi di contest.
È consentito un solo tentativo di crack per invio per lettore. Ad esempio, se invio all'utente X: "la tua chiave è 20" e sbaglio, l'utente X declinerà la mia ipotesi come errata e non potrò più inviare ipotesi aggiuntive per tale invio.
Le comunicazioni incrinate vengono eliminate dalla contesa (a condizione che non siano "sicure"). Non dovrebbero essere modificati. Se un lettore desidera presentare una nuova routine, deve farlo in una risposta separata.
Il punteggio di un cracker è il numero di invii (conformi o meno) che cracka. Per i cracker con conteggi identici, la classifica è determinata dal conteggio totale dei byte in tutti gli invii crackati (maggiore è, migliore).
I cracker con il punteggio più alto saranno dichiarati vincitori insieme agli sviluppatori delle routine vincenti.
Si prega di non crackare la propria richiesta.
Buona fortuna. :)
Classifica
Ultimo aggiornamento 2 settembre, 10:45 EST
Barriere immobili (invii non incrinati):
- CJam, 105 [Dennis]
Forze inarrestabili (cracker):
- Dennis [ Java, 269 ; C, 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
ecc ...