Juega un juego de Dice Cricket

12

Dice Cricket es un juego que me presentaron cuando era niño y que he utilizado como una forma de pasar el tiempo durante años. No pude encontrar una página de Wikipedia, así que explicaré las reglas a continuación.

Reglas de cricket de dados

Premisa

Dice Cricket es un juego similar a anotar un juego de cricket mientras lo miras, pero en lugar de mirar y registrar el resultado, estás tirando un dado y registrando el resultado.

Los resultados se registran en una tabla como se muestra en la parte inferior.

Monitor

Dice Cricket utiliza una pantalla específica para mostrar toda la información que ocurre.

La tabla tiene 11 filas. Cada fila representa una masa. El diseño de la fila se explica a continuación.

+------+------------------------------+---------+-----+
| Name |    Runs                      | How Out |Score|
+------+------------------------------+---------+-----+
  • Nombre: el nombre debe ser una cadena compuesta completamente de letras, mayúsculas o minúsculas
  • Carreras: Un bateador puede enfrentar 30 bolas. Cada bola puede ser una de 1 2 4 6 . /. Esto se explicará con más detalle a continuación.
  • How Out: La forma en que la masa estaba fuera. Puede ser cualquiera deBowled, LBW (Leg Before Wicket), Caught, Retired or Not Out
  • Puntuación: la suma de todos los números en Runs

Cómo funciona el juego

En un juego, siempre hay 2 bateadores en el campo. El primer jugador es por defecto el bateador actual y el segundo en el bateador "off".

Un juego se compone de "bolas": cada bola en un partido de cricket está representada por una tirada de dados. Cada rollo hace un comando diferente:

  • 1,2,4 y 6 hacen que el bateador anote tanto. Si se lanza 1, la masa actual se convierte en la masa "apagada" y la masa "apagada" se convierte en la masa actual
  • 3 es una "bola de puntos", lo que significa que no pasa nada. Se representa en la Runssección como a .y puntúa 0. A 0no se puede usar para representarlo.
  • 5 es un wicket. Si se lanza 5, el bateador actual está "fuera". Esto significa que /se agrega a las carreras y, a partir de ese momento, el bateador no puede anotar más carreras. El bateador se intercambia con el siguiente bateador que no haya bateado. La How Outsección es una elección aleatoria de las posibles formas de salir:Bowled, LBW, Caught

Ejemplo para un wicket (esto es solo por claridad, no es así como se emite)

player a is on 4,6,2,6,4
player b is on 6,4,2,6,6
player c hasn't batted
player a is current batter

WICKET!!!

player a is on 4,6,2,6,4,/
player b in on 6,4,2,6,6
player c is on NOTHING
player c is current batter

Cada 6 bolas, los dos bateadores cambian; la masa actual se convierte en la masa "apagada" y la masa "apagada" se convierte en la masa actual

Si la Runssección está llena (30 bolas), la masa está fuera y la How Outsección está configurada en Retired. A / no se coloca al final de la Runscaja.

Reto real (sí, todas esas eran las reglas del juego)

Su desafío es generar una tabla completa (como el ejemplo al final), dada una lista de nombres. El contenido de la salida debe contener solo la tabla y / o los espacios en blanco iniciales o finales.

Reglas

  • Las lagunas estándar no están permitidas
  • Los 11 jugadores deberían tener algo en la Runssección.
  • Solo 1 jugador puede ser Not Out. Todos los demás jugadores no retirados deben estar fuera de una elección de[Bowled, LBW, Caught]
  • Los nombres pueden tener cualquier longitud entre 1 y 6 que coincida con la expresión regular A-Za-z
  • La línea final en la tabla debe ser la línea total (ver ejemplo)
  • No tiene que alinear el texto de la tabla de ninguna manera, pero los separadores de fila y columna deben estar alineados.

Ejemplo

