Meu pai é um professor aposentado e costumava fazer testes combinados de ortografia e matemática, nos quais o aluno escrevia uma palavra e depois 'pontuava' a palavra somando as letras, onde a = 1, b = 2, etc. (por exemplo, gato = 3 + 1 + 20 = 24). Isso facilitou a classificação dos questionários, pois ele precisaria apenas verificar "pontuações" incorretas em vez de palavras escritas incorretamente, além de ter o benefício adicional de testar duas habilidades de uma só vez.
Ele contratou um amigo meu para escrever um programa que classificasse palavras para ele, para que ele pudesse gerar chaves de resposta longas sem erros. Esse problema é inspirado nesse programa.
Requisitos:
- Aceite qualquer palavra com letras maiúsculas e minúsculas
- Retorna um erro para qualquer caractere especial, como espaços, hífens, @ ^% # etc.
- a = 1, b = 2, ... e A = 1, B = 2, ...
- Imprima a pontuação da palavra
- (Opcional) verifique se a palavra está em um dicionário após a pontuação e imprima um aviso, se não estiver.
- Não é possível importar um dicionário externo de letras-> números. Você deve gerá-lo você mesmo.
Qualquer idioma é aceitável. Isso é semelhante à ' batalha raiz digital ', mas muito mais simples.
code-golf
tag.aaaaaaaaaaaaaaaaaaaaaaaa
. Pai: A pontuação é 24? Está certo!Respostas:
Golfscript - 23 caracteres
Verifique se não há novas linhas à direita na entrada (por exemplo, uso
echo -n
).fonte
echo -n
realmente não conta como filtro externo - na verdade, a resposta que você vinculou sugere que é um formulário válido para entrada.Brainf *** (100)
Eu tenho que admitir, porém, isso não está de acordo com todos os requisitos. Primeiro, ele aceita apenas letras maiúsculas e a palavra deve ser finalizada com uma guia. Tem um comportamento indefinido para caracteres inválidos e não gera um erro. Ele exibe a soma das letras como um caractere ASCII. Por exemplo, se a palavra for "HELLO", (8 + 5 + 12 + 12 + 15 = 52), ele exibirá o caractere "4", que é o caractere ASCII para 52. Isso também significa que o programa enlouquece quando a soma é superior a 255.
Mas, fora isso , funciona muito bem. Dá um tempo, meu cérebro só aguenta pequenas doses de ... bem, você sabe.
fonte
\n
ou\r\n
ou\n\r
. E se eu usasse a nova linha, não teria um número redondo agradável como 100 como a contagem de caracteres.Python (
6564)Isso gera um erro se a palavra contiver caracteres que não sejam da letra, mas não útil ou informativa. (Edit: ponta do chapéu para st0le para o truque de indexação.)
fonte
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())
raspou um par de caracteres.input
; força o usuário a colocar aspas nas seqüências de caracteres de entrada, mas "fácil de usar" e "não perigoso" não estão na especificação!raw_input
→input
print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper())
outro byte raspadaRuby, 43 caracteres
A mensagem de erro que isso gera não é exatamente útil, no entanto. As duas soluções postadas aqui assumem que a entrada não possui quebra de linha à direita; portanto, para testá-las, use
echo -n
.Ruby, 76 caracteres com verificação de dicionário
A mensagem de aviso consiste no caractere único "W". O caminho para o dicionário deve ser fornecido via ARGV. Exemplo de uso:
fonte
Python 2.6 (72 caracteres) Sem verificação de dicionário
Python 2.6 (178 caracteres *) Com verificação de dicionário
* Pode ser reduzido para 156 com uma mensagem de erro menos útil. :-)
Obrigado a todos os comentaristas por ajudarem a melhorar isso.
fonte
sum
built-in com uma expressão de gerador, em vez de umfor
loop. Isso permitiria que você aparasse alguns caracteres (~ 17).a
apenas uma vez, então use o literal em si ..."0abc....z".index(i)
funcionará de forma equivalente.0
em sua matriz de pontuação é inteligente, mas também significa quecat0
é aceito sem erros, o que não está certo, eu acho. O que é muito ruim, pois permitiria passarmap(a.index,w)
parasum
ele (substituindo o literal pora
st0le).Perl
(52)(48)jogou ainda mais graças a Timwi
perl -lpe "($w=uc)=~/[^A-Z]/&¨$w=~s/./$_-=64-ord$&/ge"
fonte
-e
bandeira lá.p
el
intérprete na sua contagem de caracteres. Veja esta discussão no meta.syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.
O que estou fazendo de errado?Python (80)
Python v2 (65, mas char `será aceito)
v3 (60 caracteres, @ serão aceitos, mas não contados, obrigado jloy)
fonte
Scala: 59 caracteres, 7 deles carga útil, sem ditado:
Nenhum dicionário até agora. Resultado negativo significa: Negativo!
Manipula alemão Umlaute graciosamente, a propósito:
fonte
alpha.pl
e iniciei-os porperl alpha.pl
. Eles apenas lidam com Ascii? Bem - no Perl é um animal tão antigo ... :)perl -M5.010 alpha.pl
ou algo assim.Bibliotecas Java + Google Guava, 347 caracteres, com verificação de dicionário
Versão ilegível de 1 string longa :-)
Versão legível por humanos (mais ou menos :-))
O caminho do dicionário agora é transmitido via
a[1]
, para que as afirmações funcionem, você precisa usar a-ea
bandeira (mais 3 caracteres). Quanto ao dicionário, o dict/usr/share/dict/words
(deve estar disponível na maioria dos sistemas * nix) foi usado.fonte
UTF-8
é mais curta que os outros charsets :-).Python 3, 95 caracteres com dicionário
O dicionário deve estar em um arquivo chamado d.
Python 3, 61 sem dicionário, mas ideia roubada
fonte
Perl (71)
fonte
VB.NET,
84827371Edit: Com a validação é:
129 caracteres. Nesse caso:
C #, 118
fonte
Melhorando um pouco a resposta de John: Python (90)
fonte
Erlang, 104
fonte
Golfscript - 39 caracteres
O erro que ele lança não é exatamente o melhor, mas interrompe a execução.
fonte
PYTHON
6268 * PersonagensRequer que o usuário insira seqüências de caracteres usando aspas e não é seguro (
input
executa o código), mas, como eu disse em um comentário em outro post, "amigável" e "sem risco de segurança" não estão na especificação!* Eu esqueci
print
, caramba.fonte
input
/raw_input
.Rubi 1.9, 69
fonte
GolfScript, 50 (53)
Dá um erro em caracteres ruins, mas não muito bom (50 caracteres):
Dá "E" por erro (53 caracteres):
O snippet gerador de alfabeto
123,97>+
é roubado do Ventero.fonte
J (55)
Isso satisfaz todas as condições, exceto a do dicionário. Como condição de erro, ele retorna "infinito" (o símbolo de sublinhado em J) para palavras que contenham apenas letras.
fonte
Haskell (127)
(gera um erro em caracteres estranhos)
(também: o espaço entre
toUpper.
e\x
é necessário, caso contrário, ele será analisado como(toUpper)
.\
(x)
)Haskell (70)
(não gera um erro, mas 45% menor)
fonte
C ++ (
111107)O "configurar" / etc:
Comportamento "indefinido" (é mais 'má prática' do que 'indefinido', mas tudo bem):
void main()
Isso já diz tudo.new
semdelete
.fonte
JavaScript 1.8, 80 caracteres
Surpreendentemente legível!
fonte
alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0))
. Eu ainda gosto soluções JavaScript mais :)APL (34)
Dá a pontuação ou a
VALUE ERROR
se houver caracteres não alfabéticos na entrada.Explicação:
⍞
: lê uma linha de entrada{
...}
: função aplicada a todos os caracteres da entradaA←⎕UCS⍵
: armazene o valor ASCII do caractere atual emA
A-32×96<A
: torna o caractere em maiúsculas: deA
é subtraído 32 se96<A
(então, se estiver em maiúsculas), caso contrário 064-⍨
: subtraia 64 disso, dando A = 1, B = 2 ...¨
: aplique esta função a todos os caracteres:⍵∊⍳26
: se o caractere estiver entre 1 e 26 ...:⍵
: então retorne ⍵ (e como não há mais cláusula, haverá umVALUE ERROR
se não estiver entre 1 e 26)+/
: soma todos os valores (e esse valor é gerado automaticamente porque é o resultado final).fonte
JavaScript, 60 bytes
Se o programa precisar retornar um erro em entradas inválidas, 80 bytes:
Se uma entrada for inválida, o console dirá que
_
não está definido (ainda não deve haver uma variável definida chamada_
).fonte
Python 3,
5855sem dicionário ou idéia roubada, mas ainda erro inútil;)
thx @ Eᴀsᴛᴇʀʟʏ
Teste aqui .
fonte
print<SPACE>sum(ord(.......
, removendo os 2 parênteses em torno da expressão.input()
em python3 estáraw_input()
em python2C, 98 bytes
fonte
F # (sem validação)
7957 caracteresfonte
C # com validação: 108 caracteres (com 12 para mensagem de erro):
C # sem validação:
6053 caracteres:fonte
Perl (
42.31)Espero que contar F, p, a e l como 1 caractere esteja correto.
fonte
JavaScript, 68 bytes
Isso quase certamente pode ser jogado mais
Com verificação de dicionário (apenas Node.js e Descendentes Unix) 195 bytes
Usa
/usr/share/dict/words
e pode ser definitivamente reduzido (veja a mensagem de aviso)fonte
console.error()
, nãoconsole.warn()
.