Combien de temps dure un mot gallois?

37

Ecrivez un programme ou une fonction qui reçoit en entrée une chaîne représentant un mot gallois (UTF-8, sauf indication contraire de votre part).

Ce qui suit sont toutes des lettres simples en gallois:

a, b, c, ch, d, jj, e, f, ff, g, ng, h, i, j, l, ll, m, n, o, p, ph, r, rh, s, t, th, u, w, y

Pour citer Wikipedia ,

Bien que les digraphes ch , dd , ff , ng , ll , ph , rh , th soient chacun écrits avec deux symboles, ils sont tous considérés comme des lettres simples. Cela signifie, par exemple, que Llanelli (une ville du sud du Pays de Galles) n’a que six lettres en gallois, contre huit en anglais.

Ces lettres existent également en gallois, bien qu’elles soient limitées au vocabulaire technique emprunté à d’autres langues:

k, q, v, x, z

Les lettres avec signes diacritiques ne sont pas considérées comme des lettres séparées, mais votre fonction doit les accepter et pouvoir les compter. Les lettres possibles sont:

â, ê, î, ô, û,, ŵ, á, é, í, ó, ú, ý, ä, ä, ë, ï, ï, ö, ü,,, à, è, è, ò, ò, ù, ẁ

(Cela signifie que l'ASCII n'est pas un codage d'entrée acceptable, car il ne peut pas coder ces caractères.)

Remarques:

  • C'est du code golf.
  • Vous ne devez pas tenir compte des mots comme llongyfarch , dans lequel le ng est pas un digraphe, mais deux lettres distinctes. Ce mot a neuf lettres, mais vous pouvez le dénombrer comme huit. (Si vous pouvez rendre compte de tels mots, c'est génial, mais sort du cadre de ce défi.)
  • Il est garanti que l’entrée n’a pas d’espace (sauf si vous le préférez avec un retour à la ligne simple (ou quelque chose de plus ésotérique), auquel cas cela peut être fourni). Il n'y aura certainement pas d'espaces internes.

Cas de test:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogogoch, 50 (vraiment 51, mais nous compterons 50)
  • Tŷr, 3
  • Cymru, 5
  • Glyndŵr, 7
Trigonométrie
la source
4
L'entrée peut-elle être donnée en minuscule?
ETHproductions
15
Mon épouse, qui parle le gallois, recommande d’ajouter le J à la section "Emprunts", car il ne fait pas partie de l’alphabet gallois.
Rich Starkie
@RichStarkie L'article de Wikipedia était un peu vague sur ce front. D'après ce que je comprends, j est utilisé dans les mots empruntés même lorsqu'il n'est pas présent dans le mot d'origine. Il est donc utilisé phonologiquement, ce qui implique qu'à ce stade, il est natualisé dans la langue. J'ai vu des arguments similaires à propos de v en irlandais. On considère généralement que l’alphabet irlandais ne fait pas partie de l’alphabet irlandais, mais il existe sous certains noms irlandais, tels que Ó Cuiv .
TRiG
1
Et une note de bas dans les listes d'articles de alphabet gallois mh , nh , et NGH comme graphems . Il me semble que je dois ouvrir une question sur la linguistique SE .
TRiG
3
Dommage qu'il soit trop tard; ce "ngh" triple glyphé aurait pu compliquer un peu les choses.
megaflop

Réponses:

6

05AB1E , 24 23 21 octets

Code:

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

Explication:

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.

Utilise le codage CP-1252 . Essayez-le en ligne!

Adnan
la source
16

Retina , 23 octets

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

Essayez-le en ligne!

Même regex moar.

utilisateur48538
la source
C'est probablement mon ignorance de Retina, mais où est la sortie de la longueur du texte saisi? La documentation sur Retina ne semble pas expliquer comment cela fonctionne dans la section "Essayez-le en ligne!" site.
Xaero Degreaz le
2
La sortie est implicite, car la seule ligne est une étape de correspondance, renvoyant le nombre de correspondances. Ici, la regex correspond à chaque lettre en gallois.
user48538
Donc, par cette logique, chaque réponse ci-dessous où la longueur est explicitement appelée dans le code peut être raccourcie?
Xaero Degreaz le
2
@XaeroDegreaz Retina est l'une des seules langues à compter automatiquement les correspondances et à les imprimer. C’est ainsi que fonctionne le langage Retina. Ce n'est pas la façon dont les autres langues fonctionnent, et donc ces langues doivent appeler leurs fonctions de longueur explicitement pour obtenir le bon résultat.
isaacg
Merci, je comprends maintenant. Après avoir lu davantage dans la documentation, je vois que l'étape par défaut "Match" effectue cette sortie.
Xaero Degreaz
5

JavaScript (ES6), 44 octets

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

La réponse triviale peut être la plus courte.

ETHproductions
la source
5

BASH 52 50 (sed + wc) 41

-9 grâce à la Jordanie

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

Si une lettre majuscule est requise, une commande ià la fin de la commande sed est nécessaire . (Je l'ai laissé de côté car toutes les "lettres simples" de la question sont en minuscule, même si certains exemples ne le sont pas).

Riley
la source
1
Pourquoi grep -o .|wc -lau lieu de wc -c?
Jordanie
wc -c compte deux fois à travers.
Riley
Ah bien sur. FWIW si vous utilisez GNU ou BSD, wcvous pouvez utiliser -mpour compter les caractères au lieu d'octets.
Jordanie
Pouvez-vous déplacer le cde chdans avec le [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop
2
C'est une honte ([dfl])\1serait plus long que dd|ff|ll. Une seule consonne doublée favoriserait la version intelligente.
Toby Speight
4

Straw , 30 58 35 33 octets

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

Remplacez chaque occurrence de l'expression rationnelle par 0et convertissez unaire en décimal.

Malheureusement, Straw ne peut pas passer les drapeaux aux regex. J'oublie la ?flags:construction

Essayez-le en ligne! (Le code ajouté est destiné à vérifier tous les cas de test)

TuxCrafting
la source
Comment cette langue diffère-t-elle de quelque chose comme Retina?
Downgoat
@Downgoat Straw est basé sur une pile: P
TuxCrafting
3

Python 3, 64 octets

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

Utilise regex à nouveau

Ideone ça!

Beta Decay
la source
3

PowerShell v2 +, 52 50 48 octets

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

Effectue une commande -replacesur toutes les lettres à une seule lettre avec deux symboles, les remplace par 0(effectuée car le passage à une valeur non numérique nécessiterait des guillemets), puis récupère la .lengthchaîne résultante.

Cas de test

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
la source
Je ne connais pas bien PowerShell, mais avez-vous vraiment besoin de parenthèses [prtc]h?
Jordanie
@ Jordan Non, je ne le fais pas. Ce n'est pas une chose PowerShell, c'est une chose moi-pas-bon-à-regex. : D Merci pour le golf!
AdmBorkBork
2

V , 31 octets

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

Essayez-le en ligne ou vérifiez tous les cas de test!

Cela contient des caractères non imprimables, donc voici un 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
la source
2

PHP, 56 octets

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);
Jörg Hülsermann
la source
1
Je crois que les [dfl]{2}matchs df, ldetc., ainsi que ses matchs prévus. dd|ff|llest la même longueur.
ETHproductions
1
Je sais que votre croyance est vraie mais je pense que votre croyance n´est pas un type de croyance. cela ressemble plus à un type de connaissance
Jörg Hülsermann
1
Au lieu de echo(espace à la fin), utilisez <?=, ce qui économise 2 octets. En outre, le $tn'est pas nécessaire là-bas, vous économisant 3 octets de plus.
Ismael Miguel
Thnak You Ismael. Je dois être plus qu'un peu confus que je ne supprime pas le $ t
Jörg Hülsermann le
2

Java 7, 156 73 octets

Charges d'octets enregistrés grâce à @ OlivierGrégoire .

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

Ungolfed & cas de test:

Essayez ici.

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"));
  }
}

Sortie:

8
6
3
50
3
5
7
Kevin Cruijssen
la source
Vous importez et vous n'utilisez pas Matcherdirectement? : o En outre, Matcherpeut être défini dans la boucle for.
Olivier Grégoire
1
J'ai le fort sentiment que return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()c'est beaucoup, beaucoup plus court. Cela ne peut pas fonctionner?
Olivier Grégoire
Eh bien, oui, cela fonctionne et il s’agit de 73 octets pour la version Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). Et seulement 51 pour la version Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire le
1
@ OlivierGrégoire Merci. Le Matcherétait un accident. Je l'ai eu correctement dans le code de test, mais pas dans le code de golf.>.> Vos replaceAlltravaux fonctionnent mieux, merci.
Kevin Cruijssen
1

R, 54 octets

Très similaire aux autres réponses. Correspond à n'importe laquelle des lettres de caractères et les remplace par @, puis compte le nombre de caractères. Lit les entrées de stdin. Utilise l'option ignore.case = TRUE(troisième argument de gsub) pour faire correspondre les majuscules et les minuscules.

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

Prime

Les deux gsubet ncharsont vectorisés, ce qui signifie que cela fonctionne également sur un vecteur de caractère, par exemple:

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

produit:

[1]  8  6  3 50  3  5  7
Billywob
la source
0

XQuery, 77 octets

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

tcl, 71

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

démo

sergiol
la source