Quanto tempo dura uma palavra galesa?

37

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
TRiG
fonte
4
A entrada pode ser dada em minúsculas?
ETHproductions
15
Minha esposa que é um falante nativo Welsh recomendaria que o J é adicionado à seção de cartas "emprestado", pois não é realmente parte do alfabeto Welsh
rico Starkie
@RichStarkie O artigo da Wikipedia era um pouco vago nessa frente. Meu entendimento é que j é usado em palavras emprestadas, mesmo quando não está presente na palavra original, por isso é usado em termos fonológicos, o que implica que, nesta fase, é naturalizado no idioma. Eu já vi argumentos semelhantes sobre v em irlandês. Considera-se amplamente que não faz parte do alfabeto irlandês, mas existe em alguns nomes irlandeses, como Ó Cuiv .
TRiG 12/09
11
E uma nota de rodapé no artigo de ortografia galesa lista mh , nh e ngh como grafemas . Acho que preciso abrir uma pergunta sobre Linguística SE .
TRiG 13/09/16
3
Pena que seja tarde demais; que "ngh" com três glifos pode ter tornado um pouco mais complicado.
megaflop

Respostas:

6

05AB1E , 24 23 21 bytes

Código:

u•éÓœ°D¥M™ù>•30B2ô0:g

Explicação:

u                      # Convert the input to uppercase.
 •éÓœ°D¥M™ù>•30B       # Compressed version of CHDDFFNGLLPHRHTH.
                         It convert the text between the •'s from base 214 to
                         base 10 and converts that to base 30.
                2ô     # Split into pieces of 2.
                  0:   # Replace each element that also occurs in the input by 0.
                    g  # Get the length of the processed input.

Usa a codificação CP-1252 . Experimente online!

Adnan
fonte
16

Retina , 23 bytes