Input:
['Fred', 'Sonya', 'David', 'Ben', 'Cody', 'Hazel', 'Nina', 'Kim', 'Cath', 'Lena', 'Will']
Output:
+------+------------------------------+---------+-----+
| Name | Runs                         | How Out |Total|
+------+------------------------------+---------+-----+
|Fred  |.662/                         | Caught  | 14  |
+------+------------------------------+---------+-----+
|Sonya |1164/                         | Caught  | 12  |
+------+------------------------------+---------+-----+
|David |/                             |   LBW   |  0  |
+------+------------------------------+---------+-----+
|Ben   |424/                          |   LBW   | 10  |
+------+------------------------------+---------+-----+
|Cody  |62/                           | Bowled  |  8  |
+------+------------------------------+---------+-----+
|Hazel |/                             |   LBW   |  0  |
+------+------------------------------+---------+-----+
|Nina  |161.6226166..44261442/        | Caught  | 64  |
+------+------------------------------+---------+-----+
|Kim   |11/                           | Caught  |  2  |
+------+------------------------------+---------+-----+
|Cath  |6.21/                         |   LBW   |  9  |
+------+------------------------------+---------+-----+
|Lena  |/                             | Bowled  |  0  |
+------+------------------------------+---------+-----+
|Will  |2                             | Not Out |  2  |
+------+------------------------------+---------+-----+
|               Total Runs                      | 121 |
+-----------------------------------------------+-----+
caird coinheringaahing
fuente
Sandbox
caird coinheringaahing
Je, solía jugar una variante similar de esto llamada "Grillo de mano".
totalmente humano
¿Qué determina cuándo termina el juego? ¿Es cuando un bateador está fuera y no queda nadie para reemplazarlo?
KSmarts
@KSmarts Correcto.
caird coinheringaahing
1
@ JonathanAllan Sí, no es un buen requisito. Eliminado
caird coinheringaahing

Respuestas:

2

Python 3 , 650 621 582 572 588 bytes

from random import*
h=str
c=h.center
a='+'.join(map('-'.__mul__,[0,6,30,9,5,0]))+'\n'
b=lambda x,r=6:x.ljust(r,' ')
j=''.join
t=lambda a:sum(map(int,a[:-1].replace(*'.0')))
P=print
def s(i=30):
 while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i
def f(n,T=0):
 n=[*map(b,n)]
 P(a+f'| Name | Runs{" "*25}| How Out |Total|')
 for x in n[:-1]:S=j(s());T+=t(S);P(a,x,b(S,30),c(choice(['Bowled','LBW','Caught']),9),c(h(t(S)),5),sep='|',end='|\n')
 S=j(s());P(a,n[-1],b(S,30),' Not Out ',c(h(t(S)),5),sep='|',end='|\n');P(a+f'|{15*" "}Total Runs{15*" "}       |{c(h(T),5)}|\n+{47*"-"}+{5*"-"}+')

Pruébalo en línea!

Bueno, han pasado más de 24 horas y esto me tomó alrededor de una hora para prepararlo, así que espero no estar FGITW'ing nadie, y no he jugado golf en Python en un tiempo, así que fue divertido (aunque esto es la segunda vez que respondí una de mis propias preguntas con una respuesta larga de Python)

Por favor, siéntase libre de publicar sugerencias de golf, Python no es mi mejor lenguaje para jugar al golf.

-68 bytes gracias a FlipTack !

-8 bytes gracias al Sr. Xcoder

+16 bytes debido a un error

caird coinheringaahing
fuente
A primera vista, puedo ver bastantes campos de golf ... 1) En una instancia, todavía lo usa en printlugar de P. 2) sumpuede tomar un mapobjeto directamente , no es necesario convertirlo en una lista. 3) En lugar de escribir yield xdos veces, ¿por qué no yield xy luego romper si es necesario? 4) T=0podría colocarse dentro del encabezado de la función. 5) En su última función, ha usado varias líneas nuevas en las que podría usar una línea con punto y coma, por ejemplo, las primeras tres declaraciones, las últimas tres declaraciones y las declaraciones en el bucle for.
FlipTack
@FlipTack Bonitos campos de golf, y gracias!
caird coinheringaahing
Puedes jugar al golf sconsiderablemente ... def s(i=30):y luego while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i. Además, solo llama o()una vez, por lo que no hay necesidad de declararlo, solo use la declaración directamente.
FlipTack
Lo mismo se aplica a b^^
FlipTack
@FlipTack Se agregaron los campos de golf. ¡Gracias!
caird coinheringaahing
0

