Eu gosto de desafios de jogos de cartas, então fiz este para o jogo de cartas italiano Scopa. Minha família joga esse jogo desde tempos imemoriais. Tem um sistema de pontuação muito interessante que deve ser divertido para o golfe. Vou postar uma resposta em R para começar a diversão, que tenho certeza de que as pessoas vão melhorar.
O desafio: descobrir o número de pontos marcados em uma rodada de Scopa, considerando as cartas que o jogador capturou durante a rodada como entrada.
Existem 40 cartas no baralho Scopa. Se você estiver usando um baralho internacional, remova os 8s, 9s e 10s, deixando A, 2,3,4,5,6,7, Q, J, K em cada naipe. 1 Existem dois jogadores ou parcerias e, após cada rodada, todas as cartas acabam sendo capturadas por um ou outro dos dois jogadores. A pontuação é contada da seguinte forma (mais informações aqui ):
- O jogador com mais cartas ganha 1 ponto.
- O jogador com mais diamantes (ou moedas, se estiver usando o baralho italiano) recebe 1 ponto.
- O jogador com o 7 de diamantes (ou moedas), conhecido como sette bello ou belo sete, marca 1 ponto.
- O jogador com a primiera mais alta marca 1 ponto. A pontuação inicial de um jogador é a soma das pontuações da carta de maior valor que o jogador capturou em cada naipe (veja a tabela abaixo). Se você não tiver pelo menos uma carta em cada naipe, você perde por padrão, mesmo que sua pontuação exceda a pontuação do seu oponente. No caso extremamente raro de nenhum dos dois jogadores ter pelo menos uma carta em cada naipe, o jogador com a pontuação mais alta total pontua o ponto. 2
Tabela de pontuações primiera
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Assim, um jogador pode marcar no máximo 4 pontos em uma rodada. 3 Se houver um empate, possível para cartas, diamantes ou primiera , ninguém marca o ponto.
É importante perceber que, como cada carta deve ser capturada por um dos dois jogadores, é possível inferir quais cartas o outro jogador deve ter pegado, mesmo se você souber apenas quais cartas um jogador pegou. Você precisará fazer isso para marcar corretamente a primiera .
Regras do desafio
Entrada
Seu código deve ter como entrada as cartas capturadas por um único jogador durante uma rodada de Scopa.
A entrada deve estar no formato de sequência, em que um caractere representa a classificação de cada cartão e um caractere seu naipe. Isso remove a brecha potencial de passar aspontuaçõesdo primiera diretamente como entrada. A conversão de classificações de cartões em pontuações primárias deve ser feita no programa. No entanto, você pode optar por usar uma única cadeia de caracteres separada por espaços ou vírgulas, uma matriz de cadeias de caracteres ou qualquer outro formato. Por exemplo, se você optar por codificar classificações como76A5432QJK
e naipes,DCHS
poderá usar entradas como['7D', '6H', 'QD', 'JS']
ou'7D,6H,QD,JS'
.
Resultado
Um número inteiro de 0 a 4 representando a pontuação do jogador.
Ganhando
Menor resposta em bytes ganha!
Casos de teste
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Pontuação 4 : 1 ponto para> 20 cartas, 1 ponto para> 5 diamantes, 1 ponto para o 7 de diamantes e 1 ponto para marcar 78 na primiera (7,7,7,5 onde o oponente tem 7,6,5, K para 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Pontuações 0 : <= 20 cartas, <= 5 diamantes, nº 7 de diamantes e apenas 69 pontos em primiera (7,7,4,3 onde o oponente tem 7,7,6, K por 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Pontuações 3 : 1 ponto para> 20 cartas, 1 ponto para> 5 diamantes, 1 ponto para 7 de diamantes. A primiera seria 63 (7,7,7) e o oponente só pode marcar 51 (7, Q, Q, Q), mas como essa mão não tem espadas, perde o ponto por padrão.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Pontuações 3 : <= 20 cartões, 1 ponto para> 5 diamantes, 1 ponto para 7 de diamantes. A primiera marca apenas 51 (7, Q, Q, Q) e o oponente pode marcar 63 (7,7,7), mas como a mão do oponente não tem diamantes, esta mão ganha o ponto de primiera por padrão.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Pontuações 3 : <= 20 cartões, 1 ponto para> 5 diamantes, 1 ponto para 7 de diamantes. Mesmo que essa mão não tenha espadas, ela ainda vence primiera com uma pontuação de 63 a 57 (7,7,7 contra 7,6,6) porque a mão do oponente não tem diamantes.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Pontuações 2 : <= 20 cartões, 1 ponto para> 5 diamantes, 1 ponto para 7 de diamantes. Esta mão não tem espadas e a mão do oponente não tem diamantes. O oponente vence a primiera com uma pontuação de 63 a 41 (7,7,7 contra 7, Q, Q).
[]
(matriz vazia)
Pontuações 0
1: Pelo menos em nossa família, Jack supera o Queen em Scopa, mas isso é irrelevante para fins de pontuação.
2: Eu jogo esse jogo desde a infância e nunca vi isso acontecer, mas é melhor o seu código lidar com esse caso!
3: Existem pontos de bônus por "varreduras" marcadas durante a rodada que eu estou ignorando para o objetivo deste desafio.
fonte
Respostas:
Ruby,
156153 bytesExperimente online!
Isso costuma
;865432000
representar76A5432QJK
respectivamente, e os naipes estão em minúsculas. (A escolha dos caracteres ocorre porque a subtração de 38 de cada um dá o seu valor primiera, mas nunca o fazemos porque apenas a diferença relativa é importante.)Não verificamos se um dos jogadores está com falta de um naipe porque é desnecessário - como todas as cartas são contadas como 38 mais o seu valor real, se alguém está com falta de um naipe, a pontuação mais alta que eles podem obter é (21 + 38) * 3 = 177, que é menor que (10 + 38) * 3 + 21 + 38 = 203, a pontuação mais baixa que o outro jogador pode obter. Não podemos fazer com que os dois jogadores não tenham um número diferente de zero de naipes, porque um jogador só pode ter 0, 1 ou 2 naipes, e se alguém estiver faltando 2 naipes, terá todas as cartas dos outros 2 naipes.
fonte
R,
320298265238229224211209179 bytesEsta é uma solução principalmente devido a @digEmAll, na forma de uma função.
Experimente online!
Abaixo está a melhor das minhas antigas tentativas medíocres de 209 bytes.
edit: reduziu o apelido de algumas funções e depois tomou a idéia de Maçaneta de adicionar uma constante à pontuação, em vez de verificar os naipes.
próxima edição: se livrou de alguma redundância e depois incorporou algumas melhorias do Giuseppe
próxima edição: -2 bytes graças a digEmAll
Sou péssimo nisso, por isso tenho certeza de que alguém pode melhorar isso se quiser tomar um tempo. Sinto-me como
sapply
efunction
sou super longa e poderia me livrar deles, mas não consigo descobrir como. As entradas são cadeias de dois caracteres na notação padrão.fonte
JavaScript (ES6),
171163 bytesRecebe a entrada como um conjunto de cartões, usando sua representação padrão.
Experimente online!
Comentado
fonte
05AB1E , 41 bytes
Experimente online ou verifique todos os casos de teste .
Os naipes
DCHS
são representados respectivamente por0123
. As classificações7A65432KJQ
são representadas respectivamente por0123456789
. Esses são tomados como cadeias, não números inteiros, conforme exigido pelo desafio (mas 05AB1E os converte em números inteiros quando necessário, de qualquer maneira).Como em outras soluções, adicionamos uma constante grande (14) a cada pontuação de primiera para tornar desnecessária a verificação de fatos perdidos.
fonte
MS SQL Server 2017 , 525 bytes
Experimente no db <> fiddle .
fonte
Retina 0.8.2 , 334 bytes
Experimente online! O link inclui casos de teste. Explicação:
Crie uma lista de todos os 40 cartões.
Retire as cartas que o jogador segura.
Substitua cada classificação por sua ordem de classificação, que é 9 para
7
e 10 menor que seu valor para outras cartas.Classifique as cartas por naipe e classificação.
Conte o número de cartas em cada naipe e também capture a carta mais alta de cada naipe, capturando o diamante mais alto duas vezes.
Verifique se o diamante mais alto foi o 7.
Exclua todas as cartas mais altas se um dos naipes não tiver cartas.
Converta as cartas mais altas em pontos unários e some-as. Também converta o número total de cartas e comprimentos de naipes para unário.
Marque pontos se o total, diamantes ou primiera, for maior.
Total da pontuação.
fonte
C # (compilador interativo do Visual C #) , 193 bytes
Experimente online!
fonte
AWK , 235 bytes
Experimente online!
Serve para mapear 1234 (4 são diamantes), valores mapear para 0123456789. Este programa transforma os casos de teste no formato aceito:
Meu objetivo era apenas vencer a principal implementação do Python: D
fonte
Python 3 ,
249 245 239238 bytes-4 bytes graças a @ovs
-6 bytes graças a @movatica
Experimente online!
fonte
int('0734569c00'[int(x[0])],13)
eif x[1]<'E'
pode ser gravado comoif'E'>x[1]
all(s in''.join(C)for s in S)
pode ser reduzidonot S.strip(''.join(C))
, economizando 6 bytes