i`[cprt]h|dd|ff|ng|ll|.

Experimente online!

Até moar regex.

user48538
fonte
Provavelmente é minha ignorância da Retina, mas onde está a saída do comprimento do texto de entrada? A documentação do Retina parece não explicar como está funcionando no "Experimente online!" local.
Xaero Degreaz
2
A saída está implícita, porque a única linha é um estágio de Correspondência, retornando o número de correspondências. Aqui, o regex corresponde a todas as letras galesas.
user48538
Então, por essa lógica, todas as respostas abaixo de onde o comprimento é explicitamente chamado no código podem ser reduzidas?
Xaero Degreaz
2
O @XaeroDegreaz Retina é um dos únicos idiomas que conta automaticamente as correspondências e as imprime. É assim que a Retina, a linguagem, funciona. Não é assim que outros idiomas funcionam e, portanto, esses idiomas precisam chamar explicitamente suas funções de comprimento para obter a saída correta.
Isaacg
Obrigado, eu entendo agora. Depois de ler mais na documentação, vejo que o estágio "Match" padrão executa essa saída.
Xaero Degreaz
5

JavaScript (ES6), 44 bytes

x=>x.match(/[cprt]h|dd|ff|ng|ll|./gi).length

A resposta trivial pode ser a mais curta.

ETHproductions
fonte
5

BASH 52 50 (sed + wc) 41

-9 graças a Jordânia

sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m

Se uma letra maiúscula for necessária, será necessário um ino final do comando sed. (Deixei de fora porque todas as "letras únicas" da pergunta são minúsculas, embora alguns exemplos não sejam).

Riley
fonte
11
Por que ao grep -o .|wc -linvés de wc -c?
Jordânia
wc -c conta â até ẁ como dois.
Riley
Ah, claro. FWIW, se você usa GNU ou BSD, wcpode usar -mpara contar caracteres em vez de bytes.
Jordan
Você pode mover o cfrom chin com o [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop
2
É uma pena que ([dfl])\1seria mais do que dd|ff|ll. Apenas mais uma consoante dupla favoreceria a versão inteligente.
perfil completo de Toby Speight
4

Palha , 30 58 35 33 bytes

<((?i:[cprt]h|dd|ff|ng|ll|.))0/$>

Substitua cada ocorrência da regex por 0e converta de unário para decimal.

Infelizmente, Straw não pode passar bandeiras para regexs. Eu esqueço a ?flags:construção

Experimente online! (O código adicionado é para verificar todos os casos de teste)

TuxCrafting
fonte
Como esse idioma difere de algo como Retina?
Downgoat 12/09/16
@Downgoat Straw é baseado em pilha: P
TuxCrafting
3

Python 3, 64 bytes

import re
print(len(re.findall("[cprt]h|dd|ff|ng|ll|.",input())))

Usa regex novamente

Ideone it!

Beta Decay
fonte
3

PowerShell v2 +, 52 50 48 bytes

($args[0]-replace'dd|ff|ng|ll|[prtc]h',0).length

Faz um -replaceem todas as letras de dois símbolos e uma letra, muda para 0(feito porque alterar para um não numérico exigiria aspas) e depois obtém o .lengthda string resultante.

Casos de teste

PS C:\Tools\Scripts\golfing> 'Llandudno','Llanelli','Rhyl','Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch','Tŷr','Cymru','Glyndŵr'|%{"$_ --> "+(.\how-long-is-a-welsh-word.ps1 $_)}
Llandudno --> 8
Llanelli --> 6
Rhyl --> 3
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch --> 50
Tŷr --> 3
Cymru --> 5
Glyndŵr --> 7
AdmBorkBork
fonte
Não conheço o PowerShell, mas você realmente precisa dos parênteses [prtc]h?
Jordan
@ Jordan Não, eu não. Isso não é coisa do PowerShell, é algo que eu não sou bom em regex. : D Obrigado pelo golfe!
AdmBorkBork 12/09
2

V , 31 bytes

Íã[cprt]hüddüffüngüllü./
Dé0@"

Experimente online ou verifique todos os casos de teste!

Isso contém alguns caracteres não imprimíveis, então aqui está um hexdump:

0000000: cde3 5b63 7072 745d 68fc 6464 fc66 66fc  ..[cprt]h.dd.ff.
0000010: 6e67 fc6c 6cfc 2e2f 010a 44e9 3040 22    ng.ll../..D.0@"
DJMcMayhem
fonte
2

PHP, 56 bytes

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);
Jörg Hülsermann
fonte
11
Acredito [dfl]{2}jogos df, ldetc., bem como os seus jogos pretendidos. dd|ff|lltem o mesmo comprimento.
ETHproductions
11
Eu sei que sua crença é verdadeira, mas acho que sua crença não é um tipo de crença. parece mais do que um tipo de de saberes
Jörg Hülsermann
11
Em vez de echo(espaço no final), use <?=, que economiza 2 bytes. Além disso, $tnão é necessário, economizando mais 3 bytes.
Ismael Miguel
Thnak You Ismael. Devo estar mais do que um pouco confuso por não remover o $ t
Jörg Hülsermann 13/09/16
2

Java 7, 156 73 bytes

Cargas de bytes salvos graças ao @ OlivierGrégoire .

int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","*").length();}

Casos não testados e de teste:

Experimente aqui.

class M{
  static int c(String s){
    return s.replaceAll("[cprt]h|dd|ff|ng|ll", "*").length();
  }

  public static void main(String[] a){
    System.out.println(c("llandudno"));
    System.out.println(c("llanelli"));
    System.out.println(c("rhyl"));
    System.out.println(c("llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"));
    System.out.println(c("tŷr"));
    System.out.println(c("cymru"));
    System.out.println(c("glyndŵr"));
  }
}

Saída:

8
6
3
50
3
5
7
Kevin Cruijssen
fonte
Você importa e depois não usa Matcherdiretamente? : o Além disso, Matcherpode ser definido no loop for.
Olivier Grégoire
11
Tenho a sensação forte de que return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()é muito, muito menor. Isso não pode funcionar?
Olivier Grégoire
Bem, sim, funciona e são 73 bytes para a versão Java 7 ( 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()).
Olivier Grégoire
11
@ OlivierGrégoire Obrigado. O Matcherfoi um acidente. Eu o tinha corretamente no código de teste, mas não no código de golfe.>.> Seu replaceAlltrabalho funciona melhor, obrigado.
Kevin Cruijssen 13/09/16
1

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ção ignore.case = TRUE(terceiro argumento para gsub) para corresponder caracteres maiúsculos e minúsculos.

nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",scan(,""),T))

Bônus

Ambos gsube ncharsão vetorizados, o que significa que isso também funciona em um vetor de caractere, por exemplo:

v=c("Llandudno","Llanelli","Rhyl","Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch","Tŷr","Cymru","Glyndŵr")
nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",v,T))

produz:

[1]  8  6  3 50  3  5  7
Billywob
fonte
0

XQuery, 77 bytes

declare variable$s external;count(tokenize($s,'[cprt]h|ff|dd|ll|ng|.','i'))-1
Kniffler
fonte
0

tcl, 71

proc L s {string le [regsub -all -nocase ch|dd|ff|ng|ll|ph|rh|th $s @]}

demonstração

sergiol
fonte