Sua tarefa é determinar se uma determinada sequência tem o tamanho adequado e pode ser representada com blocos Scrabble e, se houver, gerar a soma da pontuação de cada letra.
Se você não sabe jogar Scrabble:, você tem 100 peças com várias letras de A a Z impressas, além de dois curingas que podem representar qualquer letra. Cada letra tem um certo número de pontos e cada bloco (mas não necessariamente a palavra) pode ser usado apenas uma vez. Quando uma palavra é reproduzida, o valor do ponto de cada peça usada é somado, o que se torna a pontuação. Como há um número limitado de letras disponíveis, uma palavra só pode ter uma determinada letra quantas vezes essa letra tiver ladrilhos + quaisquer curingas não utilizados. O quadro Scrabble tem 15 × 15 células, portanto a palavra deve ter entre 2 e 15 caracteres.
Para obter uma lista da quantidade e pontuação de cada letra na versão em inglês, veja abaixo ou http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( arquivo morto ).
Pontos de quantidade de letra Pontos de quantidade de letra ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [selvagem] 2 0 N 6 1
Regras adicionais
- O programa deve receber uma única sequência de entradas do STDIN ou similar.
- A entrada sempre conterá apenas letras maiúsculas.
- Se a string contiver mais cópias de uma letra do que caracteres curinga ou blocos não utilizados para essa letra OU o comprimento da string não estiver entre 2 e 15, inclusive, o programa deverá ser exibido
Invalid
. - Caso contrário, a pontuação deve ser somada com o uso dos dados do gráfico acima e da saída.
- Não use curingas, a menos que seja necessário.
- Não se preocupe com bônus como pontuação de palavras duplas ou se a string é uma palavra real.
- O programa deve produzir o resultado através de STDOUT ou similar.
- As brechas proibidas por padrão não são permitidas.
- Não é permitido o uso de uma fonte externa, como um site, bem como de bibliotecas, APIs, funções ou similares que calculem pontuações do Scrabble ou quantidades adequadas.
- Isso é código-golfe , e o menor número de bytes vence.
Passo a passo
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Casos de teste
Saída de entrada ------------------------ SCRABBLE 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Inválido KIXOKEJAJAX inválido MISUNDERSTANDING Inválido
fonte
-1
?Invalid
.Respostas:
Perl 5
228 205 186 184 178 177 153 150 149 142 137135Execute com perl -E.
Golfe:
Esta solução usa alguns caracteres não imprimíveis, portanto, um hexdump é fornecido abaixo:
Como alternativa, usando Ctrl + Key:
Ungolfed + comentou:
fonte
-M5.010
(penalidade de 0 porque especifica uma versão do idioma a ser usado) em vez de-e
(penalidade de 1)? Você pode salvar um byte nos argumentos.C, Rev. 2,
151 145138Inspirado no código de 159 bytes no comentário de @ bebe, eu adicionei outros
8 1421 caracteres:4 bytes salvos reorganizando o contador de comprimento
i
. Isso é inicializado como 1 (assumindo que o programa não requer argumentos) e multiplicado por 4 toda vez que uma carta é lida. Ele excede a zero quando o tamanho da palavra é maior que 15; portanto, para verificar se o tamanho da palavra está ruim, basta verificar sei<5
(eu colocoi<9
para que ainda seja inválido para palavras de uma letra se o usuário acidentalmente inicializari
para 2, colocando um único argumento na linha de comando.)4 bytes salvos alterando o teste de condição do loop para um simples
&31
. Isso requer que a palavra seja finalizada com um espaço (ASCII 32) ou um caractere nulo (ASCII 0.). Normalmente, a entrada do teclado é finalizada por uma nova linha (ASCII 10); portanto, o programa é um pouco inconveniente de usar, porque você deve digitar o espaço e pressione return também para fazer o computador ler o buffer. Para strings terminadas em nova linha, eu poderia igualar, mas não bater, da maneira que o bebe faz.613 bytes salvos alterando a codificação para - (número de blocos de cada letra) - (pontuação para a letra 1) * 13 . Isso agora requer um intervalo de -4 para L, S, U a -118 para Q, Z. O motivo para usar números negativos é evitar o intervalo ASCII não imprimível de 0 a 31. Em vez disso, o intervalo usado é o complemento de dois dos números negativos 256-4 = 252 a 256-118 = 138. Esses são caracteres ASCII estendidos e imprimíveis. Há problemas com a cópia e colagem deles no Unicode (a maneira como ele simplifica o retorno ao ASCII depende da página de códigos instalada, o que pode levar a resultados imprevisíveis), por isso incluí os códigos ASCII corretos no comentário do programa.A vantagem dessa codificação é a eliminação da variável,
r
já que o número de blocos é sempre reduzido em 1 (como é armazenado como um número negativo)t[x]++
. Além disso, o operador postfix significa que podemos executar esse incremento ao mesmo tempo que adicionando a pontuação as
.C,
184Rev 1 173 (ou 172 com opção de compilador)Estou usando o GCC e, com a opção do compilador
-std=c99
, me permitirá entrarchar t[]="...."
na inicialização dofor
loop para economizar um ponto e vírgula adicional. Para facilitar a leitura, mostrei o programa sem essa alteração e com espaços em branco restantes.O truque está na tabela de dados. Para cada letra, um código ASCII do formulário (pontuação total de blocos para essa letra) * 10 + (pontuação de um bloco-1) é armazenado na tabela
t[]
. No tempo de execução, essas pontuações totais são reduzidas à medida que as peças são usadas.A pontuação total de todos os blocos de cada letra varia de 12 para E até 4 para L, S, U. Essa forma de codificação permite que apenas caracteres ASCII imprimíveis sejam usados (ASCII 120,
x
para E até ASCII 40,(
para L, S, U). O uso do número de blocos requer um intervalo de 120 a 10, e é por isso que eu evitado.Graças a uma
#define
macro, um único símboloT
é usado no programa principal para recuperar o índice cartai
do primeiro argumento de linha de comando, ASCII subtrairA
= 65 a partir dele para dar um índice, e procurá-lo na tabela T:t[x[1][i]-65]
.O
for
loop é usado mais como umwhile
loop: o loop termina quando um byte zero (terminador de string) é encontrado na string de entrada.Se os blocos dessa letra não estiverem esgotados (
T/10
é diferente de zero)s
, a pontuação do bloco será incrementadaT%10+1
para manter uma pontuação total. Ao mesmo tempo, a pontuação do bloco é armazenadar
, de modo que o valor no capaz representado porT
possa ser diminuído porr*10
para indicar que um bloco foi usado. Se os blocos estiverem esgotados, o contador curinga / em brancob
será incrementado.A
printf
afirmação é bastante auto-explicativa. se o comprimento da palavra estiver fora dos limites ou a contagem de espaços em branco for muito alta, imprima;Invalid
caso contrário, imprima a pontuaçãos
.fonte
?
e:
. Seu outro ponto foi substituído, pois eu mudei completamente a codificação para que não haja necessidade de nenhum tratamento especial de Q e Z. Agora, baixe para 173/172 com sua ajuda.getchar()
o 159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
embora eu ainda não entenda o porquêchar*foo=<string>
. poderia salvar 2 caracteres.char*foo="string"
é uma string literal e seu conteúdo não pode ser modificado. Por outro lado,char foo[]="string"
cria uma matriz de caracteres inicializados parastring\0
, que podem ser modificados.getchar().
Eu usei suas melhorias no código (com meus nomes de variáveis para consistência com o restante da minha resposta), além de uma melhoria na verificação da validade do comprimento da palavra e uma melhoria atrevida na condição do loop teste (eu tentei encurtar o seu, mas não poderia fazê-lo com a mesma funcionalidade.) Eu também tenteigetche()
egetch()
mas meu compilador (gcc em cygwin) não ligá-los automaticamente.JavaScript (ES6) -
241230199182Editar - mudou a maneira como codifiquei as quantidades / pontuações para reduzir o tamanho e remover variáveis não-ascii
Editar 2 - alterou as codificações de quantidade / pontuação para números inteiros em vez de cadeias
Edição 3 - mudou para
%13
(thanks @ edc65), inverteu a codificação, modificou os valores diretamente e algumas outras pequenas melhoriasTestado no console do Firefox.
fonte
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2. por que não usar% 13%13
é um golpe de gênio. Fiquei preso pensando que tinha que armazenar coisas em dígitos, mas a matemática não se importa com a diferença entre base10 e base13.SyntaxError: Unexpected token >
)f=s=>{...}
notação).Python 3,
217201Ungolfed:
Edit: Obrigado a @BeetDemGuise por uma dica que me levou a muito mais do que uma redução de 1 caractere! Código original abaixo:
fonte
int('1332142418513113a11114484a'[o],16)
:)93 - 210 bytes.
Mas não verifica o limite de 15 letras.
fonte
C, 197
Assume que a string é fornecida como um argumento de linha de comando, por exemplo
./scrabble STACKEXCHANGE
fonte
JavaScript -
232201z
armazena palavra. Saídas como alerta.Editar: aprimorado conforme as recomendações abaixo.
fonte
s
é usado apenas uma vez, para que você não precise transformá-lo em uma variável; você pode remover essa declaração e substituirr+=s[x]
porr+=-~"02210313074020029000033739"[x]
. Além disso, você não precisa de parênteses(w>2|y<2|y>15)
no alerta.Haskell - 538
Salve-o como scrabble.hs e compile-o usando
Em seguida, digite sua palavra como entrada e pressione enter
fonte
"ABCDEFG"
pode ser escrito como['A'..'G']
,[1,2,3]
pode ser escrita como[1..3]
Python 2.7 - 263
Eu não consegui chegar nem perto da resposta do DLosc , mas isso trata cada letra como uma 'sacola' da qual você puxa, até ficar vazia, depois você puxa espaços em branco e, quando está vazia, ela erra.
fonte
raw_input
se é Python2 (uma coisa que eu gosto no Python3). A entrada é garantida em maiúsculas, portanto remova.lower()
e mude97+i
para65+i
. A entrada com menos de 2 caracteres também precisa ser inválida. Você pode aumentar o erro de divisão zero sem umaif
declaração: divida sua pontuação total por(1<len(S)<16)
. Alguns outros ajustes, como colocar osprint
s na mesma linha que os cabeçalhos dos blocos e excluir o espaço antes"Invalid"
, o reduzem a 250 pela minha contagem. :)Haskell,
290283O mais longe que pude fazer por enquanto:
Esse código cumpre as regras de maneira muito estrita; portanto, não passe caracteres extras (como final de linha). Use assim:
echo -n "JAZZ" | runghc scrabble.hs
.Explicação
O padrão
(_:_:_)
garante que apenas cadeias de caracteres de pelo menos dois caracteres sejam consideradas; tudo o resto resulta em"Invalid"
(padrão de fallback_
). A tabela de blocos é codificada como11*nTiles+value
convertida em ASCII com um deslocamento que permite que o módulo de pesquisa 11 funcione, onde as letrasAEIO
são duplicadas porque ocorrem mais de 6 vezes cada. O pool de blocos é criado usandoreplicate
, do qual os caracteres da palavra são removidos à medida que ocorrem (diferença de lista,\\
). O pool contém 98 blocos, portanto, se o comprimento total da palavra e a parte restante do pool for maior que 100, usamos muitos curingas. Além disso, a palavra menos as 15 primeiras letras é adicionada três vezes ao cálculo do comprimento, para que qualquer palavra com mais de 15 letras pareça usar automaticamente três caracteres curinga e, portanto, é inválida. A pontuação é feita no pool restante, que inicialmente tinha 187 pontos, dos quais simplesmente subtraímos. Observe o emf 61
vez def 65
, 65 sendo o número ASCII de'A'
, por causa da duplicata"AEIO"
no início do pool. O resto é apenas clichê.fonte
Python3 - 197
Vamos colocar os bignums em uso: D (atualmente não lida com curingas, eu pulei a leitura dessa regra completamente, caramba)
fonte
Ruby - 195
Estou assumindo que a saída de
"Invalid"
está bem, se não, eu precisaria fazer o$><<(-b<1&&w.size<16?s:'Invalid')
que aumentaria até 198Clojure - 325
Não faço clojure há algum tempo, então tenho certeza de que existem várias maneiras de melhorar minha solução. Nas listas de qty e pts
Alguns que Un-golfed
fonte
ES6: 184 (não estrito)
w
presume-se que já contenha a palavrar
é a sequência de saída.Aqui está explicado e um pouco menos jogado:
fonte
Dardo - 201
Isso requer bignums, portanto não será compilado para JavaScript.
Com mais espaço em branco:
fonte
PHP,
180170168 bytesYay! batendo JS!
demolir
Estou tão feliz que não há uma pontuação maior que 10.
fonte