Carbón , 277 255 bytes

≔E¹¹⟦⟦⟧⁰S⟧θ≔⮌θηW⊖Lη«≔⊟ηι≔‽12.4/6ζ⊞υζ⊞§ι⁰ζ≔⎇⁼ζ/⁺²‽³⁼³⁰L§ι⁰ζ¿ζ§≔ι¹ζ⊞ηι¿⊖Lη¿⁼¬﹪Lυ⁶¬εF⟦⊟η⊟η⟧⊞ηκ»”|⁴B\[⎇⁻℅↧T`⁵·5KMK⟲M≦»→´⁶_⭆∨R▷↥l⁹KG…≦”Fθ«◨⊟ι⁷◨Σ§ι⁰¦³²§⪪”(3⪪⪫⧴πZJL:∨XI±URD↗Σ9⟦FZ∕↖l⪪”⁷⊟ι◧IΣE⊟ιΣκ⁶⸿⸿»”|QºWPD⟧zNφ[v?Π'vG”◧IΣEυΣι²⁸J±¹±¹FE¹³⁻²⁷⊗ι«B⁵⁵ιB⁴⁹ι¿‹ι²⁷«B³⁹ιB⁸ι

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔E¹¹⟦⟦⟧⁰S⟧θ

Lea los 11 nombres (la entrada es flexible: JSON, separados por espacios o separados por nueva línea) y cree una matriz qde 11 bateadores, representados por sus bolas (como una matriz), estado (como un entero) y nombre.

≔⮌θη

Crea una copia invertida de los bateadores h. Esto representa a los bateadores que no están fuera. Los dos últimos elementos son los bateadores desactivados y los actuales.

W⊖Lη«

Repita mientras haya al menos dos bateadores disponibles.

≔⊟ηι

Extraer la masa actual a i.

≔‽12.4/6ζ

Genera una bola al azar z.

⊞υζ

Agréguelo a la lista general de bolas usando la lista vacía predefinida u.

⊞§ι⁰ζ

Agréguelo a las bolas del bateador actual.

≔⎇⁼ζ/⁺²‽³⁼³⁰L§ι⁰ζ

Si la bola es un /, entonces genera un estado aleatorio 2..4, de lo contrario, si esta es la bola número 30 del bateador, establece el estado en 1otro caso 0.

¿ζ§≔ι¹ζ⊞ηι

Si la masa está fuera, guarde el estado de la masa; de lo contrario, vuelva a ponerla en el bate.

¿⊖Lθ¿⁼¬﹪ΣEηLκ⁶¬ζ

Si quedan al menos dos bateadores, y el bateador estaba fuera xo se han jugado 6 bolas, entonces ...

F⟦⊟η⊟η⟧⊞ηκ»

... quita los bateadores y los bateadores actuales y vuelve a colocarlos en orden inverso.

”|⁴B\[⎇⁻℅↧T`⁵·5KMK⟲M≦»→´⁶_⭆∨R▷↥l⁹KG…≦”

Imprime el encabezado.

Fθ«

Pase sobre los batidos.

◨⊟ι⁷

Escriba el nombre del bateador.

◨Σ§ι⁰¦³²

Imprime las bolas de la masa.

§⪪”(3⪪⪫⧴πZJL:∨XI±URD↗Σ9⟦FZ∕↖l⪪”⁷⊟ι

Imprima el estado de la masa indexando en la cadena Not OutRetiredBowled Caught LBWdividida en subcadenas de longitud 7.

◧IΣE⊟ιΣκ⁶

Imprime la puntuación del bateador.

⸿⸿»

Ir al inicio de la siguiente línea, pero una.

”|QºWPD⟧zNφ[v?Π'vG”◧IΣEυΣι²⁸

Imprime el total.

J±¹±¹FE¹³⁻²⁷⊗ι«B⁵⁵ιB⁴⁹ι¿‹ι²⁷«B³⁹ιB⁸ι

Dibuja cajas alrededor de todo.

Neil
fuente