Quanto dura una parola gallese?


37

Scrivi un programma o una funzione che riceve come input una stringa che rappresenta una parola gallese (UTF-8 se non diversamente specificato da te).

Le seguenti sono tutte lettere singole in gallese:

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

Per citare Wikipedia ,

Mentre i digrafi ch , dd , ff , ng , ll , ph , rh , th sono scritti ciascuno con due simboli, sono tutti considerati come lettere singole. Ciò significa, ad esempio, che Llanelli (una città nel Galles del Sud) è considerato avere solo sei lettere in gallese, rispetto alle otto lettere in inglese.

Queste lettere esistono anche in gallese, sebbene siano limitate al vocabolario tecnico preso in prestito da altre lingue:

k, q, v, x, z

Le lettere con segni diacritici non sono considerate lettere separate, ma la tua funzione deve accettarle ed essere in grado di contarle. Possibili lettere di questo tipo sono:

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

(Ciò significa che ASCII non è una codifica di input accettabile, poiché non può codificare questi caratteri.)

Gli appunti:

  • Questo è il codice golf.
  • Non devi tenere conto di parole come llongyfarch , in cui ng non è un digrafo, ma due lettere separate. Questa parola ha nove lettere, ma puoi contarla erroneamente come otto. (Se riesci a spiegare queste parole, è fantastico, ma al di fuori dell'ambito di questa sfida.)
  • È garantito che l'input non abbia spazi bianchi (a meno che non lo si preferisca con una nuova riga finale (o qualcosa di più esoterico), nel qual caso può essere fornito). Non ci saranno certamente spazi bianchi interni.

Casi test:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (davvero 51, ma conteremo 50)
  • Per, 3
  • Cymru, 5
  • Glyndŵr, 7

4
L'ingresso può essere dato in minuscolo?
ETHproductions,

15
Mia moglie, che è di madrelingua gallese, consiglierebbe di aggiungere la J nella sezione delle lettere "prese in prestito" poiché in realtà non fa parte dell'alfabeto gallese
Rich Starkie,

@RichStarkie L'articolo di Wikipedia era un po 'vago su quel fronte. La mia comprensione è che j è usato nelle parole prese in prestito anche quando non è presente nella parola originale, quindi è usato fonologicamente, il che implica che in questa fase è natualizzato nella lingua. Ho visto argomenti simili su v in irlandese. È ampiamente considerato non parte dell'alfabeto irlandese, ma esiste in alcuni nomi irlandesi, come Ó Cuiv .
TRiG,

1
E una nota nelle liste articolo ortografia gallesi mh , nh , e ngh come graphems . Penso che devo aprire una domanda su Linguistics SE .
TRiG,

3
Peccato che sia troppo tardi; quel triplo glifo "ngh" avrebbe potuto renderlo un po 'più complicato.
megaflop,

Risposte:


6

05AB1E , 24 23 21 byte

Codice:

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

Spiegazione:

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.

Utilizza la codifica CP-1252 . Provalo online!


16

Retina , 23 byte

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

Provalo online!

Persino gemere regex.


Probabilmente è la mia ignoranza di Retina, ma dov'è l'output della lunghezza del testo di input? La documentazione su Retina non sembra spiegare come funziona nel "Provalo online!" posto.
Xaero Degreaz

2
L'output è implicito, poiché l'unica riga è una fase Match, che restituisce il numero di corrispondenze. Qui, la regex corrisponde a tutte le lettere gallesi.
user48538

Quindi, secondo quella logica, ogni risposta qui sotto in cui la lunghezza viene esplicitamente chiamata nel codice può essere ridotta?
Xaero Degreaz,

2
@XaeroDegreaz Retina è una delle uniche lingue che conta automaticamente le partite e le stampa. Ecco come funziona Retina, la lingua. Non è come funzionano le altre lingue, quindi quelle lingue devono chiamare esplicitamente le loro funzioni di lunghezza per ottenere il giusto risultato.
Isaacg,

Grazie, ora capisco. Dopo aver letto di più nella documentazione, vedo che lo stadio "Match" predefinito esegue questo output.
Xaero Degreaz,

5

JavaScript (ES6), 44 byte

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

La banale risposta potrebbe essere la più breve.


5

BASH 52 50 (sed + wc) 41

-9 grazie alla Giordania

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

Se sono richieste lettere maiuscole, è necessario un ialla fine del comando sed. (L'ho lasciato fuori perché tutte le "lettere singole" nella domanda sono minuscole anche se alcuni esempi non lo sono).


1
Perché grep -o .|wc -linvece di wc -c?
Giordania,

wc -c conta da â a ẁ come due.
Riley,

Ah certo. FWIW se usi GNU o BSD wcpuoi usare -mper contare i caratteri anziché i byte.
Giordania,

Puoi spostare cda chdentro con [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop,

2
È un peccato ([dfl])\1sarebbe più lungo di dd|ff|ll. Solo un'altra consonante raddoppiata favorirebbe la versione intelligente.
Toby Speight,

4

Paglia , 30 58 35 33 byte

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

Sostituisci ogni ricorrenza della regex con 0e converti da unario a decimale.

Purtroppo, Straw non può passare le bandiere ai regex. Dimentico il ?flags:costrutto

Provalo online! (Il codice aggiunto è per verificare tutti i casi di test)


In che modo questa lingua differisce da qualcosa come Retina?
Downgoat,

@Downgoat Straw è basato su stack: P
TuxCrafting,


3

PowerShell v2 +, 52 50 48 byte

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

Fa una -replacesu tutte le lettere a due simboli di una sola lettera, le cambia in 0(fatto perché passare a un non-numerale richiederebbe virgolette), quindi ottiene la .lengthstringa risultante.

Casi 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

Non ho familiarità con PowerShell, ma hai davvero bisogno delle parentesi in giro [prtc]h?
Giordania,

@Jordan No, non lo so. Non è una cosa di PowerShell, è una cosa che non sono bravo a regex. : D Grazie per il golf!
AdmBorkBork,

2

V , 31 byte

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

Provalo online o verifica tutti i casi di test!

Questo contiene alcuni caratteri non stampabili, quindi ecco 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@"

2

PHP, 56 byte

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);

1
Credo [dfl]{2}partite df, ldecc. Così come le partite previste. dd|ff|llè della stessa lunghezza.
ETHproductions,

1
So che il tuo credo è vero, ma penso che il tuo credo non sia un tipo di credo. sembra più di un tipo di
kowledge

1
Invece di echo(spazio alla fine), utilizzare <?=, che consente di risparmiare 2 byte. Inoltre, $tnon è necessario lì, risparmiando altri 3 byte.
Ismael Miguel,

Thnak You Ismael. Devo essere più che un po 'confuso di non rimuovere $ t
Jörg Hülsermann,

2

Java 7, 156 73 byte

Carichi di byte salvati grazie a @ OlivierGrégoire .

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

Casi non testati e test:

Provalo qui.

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

Produzione:

8
6
3
50
3
5
7

Importi e non usi Matcherdirettamente? : o Inoltre, Matcherpuò essere definito nel ciclo for.
Olivier Grégoire,

1
Ho la forte sensazione che return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()sia molto, molto più breve. Non può funzionare?
Olivier Grégoire,

Bene, sì, funziona, ed è 73 byte per la versione di Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). E solo 51 per la versione Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire,

1
@ OlivierGrégoire Grazie. È Matcherstato un incidente. L'ho avuto correttamente nel codice di prova, ma non nel codice di golf ..>.> replaceAllTuttavia, funziona meglio grazie.
Kevin Cruijssen,

1

R, 54 byte

Molto simile alle altre risposte. Corrisponde a una qualsiasi delle lettere di due caratteri e le sostituisce con @e successivamente conta il numero di caratteri. Legge input da stdin. Utilizza l'opzione ignore.case = TRUE(terzo argomento a gsub) per abbinare sia i caratteri maiuscoli che minuscoli.

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

indennità

Entrambi gsube ncharsono vettoriali, il che significa che funziona anche su un vettore di caratteri, ad esempio:

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

produce:

[1]  8  6  3 50  3  5  7


0

XQuery, 77 byte

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.