Escreva um programa ou função que receba como entrada uma sequência que representa uma palavra galesa (UTF-8, a menos que especificado de outra forma por você).
A seguir, todas as letras em galês:
a, b, c, ch, d, dd, e, f, ff, g, ng, h, i, j, l, ll, m, n, o, p, ph, r, rh, s, t, th, u, w, y
Para citar a Wikipedia ,
Enquanto os digrafos ch , dd , ff , ng , ll , ph , rh , th são escritos com dois símbolos, todos são considerados letras únicas. Isso significa, por exemplo, que Llanelli (uma cidade no sul de Gales) é considerada com apenas seis letras em galês, em comparação com oito letras em inglês.
Essas cartas também existem em galês, embora sejam restritas ao vocabulário técnico emprestado de outras línguas:
k, q, v, x, z
Letras com diacríticos não são consideradas letras separadas, mas sua função deve aceitá-las e poder contá-las. Possíveis cartas são:
â, ê, ô, û, ŷ, ŷ, á, é, í, ó, ú, ý, ä, ä, ë, ï, ö, ü, ÿ, ẅ,,, à, è, ì, ò, ù, ẁ
(Isso significa que ASCII não é uma codificação de entrada aceitável, pois não pode codificar esses caracteres.)
Notas:
- Isso é código de golfe.
- Você não precisa explicar palavras como llongyfarch , nas quais o ng não é um dígrafo, mas duas letras separadas. Esta palavra tem nove letras, mas você pode calculá-la como oito. (Se você pode explicar essas palavras, isso é incrível, mas está fora do escopo desse desafio.)
- É garantido que a entrada não possui espaço em branco (a menos que você prefira uma única linha de chegada) (ou algo mais esotérico); Certamente não haverá espaço em branco interno.
Casos de teste:
- Llandudno, 8
- Llanelli, 6
- Rhyl, 3
- Llanfairpwllgwyngyllgogerychwyrndrobwllantysiliogogogoch, 50 (realmente 51, mas contaremos 50)
- Ter, 3
- Cymru, 5
- Glyndŵr, 7
Respostas:
05AB1E ,
242321 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
Retina , 23 bytes
Experimente online!
Até moar regex.
fonte
JavaScript (ES6), 44 bytes
A resposta trivial pode ser a mais curta.
fonte
BASH
52 50(sed + wc) 41-9 graças a Jordânia
Se uma letra maiúscula for necessária, será necessário um
i
no final do comando sed. (Deixei de fora porque todas as "letras únicas" da pergunta são minúsculas, embora alguns exemplos não sejam).fonte
grep -o .|wc -l
invés dewc -c
?wc
pode usar-m
para contar caracteres em vez de bytes.c
fromch
in com o[prt]
?sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
([dfl])\1
seria mais do quedd|ff|ll
. Apenas mais uma consoante dupla favoreceria a versão inteligente.Palha ,
30583533 bytesSubstitua cada ocorrência da regex por
0
e converta de unário para decimal.Infelizmente, Straw não pode passar bandeiras para regexs.Eu esqueço a?flags:
construçãoExperimente online! (O código adicionado é para verificar todos os casos de teste)
fonte
Python 3, 64 bytes
Usa regex novamente
Ideone it!
fonte
PowerShell v2 +,
525048 bytesFaz um
-replace
em todas as letras de dois símbolos e uma letra, muda para0
(feito porque alterar para um não numérico exigiria aspas) e depois obtém o.length
da string resultante.Casos de teste
fonte
[prtc]h
?V , 31 bytes
Experimente online ou verifique todos os casos de teste!
Isso contém alguns caracteres não imprimíveis, então aqui está um hexdump:
fonte
PHP, 56 bytes
fonte
[dfl]{2}
jogosdf
,ld
etc., bem como os seus jogos pretendidos.dd|ff|ll
tem o mesmo comprimento.echo
(espaço no final), use<?=
, que economiza 2 bytes. Além disso,$t
não é necessário, economizando mais 3 bytes.Java 7,
15673 bytesCargas de bytes salvos graças ao @ OlivierGrégoire .
Casos não testados e de teste:
Experimente aqui.
Saída:
fonte
Matcher
diretamente? : o Além disso,Matcher
pode ser definido no loop for.return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()
é muito, muito menor. Isso não pode funcionar?int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}
). E apenas 51 para a versão Java 8 (s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()
).Matcher
foi um acidente. Eu o tinha corretamente no código de teste, mas não no código de golfe.>.> SeureplaceAll
trabalho funciona melhor, obrigado.R, 54 bytes
Muito parecido com as outras respostas. Corresponde a qualquer uma das duas letras de caracteres e as substitui por
@
e, posteriormente, conta o número de caracteres. Lê a entrada de stdin. Usa a opçãoignore.case = TRUE
(terceiro argumento paragsub
) para corresponder caracteres maiúsculos e minúsculos.Bônus
Ambos
gsub
enchar
são vetorizados, o que significa que isso também funciona em um vetor de caractere, por exemplo:produz:
fonte
Perl 6 , 36 bytes
Experimente online!
fonte
XQuery, 77 bytes
fonte
tcl, 71
demonstração
fonte
Perl 5 , 35 + 1 (
-p
) = 36 bytesExperimente online!
fonte