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
deck
de 52 números inteiros distintos representando os cartões. Quando você inicia,deck
conté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 intsmin
emax
, 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çõesx
ey
trocarão de lugar.
Quando:
- O programa chama
shuffle()
(oushuffle(deck)
oudeck.shuffle()
ou como sua implementação gosta de executar),
Então:
deck
deve conter exatamente um de cada cartão em ordem perfeitamente aleatória.
A pegada:
Você não pode declarar nenhuma variável. Ligue swap
e rand
quantas vezes quiser, mas você não pode declarar nenhuma variável sua. Isso inclui for
contadores 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
swap
para 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. deck
pode 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
swap
erand
: 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.
deck
ele próprio.
swap
desejar, desde que cumpra seu objetivo básico. Parte da minha razão de dar swap
um 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ê.