O objetivo deste quebra-cabeça é pegar um baralho de 52 cartas e embaralhá-lo para que cada carta esteja em uma posição aleatória.
Dado:
- Uma matriz
deckde 52 números inteiros distintos representando os cartões. Quando você inicia,deckcontém exatamente um de cada cartão em alguma ordem desconhecida. - Uma função
int rand(min, max),, que retorna um número inteiro aleatório entre intsminemax, inclusive. Você pode assumir que esta função é verdadeiramente aleatória. - Uma função
void swap(x, y)que troca duas cartas no baralho. Se você ligarswap(x, y), os cartões nas posiçõesxeytrocarão de lugar.
Quando:
- O programa chama
shuffle()(oushuffle(deck)oudeck.shuffle()ou como sua implementação gosta de executar),
Então:
deckdeve conter exatamente um de cada cartão em ordem perfeitamente aleatória.
A pegada:
Você não pode declarar nenhuma variável. Ligue swape randquantas vezes quiser, mas você não pode declarar nenhuma variável sua. Isso inclui forcontadores de loop - mesmo implícitos, como em a foreach.
Esclarecimentos:
- Você pode alterar detalhes menores para se adequar ao idioma escolhido. Por exemplo, você pode escrever
swappara alternar dois números inteiros por referência. As alterações devem ser para facilitar o trabalho no seu idioma, não para facilitar o quebra-cabeça. deckpode ser uma variável global ou você pode aceitá-la como um parâmetro.- Você pode fazer o que quiser com o conteúdo
deck, mas não pode alterar o comprimento. - Seus cartões podem ser numerados de 0 a 51, 1-52 ou qualquer coisa que você desejar.
- Você pode escrever isso em qualquer idioma, mas sem trapacear com a função interna do seu idioma
shuffle. - Sim, você pode escrever a mesma linha 52 vezes. Ninguém ficará impressionado.
- O tempo de execução não importa, mas a verdadeira aleatoriedade importa.
- Isso não é realmente um código de golfe, mas fique à vontade para minimizar / ofuscar seu código.
Edit: Visualizador de código e visualizador
Se você usou .NET ou JavaScript, aqui estão alguns códigos de teste que podem ser úteis:
JavaScript:
- Visualizador de JavaScript rápido e sujo, com fonte do CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Versão executável (basta colar na sua
shuffle()função): http://jsfiddle.net/4zxjmy42/
C #:
- Visualizador do ASP.NET com código C #; por trás: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub apenas com os métodos utilitários
swaperand: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Esse código classifica e embaralha o baralho milhares de vezes e realiza alguns testes básicos de sanidade: Para cada baralhamento, verifica se há exatamente 52 cartas no baralho sem repetições. Em seguida, o visualizador plota a frequência de cada cartão que termina em cada local do baralho, exibindo um mapa de calor em escala de cinza.
A saída do visualizador deve parecer neve sem padrão aparente. Obviamente, não pode provar a verdadeira aleatoriedade, mas é uma maneira rápida e fácil de verificar. Eu recomendo usá-lo ou algo parecido, porque certos erros no algoritmo de reprodução aleatória levam a padrões muito reconhecíveis na saída. Aqui está um exemplo da saída de duas implementações, uma com uma falha comum:

A versão defeituosa embaralha parcialmente o baralho, portanto, pode parecer bem se você examinar a matriz manualmente. O visualizador facilita a observação de um padrão.
deckele próprio.
swapdesejar, desde que cumpra seu objetivo básico. Parte da minha razão de dar swapum certo foi para que as pessoas pudessem tratá-lo como 'mágico' e se concentrar no problema principal sem ter que se preocupar com o fato de ele funcionar no idioma de sua escolha. Você pode fazer isso ou escrever o seu próprio swap, é com você.