Faites une partie de Dice Cricket


12

Dice Cricket est un jeu auquel j'ai été initié enfant et que j'ai utilisé pour passer du temps depuis des années. Je n'ai pas trouvé de page Wikipédia, je vais donc expliquer les règles ci-dessous.

Dice Cricket Rules

Prémisse

Dice Cricket est un jeu similaire à marquer un jeu de cricket pendant que vous le regardez, mais plutôt que de regarder et d'enregistrer le résultat, vous lancez un dé et enregistrez le résultat.

Les résultats sont enregistrés dans un tableau comme indiqué en bas.

Afficher

Dice Cricket utilise un écran spécifique pour afficher toutes les informations qui se produisent.

Le tableau comporte 11 lignes. Chaque rangée représente un frappeur. La disposition de la ligne est expliquée ci-dessous.

+------+------------------------------+---------+-----+
| Name |    Runs                      | How Out |Score|
+------+------------------------------+---------+-----+
  • Nom: Le nom doit être une chaîne entièrement composée de lettres, majuscules ou minuscules
  • Pistes: Un frappeur peut faire face à 30 balles. Chaque balle peut être l'une des 1 2 4 6 . /. Ceci sera expliqué plus en détail ci-dessous
  • Comment sortir: La façon dont le frappeur était sorti. Peut être n'importe lequelBowled, LBW (Leg Before Wicket), Caught, Retired or Not Out
  • Score: la somme de tous les nombres Runs

Comment fonctionne le jeu

Dans un jeu, il y a toujours 2 frappeurs sur le terrain. Le premier joueur est par défaut le batteur actuel et le second dans le batteur "off".

Un jeu est composé de "balles": chaque balle d'un match de cricket est représentée par un lancer de dés. Chaque rouleau fait une commande différente:

  • 1,2,4 et 6 font que le frappeur marque autant. Si 1 est lancé, le batteur actuel devient le batteur "off" et le batteur "off" devient le batteur actuel
  • 3 est une "boule de points", ce qui signifie que rien ne se passe. Il est représenté dans la Runssection sous la forme a .et obtient 0. A 0ne peut pas être utilisé pour le représenter.
  • 5 est un guichet. Si 5 est lancé, le frappeur actuel est "retiré". Cela signifie qu'un a /est ajouté aux points et à partir de ce moment, le frappeur ne peut plus marquer de points. Le frappeur est ensuite échangé avec le frappeur suivant qui n'a pas frappé. La How Outsection est un choix aléatoire des moyens possibles de sortir:Bowled, LBW, Caught

Exemple pour un guichet (c'est juste pour plus de clarté, ce n'est pas comme ça que ça sort)

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

Toutes les 6 balles, les deux frappeurs changent; le frappeur actuel devient le frappeur «off» et le frappeur «off» devient le frappeur actuel

Si la Runssection est remplie (30 balles), le frappeur est retiré et la How Outsection est réglée sur Retired. Un / n'est pas placé à la fin de la Runsboîte.

