De entrada y salida:
Entrada : Una cadena uniformemente aleatoria, infinitamente larga de '0's y' 1's, tomada de stdin. Se supone que la cadena es verdaderamente aleatoria, no seudoaleatoria. Es uniforme porque cada personaje es igualmente probable que sea un '0' o '1'.
¡Cuidado! La entrada es infinitamente larga, por lo que no puede almacenarlo todo en la memoria utilizando una función como raw_input () en python. Si no me equivoco, golfscript fallará con una entrada infinita, ya que empuja toda la entrada a la pila antes de correr.
Salida : un mazo estándar aleatorio uniformemente aleatorio, sin comodines. Es uniforme porque todos los pedidos son igualmente probables.
Cada carta en la salida es su rango, A, 2-9, T, J, Q o K concatenados con su palo, c, d, ho s. Por ejemplo, el 10 de espadas esTs
Las cartas del mazo deben estar separadas por espacios.
No puede utilizar bibliotecas o funciones aleatorias integradas porque no son realmente aleatorias, solo pseudoaleatorias.
Entrada de ejemplo
Puede usar el siguiente script de Python para canalizar la entrada en su programa:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Si guarda el script como rand.py, pruebe su programa con python rand.py | your_program
En Python 3 se ejecuta como se esperaba, pero en Python 2.7 recibo un mensaje de error después de la salida de mi programa, pero solo después de que todo está hecho, así que simplemente ignore el mensaje de error.
Salida de ejemplo:
Así es como se debe imprimir el mazo si se baraja en un orden ordenado:
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
Puntuación:
Este es un código de golf. El código más corto gana.
Programa de ejemplo:
Aquí hay una solución de Python 2.7, no golfizada.
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))),
Respuestas:
Ruby,
8987 caracteresEditar: versión anterior
fuente
Python 122
Explicación:
Las tarjetas no utilizadas se almacenan en D. Esto simplemente obtiene el siguiente índice aleatorio válido de la secuencia de entrada y extrae ese elemento de D.
A menos que me falte algo, no debería haber un sesgo. El script arrojará cualquier índice inválido>
len(D)
, pero esto no da lugar a un sesgo para números más bajos porque cada pop sucesivo reducirá el índice de cada elemento pasado que i.fuente
Perl, 80 caracteres
Aquí hay otra implementación que no sufre el sesgo y tiene dos caracteres más cortos:
implementación anterior (82 caracteres):
Descripción de implementación anterior:
fuente
sort
, lo que dará lugar a un sesgo hacia el orden alfabético.C,
197178161 caracteresEDITAR : Usando una nueva función aleatoria, que es mucho más corta: lee un entero de 4 dígitos
s
y lo usas%64
. Cada número decimal de 6 dígitos hecho de 0 y 1 solamente, toma%64
resultados en un resultado único, por lo que la aleatoriedad es buena.Este enfoque consume muchos más bits aleatorios, pero es significativamente más corto.
La lógica básica es simple: inicialice una matriz de 52 entradas con 0..51, baraje (reemplace aleatoriamente el elemento x con otro del rango 0..x), imprima formateado (n / 4 = rango, n% 4 = palo) .
Un bucle, que se ejecuta 104 veces, realiza la inicialización (primeras 52 ejecuciones), barajar e imprimir (últimas 52 ejecuciones).
Se genera un número aleatorio tirando
n
bits aleatorios, hasta que1<<n
sea al menos el máximo deseado. Si el resultado es más que el máximo, vuelva a intentarlo.fuente
s>7?"ATJQK"[s-8]:s+50
es más largo que lo simple"A23456789TJQK"[s]
. En segundo lugar, puede usart/4
y ent%4
lugar det%13
yt/13
.t
volver a colocarlo en la matriz cuando seunix shell ~ 350
Esto no es corto ni bonito, ni es eficiente, sin embargo, me preguntaba qué tan difícil sería hacer esto con las utilidades estándar de shell de Unix.
Esta respuesta divide la cadena binaria infinita en longitudes de 6 bits y solo elige aquellas que están en el rango correcto (1-52), aquí la cadena binaria infinita se simula con urandom y xxd:
El corte y la selección se realizan con fold, sed y bc:
Esto produce líneas como:
Que se puede dirigir a bc.
De esta secuencia de números, la secuencia de la baraja se elige así (estoy usando zsh, pero la mayoría de las conchas modernas deberían ser adaptables a esto):
La secuencia de números aleatorios ahora debe cambiarse a nombres de tarjeta. La secuencia del nombre de la tarjeta se genera fácilmente con GNU paralelo:
Combinando la salida de los dos últimos comandos con pegar y ordenando los números:
Todo como un monstruoso one-liner (solo probado en zsh):
Editar: versión de bash agregada
Aquí hay una versión que funciona en bash. Eliminé los
{ }
índices in-shell y array están basados en cero. El vacío de la matriz se verifica con la expansión de parámetros, un poco más eficiente y también se adopta en el ejemplo anterior.fuente
K&R c - 275
char
literales restantes conint
literalesGolfizado:
Bastante fuerza bruta aquí. Acabo de leer nueve bits de la entrada para formar una salida RNG mínima, y hago la reducción habitual del módulo redibujar si los valores no utilizados al final para obtener una salida uniforme para alimentar una selección aleatoria.
Esta versión sin golf difiere en que toma la entrada en
/dev/urandom
lugar del formato de entrada descrito.fuente
"TJQKA"
y"cdhs"
?int
s. Lo entiendo. Todavía podría valer la pena guardar toda la puntuación. Incluso podría factorizar lachar
salidagetchar
yputchar
con una macro pastosa loca ...#define N
y terminar con una nueva línea que cuenta como un personaje y eso es 11, más el bit que está reemplazando. Ciertamente, hay algunos caracteres más al reemplazar algunos o todos los literales de caracteres con literales int, pero es tarde aquí ... tal vez lo haré en otro momento.PHP, 158 caracteres
Se agregaron nuevas líneas para evitar que el bloque de código gane barras de desplazamiento, se pueden eliminar con seguridad.
Antes de que me digan que agregue un
<?php
, déjeme saber que puede invocar PHP sin esta etiqueta con bastante facilidad, usando:cat golf.php | php -a
De golf y comentado:
Hay dos errores esperados, que no afectan la salida del programa.
La primera es porque
$a
no se inicializa, pero el NULL se convierte a 0 y el programa continúa.El segundo es porque la secuencia de caracteres parece obtener una nueva línea desde algún lugar, incluso si no se proporciona (buen ol 'PHP), y ese es un índice indefinido en la matriz. Es el último carácter de entrada y no afecta a la salida.
fuente