Jogue um jogo de críquete de dados

12

Dice Cricket é um jogo que eu fui apresentado quando criança e que tenho usado como uma maneira de passar o tempo há anos. Não encontrei uma página da Wikipedia, por isso vou explicar as regras abaixo.

Regras de Críquete de Dados

Premissa

Dice Cricket é um jogo semelhante a marcar um jogo de críquete enquanto você o assiste, mas, em vez de assistir e gravar o resultado, você está rolando um dado e gravando o resultado.

Os resultados são registrados em uma tabela, conforme exibido na parte inferior.

Exibição

O Dice Cricket usa uma exibição específica para mostrar todas as informações que estão acontecendo.

A tabela possui 11 linhas. Cada linha representa uma massa. O layout da linha é explicado abaixo.

+------+------------------------------+---------+-----+
| Name |    Runs                      | How Out |Score|
+------+------------------------------+---------+-----+
  • Nome: o nome deve ser uma string composta inteiramente de letras maiúsculas ou minúsculas
  • Corre: Um batedor pode enfrentar 30 bolas. Cada bola pode ser uma das 1 2 4 6 . /. Isso será explicado em mais detalhes abaixo
  • How Out: A maneira como a massa estava fora. Pode ser qualquer umBowled, LBW (Leg Before Wicket), Caught, Retired or Not Out
  • Pontuação: a soma de todos os números em Runs

Como o jogo funciona

Em um jogo, sempre existem 2 batedores em campo. O primeiro jogador é, por padrão, a massa atual e o segundo na massa "desligada".

Um jogo é composto de "bolas": cada bola em uma partida de críquete é representada por uma jogada de dados. Cada rolo executa um comando diferente:

  • 1,2,4 e 6 fazem o batedor marcar tanto. Se 1 for rolado, a massa atual se torna a massa "off" e a massa "off" se torna a massa atual
  • 3 é uma "bola pontilhada", significando que nada acontece. Ele é representado na Runsseção como a .e pontua 0. A 0não pode ser usado para representá-lo.
  • 5 é um postigo. Se 5 for rolado, a massa atual estará "fora". Isso significa que a /é adicionada às jogadas e, a partir de então, a massa não poderá marcar mais jogadas. A massa é então trocada pela próxima que não tiver batido. A How Outseção é uma escolha aleatória das possíveis maneiras de sair:Bowled, LBW, Caught

Exemplo para um postigo (isto é apenas para maior clareza, não é assim que é produzido)

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

A cada 6 bolas, os dois batedores trocam; a massa atual se torna a massa "off" e a massa "off" se torna a massa atual

Se a Runsseção estiver cheia (30 bolas), a massa está fora e a How Outseção está em Retired. A / não é colocado no final da Runscaixa.

Desafio atual (sim, tudo isso eram regras do jogo)

Seu desafio é gerar uma tabela completa (como o exemplo no final), com uma lista de nomes. O conteúdo da saída deve conter apenas a tabela e / ou espaços em branco à esquerda ou à direita.

Regras

  • As brechas padrão não são permitidas
  • Todos os 11 jogadores devem ter algo na Runsseção.
  • Apenas um jogador pode ser Not Out. Todos os outros jogadores não aposentados devem ter uma escolha entre[Bowled, LBW, Caught]
  • Os nomes podem ter qualquer tamanho entre 1 e 6 que corresponda à regex A-Za-z
  • A linha final na tabela deve ser a linha total (veja o exemplo)
  • Você não precisa alinhar o texto da tabela de forma alguma, mas os separadores de linha e coluna devem estar alinhados.

Exemplo

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
fonte
Sandbox
caird coinheringaahing
Heh, eu costumava jogar uma variante semelhante disso chamada "Hand Cricket".
totallyhuman
O que determina quando o jogo termina? É quando a massa acaba e não resta mais ninguém para substituí-lo?
KSmarts
@KSmarts Correct.
caird coinheringaahing
1
@ JonathanAllan Sim, não é um bom requisito. Removido
caird coinheringaahing

