Introdução
Doppelkopf é um jogo de cartas tradicional alemão para 4 jogadores. O baralho é composto por 48 cartas (9, 10, Valete, Dama, Rei, Ás de cada naipe, enquanto todas as cartas estão no jogo duas vezes), para que cada jogador receba 12 no início de uma rodada.
Sempre existem duas equipes que são determinadas pela distribuição do Queens of Clubs. Os 2 jogadores que estão segurando o Queens formam um time e jogam contra os outros 2 jogadores. A equipe do Queens of Clubs é chamada de "Re", a equipe que não tem é a "Contra".
No início da rodada, ninguém sabe quem está em qual time. A distribuição da equipe será revelada no andamento da rodada, o que adiciona muita estratégia ao jogo.
O jogo consiste em 12 truques. Os jogadores que vencem um truque recebem todas as 4 cartas. Cada carta tem um certo valor (o rei conta 4, o ás conta 11, por exemplo), todas as cartas somam 240 pontos, que é o resultado mais alto possível.
No final de uma rodada, os pontos são contados e a equipe com a maior quantidade de pontos vence a rodada. Então começa a próxima rodada ...
O desafio
Cada rodada tem uma certa pontuação, que é determinada pela quantidade de pontos que a equipe vencedora obteve e possíveis anúncios. Você terá que escrever um programa que considere a distribuição de pontos e os anúncios em potencial (veja a explicação abaixo) como entrada e saída da pontuação da rodada e do vencedor.
O cálculo da pontuação
Como mencionado, há uma equipe de Re e Contra. Também há um máximo de 240 pontos possíveis em uma rodada. A Re-equipe tem 121 pontos para vencer, enquanto a Contra-equipe precisa apenas de 120. Há também a possibilidade de anunciar "Re" ou "Contra" no início da rodada, se você acha que vai ganhar o jogo. . Ao fazer isso, você está aumentando a pontuação.
Aqui estão as regras de pontuação:
- +1 para ganhar o jogo
- +1 se o time perdedor tiver menos de 90 pontos ("Keine 90")
- +1 se o time perdedor tiver menos de 60 pontos ("Keine 60")
- +1 se o time perdedor tiver menos de 30 pontos ("Keine 30")
- +1 se o time perdedor tiver 0 pontos ("Schwarz")
- +2 para um anúncio de Contra
- +2 para um anúncio de Re
- +1 se a equipe Contra vencer ("Gegen die Alten")
Nota: Re / Contra-anúncios sempre se aplicam, independentemente do vencedor. Veja exemplos nas caixas de teste abaixo.
Entrada e saída
A contribuição para o programa será a pontuação da Re-equipe e os possíveis anúncios de Re ou Contra. Como sempre existem 240 pontos no jogo, você pode facilmente calcular a pontuação do Contra-time.
A entrada será uma única sequência que terá a pontuação do Re-time primeiro, seguida pelos anúncios em potencial, enquanto "R" é para Re e "C" é para Contra. Se ambos foram anunciados, Re sempre virá em primeiro lugar.
A saída será a pontuação do jogo seguida pela equipe vencedora ("C" para Contra, "R" para Re)
Regras
- Seu envio pode ser um programa completo ou uma função. Se você escolher o último, inclua um exemplo de como invocá-lo.
- A entrada pode ser fornecida por argumentos de função ou de linha de comando ou entrada do usuário.
- A saída pode ser fornecida como valor de retorno ou impressa na tela.
- Brechas padrão se aplicam.
- O menor número de bytes vence!
Casos de teste
Input -> Output (Explanation)
145R -> 3R (Re won, +1 for winning, +2 for Re-Announcement)
120 -> 2C (Contra won, +1 for winning, +1 for winning as Contra)
80C -> 5C (Contra won, +1 for winning, +1 for no 90, +1 for winning as Contra, +2 for Contra-Announcement)
240R -> 7R (Re won, +1 for winning, +1 for no 90, +1 for no 60, +1 for no 30, +1 for no points for the losing team, +2 for Re-announcedment)
90 -> 2C (Contra won, +1 for winning, +1 for winning as Contra)
110RC -> 6C (Contra won, +1 for winning, +1 for winning as Contra, +2 for Re-Announcement, +2 for Contra-Announcement)
110R -> 4C (Contra won, +1 for winning, +1 for winnins as Contra, +2 for Re-Announcement)
184C -> 5R (Re won, +1 for winning, +1 for no 90, +1 for no 60, +2 for Contra-Announcement)
Nota curta: deixei de fora algumas regras (como solos e pontos de bônus) de propósito para manter o desafio simples. Então, se você já está familiarizado com o jogo, não fique confuso :)
Feliz codificação!
fonte
Labirinto ,
1361039492878476746961 bytesExperimente online!
Ahh, já faz muito tempo desde que eu usei o Labyrinth. É sempre uma alegria jogar golfe. :)
Explicação
Isso está um pouco desatualizado agora. A estrutura geral do programa ainda é a mesma, mas alguns detalhes foram alterados. Vou atualizar isso mais tarde. Esta é a solução anterior, para referência:
Vamos detalhar um pouco a pontuação:
M
, então haverá2M+1
pontos na pontuação final, para ganhar, Re e Contra.1
.-∞
).É assim que o código funciona. O Sp3000 postou uma boa cartilha para o Labyrinth hoje, então decidi roubá-lo. :)
Portanto, a execução começa na
(
primeira linha, com o ponteiro de instrução (IP) indo para a direita.(
apenas transforma o topo da pilha principal-1
e a}
desloca para a pilha auxiliar, onde podemos esquecê-la. O programa realmente começa com o?
que lê o número inteiro de STDIN. O IP atinge um beco sem saída e se vira.}
muda a entrada para a pilha auxiliar e(
diminui outro zero para-1
. Essa será a pontuação final. Agora entramos em um loop muito apertado no sentido horário:Os
))
incrementos o placar por dois (por isso a primeira vez que vamos através do laço, a pontuação torna-se1
, a pontuação para ganhar). Então,
lê um personagem. Desde que não seja EOF, o loop continua.;
devoluções do personagem, porque não importava se eraR
ouC
e))
adiciona dois para a pontuação novamente. Isso repetirá 0, 1 ou 2 vezes, dependendo da entrada.Deixamos o loop, quando atingimos o EOF, o topo da pilha será
-1
. Em seguida, executamos esta parte linear:A
`
negação é unária, então conseguimos1
, depois a20
transforma em a120
.{:}
obtém uma cópia do número inteiro de entrada da pilha auxiliar e-
calcula a diferença com120
. Podemos usar o sinal desse resultado para determinar quem ganhou.Se o resultado for negativo, Re venceu e seguimos o caminho norte, executando:
;
descarta esse resultado,}
muda a pontuação,82
coloca-se (código de caractere deR
) na parte inferior da pilha principal,{
coloca a pontuação no topo,_240{-
subtrai a entrada inteira de 240 para que possamos trabalhar com os pontos de Contra (do lado perdedor).O
#;
é apenas para garantir que tenhamos um valor diferente de zero na pilha, para que possamos unir os dois caminhos de maneira confiável.Se o resultado for positivo, Contra venceu e seguimos o caminho sul, executando:
O
#
empurra a profundidade da pilha que é1
. Este fica subtraído do placar antes de adicionar2
com))
.67
se coloca (código de caractere deC
) na parte inferior da pilha principal.{{
retorna os outros valores.Se o resultado for zero, o Contra ainda venceu. No entanto, esse é o caso 120/120, para o qual precisamos adicionar um ponto extra à pontuação final (veja acima). É por isso que esse caminho não pressiona 1
#
, mas apenas deixa o zero, de modo que-
simplesmente remove esse zero da pilha.As pilhas agora estão reunidas novamente e contabilizamos tudo, exceto a parte em que dividimos por 30. Mas, primeiro, precisamos transformar uma pontuação zero em -1. É isso que esse pequeno desvio faz:
O
`
não afeta um zero,"
é um no-op e~
é uma negação bit a bit. O NOT de bit a bit0
é-1
conforme necessário. Se a pontuação foi positiva,`
torna-a negativa,(
diminui-a1
e~
desfaz as duas operações de uma só vez.A profundidade da pilha agora é 3 (o personagem do lado vencedor, a pontuação total até agora e os pontos do lado perdedor), então
#
empurra3
.0
transforma em um30
,/
faz a divisão.#
empurra outro3
que é subtraído e esse resultado é subtraído da pontuação final.!
imprime como um número inteiro,.
imprime o lado vencedor como um caractere e@
finaliza o programa.fonte
JavaScript (ES6), 106
Cerca de 100 bytes com uma linguagem que não seja de golfe.
Teste
fonte
ES6, 92 bytes
p.length*2
superestima a pontuação em 1 se Re vencer, então eu tenho que subtrairr
novamente.!(n%120)+3-((r?240-n:n)/30|0)
foi o que descobri para encapsular as regras para a pontuação de "Keine"; Eu gostaria que as fronteiras fossem 31, 61 e 91, pois isso teria feito a fórmula4-((r?269-n:29+n)/30|0)
.fonte