Défi réel (oui, c'était toutes les règles du jeu)

Votre défi est de produire un tableau complet (comme l'exemple à la fin), avec une liste de noms. Le contenu de la sortie ne doit contenir que la table et / ou les espaces de début ou de fin.

Règles

  • Les failles standard sont interdites
  • Les 11 joueurs devraient avoir quelque chose dans la Runssection.
  • Un seul joueur peut l'être Not Out. Tout autre joueur non retraité ne devrait pas avoir le choix[Bowled, LBW, Caught]
  • Les noms peuvent avoir une longueur comprise entre 1 et 6 qui correspond à l'expression régulière A-Za-z
  • La dernière ligne du tableau doit être la ligne totale (voir l'exemple)
  • Il n'est pas nécessaire d'aligner le texte du tableau de quelque manière que ce soit, mais les séparateurs de lignes et de colonnes doivent être alignés.

Exemple

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 |
+-----------------------------------------------+-----+


Heh, je jouais une variante similaire de ce qu'on appelle "Hand cricket".
totalement humain

Qu'est-ce qui détermine la fin du jeu? Est-ce quand un frappeur est retiré et qu'il n'y a plus personne pour le remplacer?
KSmarts

@KSmarts Correct.
caird coinheringaahing

1
@JonathanAllan Oui, ce n'est pas une bonne exigence. Supprimé
caird coinheringaahing

Réponses:


2

Python 3 , 650 621 582 572 588 octets

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*"-"}+')

Essayez-le en ligne!

Eh bien, cela fait plus de 24 heures et cela m'a pris environ une heure pour préparer, donc j'espère que je ne FGITW'ing personne, et je n'ai pas joué au golf en Python depuis un moment, donc c'était amusant (bien que ce soit la deuxième fois que j'ai répondu à une de mes propres questions avec une longue réponse Python)

N'hésitez pas à publier des suggestions de golf, Python n'est pas ma meilleure langue pour jouer au golf.

-68 octets grâce à FlipTack !

-8 octets grâce à M. Xcoder

+16 octets en raison d'un bug


À première vue, je peux voir pas mal de golfs ... 1) Dans un cas, vous utilisez toujours printau lieu de P. 2) sumpeut directement prendre un mapobjet, pas besoin de le convertir en liste. 3) Plutôt que d'écrire yield xdeux fois, pourquoi pas yield xet ensuite casser si nécessaire? 4) T=0pourrait être placé à l'intérieur de l'en-tête de fonction. 5) Dans votre dernière fonction, vous avez utilisé plusieurs sauts de ligne où vous pouvez simplement utiliser une ligne avec des points-virgules, par exemple les trois premières instructions, les trois dernières instructions et les instructions de la boucle for.
FlipTack

@FlipTack De beaux golfs et merci!
caird coinheringaahing

Vous pouvez jouer au golf sconsidérablement ... def s(i=30):et ensuite while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i. De plus, vous n'appelez o()qu'une seule fois, il n'est donc même pas nécessaire de le déclarer, utilisez simplement l'instruction directement.
FlipTack

La même chose s'applique à b^^
FlipTack

@FlipTack Ajout des golfs. Merci!
caird coinheringaahing

0

Charbon de bois , 277 255 octets

≔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⁸ι

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

≔E¹¹⟦⟦⟧⁰S⟧θ

Lisez les 11 noms (l'entrée est flexible: JSON, séparés par des espaces ou séparés par une nouvelle ligne) et créez un tableau qde 11 frappeurs, représentés par leurs boules (sous forme de tableau), leur statut (sous forme d'entier) et leur nom.

≔⮌θη

Créez une copie inversée des frappeurs h. Cela représente les frappeurs qui ne sont pas sortis. Les deux derniers éléments sont les frappeurs off et actuels.

W⊖Lη«

Répétez pendant qu'il y a au moins deux frappeurs disponibles.

≔⊟ηι

Extraire la pâte actuelle à i.

≔‽12.4/6ζ

Générez une balle au hasard z.

⊞υζ

Ajoutez-le à la liste globale des balles en utilisant la liste vide prédéfinie u.

⊞§ι⁰ζ

Ajoutez-le aux balles du frappeur actuel.

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

Si la balle est un /, alors générez un statut aléatoire 2..4, sinon s'il s'agit de la 30ème balle du frappeur, définissez le statut 1autrement 0.

¿ζ§≔ι¹ζ⊞ηι

Si le frappeur est retiré, enregistrez son statut, sinon remettez-le au bâton.

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

S'il reste au moins deux frappeurs et que le frappeur était absent xou 6 balles ont été jouées, alors ...

F⟦⊟η⊟η⟧⊞ηκ»

... enlevez les frappeurs off et actuels et les remettre dans l'ordre inverse.

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

Imprimez l'en-tête.

Fθ«

Faites une boucle sur les frappeurs.

◨⊟ι⁷

Imprimez le nom du frappeur.

◨Σ§ι⁰¦³²

Imprimez les boules du frappeur.

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

Imprimez le statut du frappeur en l'indexant dans la chaîne Not OutRetiredBowled Caught LBWdivisée en sous-chaînes de longueur 7.

◧IΣE⊟ιΣκ⁶

Imprimez le score du frappeur.

⸿⸿»

Passez au début de la ligne suivante, sauf une.

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

Imprimez le total.

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

Dessinez des boîtes autour de tout.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.