Lo scopo di questo puzzle è prendere un mazzo di 52 carte e mescolarlo in modo che ogni carta sia in una posizione casuale.
Dato:
- Un array,
deck
di 52 interi distinti che rappresentano le carte. Quando inizi,deck
contiene esattamente una di ogni carta in un ordine sconosciuto. - Una funzione,
int rand(min, max)
che restituisce un numero intero casuale tra intsmin
emax
, compreso. Puoi presumere che questa funzione sia veramente casuale. - Una funzione
void swap(x, y)
che scambia due carte nel mazzo. Se chiamiswap(x, y)
, le carte in posizionix
ey
cambieranno posto.
Quando:
- Il programma chiama
shuffle()
(oshuffle(deck)
odeck.shuffle()
comunque l'esecuzione della tua implementazione),
Poi:
deck
dovrebbe contenere esattamente una di ogni carta in ordine perfettamente casuale.
La presa:
Non puoi dichiarare alcuna variabile. Chiama swap
e rand
quanto vuoi, ma non puoi dichiarare alcuna tua variabile. Ciò include i for
contatori di loop - anche quelli impliciti come in a foreach
.
chiarimenti:
- È possibile modificare i dettagli minori in base alla lingua scelta. Ad esempio, puoi scrivere
swap
per cambiare due numeri interi come riferimento. Le modifiche dovrebbero essere per rendere questo lavoro con la tua lingua, non per facilitare il puzzle. deck
può essere una variabile globale oppure puoi prenderla come parametro.- Puoi fare tutto quello che vuoi sul contenuto di
deck
, ma non puoi cambiarne la lunghezza. - Le tue carte possono essere numerate 0-51, 1-52 o qualsiasi altra cosa tu voglia.
- Puoi scriverlo in qualsiasi lingua, ma senza barare con la
shuffle
funzione integrata della tua lingua . - Sì, potresti scrivere la stessa riga 52 volte. Nessuno sarà impressionato.
- Il tempo di esecuzione non ha importanza, ma la vera casualità lo è.
- Questo non è in realtà un codice golf, ma sentiti libero di minimizzare / offuscare il tuo codice.
Modifica: codice della caldaia e visualizzatore
Se hai utilizzato .NET o JavaScript, ecco alcuni codici di test che potresti trovare utili:
JavaScript:
- Visualizzatore JavaScript rapido e sporco, con origine CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Versione eseguibile (basta incollare la tua
shuffle()
funzione): http://jsfiddle.net/4zxjmy42/
C #:
- Visualizzatore ASP.NET con codice C # dietro: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub con solo i metodi di utilità
swap
erand
: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Questo codice ordina e mescola il mazzo diverse migliaia di volte ed esegue alcuni test di sanità mentale di base: per ogni shuffle, verifica che ci siano esattamente 52 carte nel mazzo senza ripetizioni. Quindi il visualizzatore traccia la frequenza di ciascuna carta che finisce in ogni punto del mazzo, mostrando una mappa di calore in scala di grigi.
L'output del visualizzatore dovrebbe apparire come neve senza alcun motivo apparente. Ovviamente non può dimostrare la vera casualità, ma è un modo rapido e semplice per effettuare controlli a campione. Raccomando di usarlo o qualcosa del genere, perché alcuni errori nell'algoritmo di shuffling portano a schemi molto riconoscibili nell'output. Ecco un esempio dell'output di due implementazioni, una con un difetto comune:
La versione difettosa mescola parzialmente il mazzo, quindi potrebbe sembrare soddisfacente se si esamina l'array a mano. Il visualizzatore rende più semplice notare un motivo.
deck
se stesso.
swap
desideri, purché soddisfi il suo scopo fondamentale. Parte della mia ragione per fare swap
un dato era che le persone potessero trattarlo come "magico" e concentrarsi sul problema principale senza doversi preoccupare che funzionasse nella loro lingua preferita. Puoi farlo o scrivere il tuo swap
, dipende da te.