Entrada / Saída:
Entrada : Uma sequência uniformemente aleatória, infinitamente longa, de '0' e '1', tirada de stdin. A string é assumida como sendo verdadeiramente aleatória, não pseudo-aleatória. É uniforme que cada personagem tem a mesma probabilidade de ser um '0' ou '1'.
Cuidado! A entrada é infinitamente longa, portanto você não pode armazenar tudo na memória usando uma função como raw_input () em python. Se não me engano, golfscript falhará com entrada infinita, pois coloca toda a entrada na pilha antes da execução.
Saída : Um baralho padrão aleatório e aleatoriamente uniforme, sem coringas. É uniforme, pois todos os pedidos são igualmente prováveis.
Cada carta na saída é sua classificação, A, 2-9, T, J, Q ou K concatenadas com seu naipe, c, d, h ou s. Por exemplo, o 10 de espadas éTs
As cartas do baralho devem ser separadas por espaços.
Você não pode usar bibliotecas ou funções aleatórias internas porque elas não são verdadeiramente aleatórias, apenas pseudo-aleatórias.
Exemplo de entrada
Você pode usar o seguinte script python para canalizar a entrada no seu programa:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Se você salvar o script como rand.py, teste seu programa com python rand.py | your_program
No python 3, ele é executado conforme o esperado, mas no python 2.7, recebo uma mensagem de erro após a saída do meu programa, mas somente depois que tudo estiver pronto, então ignore a mensagem de erro.
Exemplo de saída:
Veja como o baralho deve ser impresso, se for embaralhado em uma ordem classificada:
Ac 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ad 2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ah 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh As 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks
Pontuação:
Este é um código de golfe. O menor código vence.
Exemplo de programa:
Aqui está uma solução python 2.7, não jogada de golfe.
import sys
def next():
return int(sys.stdin.read(1))==1
def roll(n):
if n==1:
return 0
if n%2==0:
r=roll(n/2)
if next():
r+=n/2
return r
else:
r=n
while(r==n):
r=roll(n+1)
return r
deck = [rank+suit for suit in 'cdhs' for rank in 'A23456789TJQK']
while len(deck)>0:
print deck.pop(roll(len(deck))),
Respostas:
Ruby,
8987 caracteresEditar: versão anterior
fonte
Python 122
Explicação:
Os cartões não utilizados são armazenados em D. Isso simplesmente obtém o próximo índice aleatório válido do fluxo de entrada e exibe esse elemento em D.
A menos que esteja faltando alguma coisa, não deve haver um viés. O script lançará quaisquer índices inválidos>
len(D)
, mas isso não resultará em um viés para números mais baixos, porque cada pop sucessivo reduzirá o índice de cada elemento além de i.fonte
Perl, 80 caracteres
aqui está outra implementação que não sofre o viés e é dois caracteres mais curta:
implementação antiga (82 caracteres):
descrição antiga da implementação:
fonte
sort
, resultando em um viés em relação à ordem alfabética.C,
197178161 caracteresEDIT : Usando uma nova função aleatória, que é muito mais curta - lê um número inteiro de 4 dígitos
s
e usas%64
. Cada número decimal de 6 dígitos composto apenas por 0 e 1%64
resulta em um resultado único, portanto a aleatoriedade é boa.Essa abordagem consome muito mais bits aleatórios, mas é significativamente mais curta.
A lógica básica é simples - inicialize uma matriz de 52 ints com 0..51, embaralhe (substitua aleatoriamente o elemento x por outro do intervalo 0..x), imprima no formato (n / 4 = classificação, n% 4 = naipe) .
Um loop, que é executado 104 vezes, faz a inicialização (primeiras 52 execuções), baralhamento e impressão (últimas 52 execuções).
Um número aleatório é gerado puxando
n
bits aleatórios, até que1<<n
seja pelo menos o máximo desejado. Se o resultado for maior que o máximo - tente novamente.fonte
s>7?"ATJQK"[s-8]:s+50
é mais longo que o simples"A23456789TJQK"[s]
. Segundo, você pode usart/4
e emt%4
vez det%13
et/13
.t
de volta para a matriz quando a saídashell unix ~ 350
Isso não é curto nem bonito, nem é eficiente, no entanto, eu queria saber o quão difícil seria fazer isso com os utilitários de shell unix padrão.
Esta resposta divide a cadeia binária infinita em comprimentos de 6 bits e escolhe apenas aquelas que estão no intervalo correto (1-52), aqui a cadeia binária infinita é simulada por urandom e xxd:
O corte e seleção são feitos com fold, sed e bc:
Isso produz linhas como:
Que pode ser direcionado para bc.
A partir desse fluxo de números, a sequência do baralho é escolhida assim (estou usando zsh, mas a maioria dos shells modernos deve ser adaptável a isso):
A sequência numérica aleatória agora precisa ser alterada para nomes de cartões. A sequência do nome do cartão é facilmente gerada com o GNU paralelo:
Combinando a saída dos dois últimos comandos com colar e classificar os números:
A coisa toda como um one-liner monstruoso (testado apenas no zsh):
Editar - versão do bash adicionada
Aqui está uma versão que funciona no bash. Eu removi os
{ }
índices in-shell e array são baseados em zero. O vazio da matriz é verificado com a expansão dos parâmetros, um pouco mais eficiente e também adotada no exemplo acima.fonte
K&R c - 275
char
literais restantes porint
literaisGolfe:
Bastante força bruta aqui. Acabei de ler nove bits da entrada para formar uma saída RNG mínima e fazer a redução usual do módulo redesenhar-se-não-usar-os-valores-no-final para obter uma saída uniforme para alimentar um shuffle de seleção.
Esta versão sem golfe difere na medida em que recebe a entrada
/dev/urandom
e não no formato de entrada descrito.fonte
"TJQKA"
e"cdhs"
?int
s. Entendi. Pode ainda valer a pena salvar toda a pontuação. Pode até levar ochar
foragetchar
eputchar
com uma macro pastosa louco ...#define N
e terminar com uma nova linha que conta como caractere e que é 11, mais a parte que você está substituindo. Certamente há mais alguns caracteres na substituição de alguns ou de todos os literais de caracteres por literais int, mas é tarde aqui ... talvez eu faça isso outra vez.PHP, 158 caracteres
Novas linhas foram adicionadas para impedir que o bloco de código ganhe barras de rolagem; elas podem ser removidas com segurança.
Antes que me digam para adicionar um
<?php
, saiba que você pode chamar o PHP sem essa tag facilmente, usando:cat golf.php | php -a
De-golfe e comentou:
Há dois erros esperados, que não afetam a saída do programa.
O primeiro é porque
$a
não foi inicializado, mas o NULL é convertido em 0 e o programa continua.A segunda é porque o fluxo de caracteres parece obter uma nova linha de algum lugar, mesmo que não seja fornecida (bom e velho PHP), e esse é um índice indefinido na matriz. É o último caractere da entrada e não afeta a saída.
fonte