Respostas:

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

Experimente online!

Bem, já se passaram mais de 24 horas e levei cerca de uma hora para preparar, então espero não estar fazendo o FGITW com ninguém, e não jogo golfe em Python há algum tempo, então isso foi divertido (embora isso seja na segunda vez que respondi uma de minhas próprias perguntas com uma longa resposta em Python)

Por favor, sinta-se livre para postar sugestões de golfe, Python não é meu melhor idioma para jogar golfe.

-68 bytes graças ao FlipTack !

-8 bytes graças ao Sr. Xcoder

+16 bytes devido a um erro

caird coinheringaahing
fonte
À primeira vista, posso ver alguns campos de golfe ... 1) Em um exemplo, você ainda usa em printvez de P. 2) sumpode pegar diretamente um mapobjeto, não há necessidade de convertê-lo em uma lista. 3) Em vez de escrever yield xduas vezes, por que não yield xe, em seguida, quebre se necessário? 4) T=0pode ser colocado dentro do cabeçalho da função. 5) Na sua última função, você utilizou várias novas linhas nas quais era possível usar apenas uma linha com ponto-e-vírgula, por exemplo, as três primeiras instruções, as últimas três e as instruções no loop for.
FlipTack
Golf @FlipTack Nice, e obrigado!
caird coinheringaahing
Você pode jogar golfe sconsideravelmente ... def s(i=30):e então while i:x=choice('12.4/6');yield x;i=('/'!=x)*~-i. Além disso, você liga apenas o()uma vez; portanto, não há necessidade de declarar, basta usar a instrução diretamente.
FlipTack
O mesmo se aplica a b^^
FlipTack
@FlipTack Adicionado os tacos. Obrigado!
caird coinheringaahing
0

Carvão , 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⁸ι

Experimente online! Link é a versão detalhada do código. Explicação:

≔E¹¹⟦⟦⟧⁰S⟧θ

Leia os 11 nomes (a entrada é flexível: JSON, espaço separado ou nova linha) e crie uma matriz qde 11 batedores, representada por suas bolas (como matriz), status (como número inteiro) e nome.

≔⮌θη

Crie uma cópia invertida dos batedores h. Isso representa os batedores que não estão fora. Os dois últimos elementos são os batedores off e current.

W⊖Lη«

Repita enquanto houver pelo menos dois batedores disponíveis.

≔⊟ηι

Extraia a massa atual para i.

≔‽12.4/6ζ

Gere uma bola aleatória z.

⊞υζ

Adicione-o à lista geral de bolas usando a lista vazia predefinida u.

⊞§ι⁰ζ

Adicione-o às bolas do batedor atual.

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

Se a bola for a /, gere um status aleatório 2..4; caso contrário, essa seja a 30ª bola do batedor, defina o status para o 1contrário 0.

¿ζ§≔ι¹ζ⊞ηι

Se a massa estiver vazia, armazene o status da massa, caso contrário, coloque-a novamente na massa.

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

Se houver pelo menos dois batedores restantes e o batedor estiver fora xor 6 bolas foram jogadas, então ...

F⟦⊟η⊟η⟧⊞ηκ»

... retire as batedeiras da corrente e coloque-as de volta na ordem inversa.

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

Imprima o cabeçalho.

Fθ«

Laço sobre as massas.

◨⊟ι⁷

Imprima o nome da massa.

◨Σ§ι⁰¦³²

Imprima as bolas da massa.

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

Imprima o status da massa indexando a sequência Not OutRetiredBowled Caught LBWdividida em substrings de comprimento 7.

◧IΣE⊟ιΣκ⁶

Imprima a pontuação da massa.

⸿⸿»

Vá para o início da próxima linha, exceto uma.

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

Imprima o total.

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

Desenhe caixas em torno de tudo.

Neil
fonte