Sua tarefa é escrever um pequeno programa, que conte os pontos de uma mão Skat. Um baralho Skat tem cartas de 7 a 10, valete, rainha, rei e ás (chamados Unter, Ober, König e Daus). Usamos os fatos alemães, que têm bolotas, folhas, copas e sinos em vez de paus, espadas, copas e diamantes. Os pontos são determinados pelo número no cartão:
- 7, 8 e 9 são 0 pontos
- Unter é de 2 pontos
- Ober é de 3 pontos
- König é de 4 pontos
- 10 é 10 pontos
- Daus é de 11 pontos.
Entrada / Saída
O formato de entrada consiste em dois símbolos, o primeiro representa o valor, enquanto o segundo representa o naipe:
- 7, 8 e 9 representam a si mesmos
- 0 (zero) significa 10
- Unter, Ober, König e Daus são nomeados após suas primeiras letras (U, O e D)
- O mesmo para bolotas, folhas, corações e Bellys (A, L, H e B)
A entrada é uma única linha de cartões, separada por um único espaço em branco. Você pode pegar a entrada de qualquer lugar, os argumentos da linha de comando também são bons. A saída é o valor da mão, impressa ou retornada como um código de saída. A saída do seu programa deve mostrar um erro, se algum cartão aparecer duas vezes na mão. (Portanto, 7A 0L 7A
deve retornar um erro em vez de 10
). Também é bom encerrar com um código de saída 255 em vez de mostrar um erro, se esta for a maneira padrão do seu programa para gerar o resultado.
Exemplos
7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
dá 1207A 8L 0K DB 8L
dá um erroUA OB DL KH
dá 20
Regras
- Código de golfe: o código mais curto vence
- Aplicam-se regras usuais de golfe com código
- O programa tem que trabalhar para todas as mãos, não apenas os exemplos
- GIGO: Se a entrada for inválida, a saída pode ser arbitrária
fonte
Respostas:
APL (
5448)Não tem de ser um caminho mais curto de selecionar o valor do cartão, mas eu não vejo isso.
Você recebe um
DOMAIN ERROR
se houver um cartão duplicado.Explicação:
A←⍞~' '
: armazena (←
) emA
uma linha de entrada do usuário (⍞
) sem (~
) os espaços.2,⍨2÷⍨⍴A
: uma lista de dois elementos, contendo o comprimento de (⍴
)A
dividido por (÷⍨
) 2, seguido por (,⍨
) o número 2. (Portanto, se a entrada forUA OB DL KH
a lista, será (4, 2)).↓A⍴⍨
: defina uma matriz (⍴
), com as dimensões dessa lista, contendo os valores de A. Em seguida, junte os elementos de suas linhas (↓
), fornecendo uma lista de listas, por exemplo['UA','OB','DL','KH']
.A←
: Armazene esta lista em A.A≡∪A
:∪A
é a lista de elementos exclusivos em A. Se isso é igual a A, não há duplicatas e isso retorna 1, caso contrário, 0.÷
: divida o que está à esquerda (que faz o cálculo real) pelo resultado do teste de igualdade. Portanto, se não houver duplicatas, a pontuação permanecerá inalterada e, se houver duplicatas, você receberá umDOMAIN ERROR
por causa da divisão por zero.⊃¨A
: Uma lista que fornece o primeiro elemento (⊃
) de cada elemento (¨
) de A. Portanto, isso solta a letra da naipe, deixando a letra da pontuação. (UODK
)'D0.....KOU.'⍳
: fornece o índice de cada uma das letras de pontuação nessa sequência, retorna 12 para valores que não estão na sequência. (10 9 1 8
)+/12-
: subtraia todos esses 12 e adicione-os juntos. (2 + 3 + 11 + 4 = 20
)fonte
Ruby 1.9, 52 caracteres
Entrada via argumentos da linha de comando. Estou assumindo que a mensagem de erro ao ter cartões duplicados não importa, então ela apenas reclama de um erro de conversão de avaliação / tipo.
Exemplo de uso:
fonte
Scala,
8782 caracteresLança uma exceção em cartões repetidos.
fonte
Haskell,
122108107 caracteresfonte
error""
é mais curto queundefined
. Salve um caractere usandointeract
.interact
lo não imprimirá uma nova linha, por isso não tenho certeza se isso é aceitável. No entanto, pude economizar muito mais usando um padrão incompleto em vez deundefined
.GolfScript
545352Editar 1:
Acabei de descobrir um erro no código. Ele não detectou cartões duplicados se os duplicados foram os dois primeiros na entrada (porque eu estava usando o
*
operador fold e não o/
operador de cada um para o primeiro loop).Agora eu corrigi o código e também consegui retirar 1 caractere no processo. Aqui está a nova versão:
A entrada deve estar na pilha como uma sequência, no formato especificado (exemplo
'7A UA DA'
:).Caso a entrada seja válida, o programa imprime o valor total dos cartões.
Caso haja pelo menos um cartão duplicado, o programa lança a seguinte exceção:
Edição 2:
Depois de ver esta postagem no meta site , decidi postar uma descrição do código. Isso também me ajudou a encontrar e corrigir um erro. Então, aqui vai:
fonte
Python, 114 caracteres
Infelizmente, o
index
método das listas no Python gera um erro se um elemento não for encontrado, em vez de retornar um valor negativo, e a importaçãodefaultdict
exigiria mais caracteres do que ele salvaria.fonte
eTeX, 201 caracteres (sem contar as duas quebras de linha irrelevantes)
Usado como
etex filename.tex [UA OB DL KH]
. É necessário colocar o argumento entre colchetes: caso contrário, o eTeX não tem como determinar se chegamos ao final da lista de argumentos.EDIT: conforme permitido na declaração da pergunta, entrada incorreta pode causar (um) erro. Por exemplo,
etex filename.tex [OK]
trava horrivelmente (porqueK
não é uma cor válida).fonte
etex -v
? Qual é a mensagem de erro (aproximadamente)? O código deve ser colocado em um arquivo (com nomefilename.tex
ou qualquer outra coisa terminada em.tex
) e usar esse nome na linha de comandoetex filename.tex [<argument>]
. (sorry para repassar o mesmo comentário, eu esqueci "@FUZxxl
")K
não é uma cor válida e a substituição porX
seus exemplos remove os erros (ela travaK
porque a letra tem outro significado, King). Eu poderia tornar o erro menos horrível adicionando\string
antes de cada um##1
, mas isso custaria mais 12 caracteres.PowerShell, 79
80Joga »Tentativa de dividir por zero.« Se as cartas aparecerem duas vezes.
fonte