¿Cuánto dura una palabra galesa?


37

Escriba un programa o función que reciba como entrada una cadena que representa una palabra galesa (UTF-8 a menos que usted especifique lo contrario).

Las siguientes son todas letras individuales en 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 Wikipedia ,

Si bien los dígrafos ch , dd , ff , ng , ll , ph , rh , th están escritos con dos símbolos, todos se consideran letras individuales. Esto significa, por ejemplo, que Llanelli (una ciudad en el sur de Gales) solo tiene seis letras en galés, en comparación con ocho letras en inglés.

Estas letras también existen en galés, aunque están restringidas al vocabulario técnico prestado de otros idiomas:

k, q, v, x, z

Las letras con signos diacríticos no se consideran letras separadas, pero su función debe aceptarlas y poder contarlas. Posibles tales letras son:

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

(Esto significa que ASCII no es una codificación de entrada aceptable, ya que no puede codificar estos caracteres).

Notas:

  • Este es el código de golf.
  • No tiene que dar cuenta de palabras como llongyfarch , en las que ng no es un dígrafo, sino dos letras separadas. Esta palabra tiene nueve letras, pero puedes contarla erróneamente como ocho. (Si puede explicar esas palabras, es algo increíble, pero está fuera del alcance de este desafío).
  • Se garantiza que la entrada no tendrá espacios en blanco (a menos que lo prefiera con una nueva línea final (o algo más esotérico), en cuyo caso puede proporcionarse). Ciertamente no habrá espacios en blanco internos.

Casos de prueba:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (realmente 51, pero contaremos 50)
  • Tŷr, 3
  • Cymru, 5
  • Glyndŵr, 7

44
¿Se puede dar la entrada en minúsculas?
ETHproductions

15
Mi esposa, que es hablante nativa de Gales, recomendaría que se agregue la J en la sección de letras "prestadas", ya que en realidad no forma parte del alfabeto galés
Rich Starkie

@RichStarkie El artículo de Wikipedia fue un poco vago en ese frente. Tengo entendido que j se usa en palabras prestadas incluso cuando no está presente en la palabra original, por lo que se usa fonológicamente, lo que implica que en esta etapa está naturalizado en el idioma. He visto argumentos similares sobre v en irlandés. Se considera ampliamente que no forma parte del alfabeto irlandés, pero existe en algunos nombres irlandeses, como Ó Cuiv .
TRiG

1
Y una nota al pie del artículo de ortografía galesa enumera mh , nh y ngh como grafemas . Creo que necesito abrir una pregunta sobre Linguistics SE .
TRiG

3
Es una pena que sea demasiado tarde; ese "ngh" de triple glifo podría haberlo hecho un poco más complicado.
megaflop

Respuestas:


6

05AB1E , 24 23 21 bytes

Código:

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

Explicación:

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.

Utiliza la codificación CP-1252 . Pruébalo en línea!


16

Retina , 23 bytes

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

Pruébalo en línea!

Incluso lloro regex.


Probablemente sea mi ignorancia de Retina, pero ¿dónde está la salida de la longitud del texto de entrada? La documentación sobre Retina no parece explicar cómo funciona eso en "Pruébelo en línea". sitio.
Xaero Degreaz

2
El resultado es implícito, porque la única línea es una etapa Match, que devuelve el número de coincidencias. Aquí, la expresión regular coincide con cada letra galesa.
user48538

Entonces, según esa lógica, ¿se puede acortar cada respuesta a continuación donde se llama explícitamente la longitud en el código?
Xaero Degreaz

2
@XaeroDegreaz Retina es uno de los únicos idiomas que cuenta automáticamente las coincidencias y las imprime. Así es como funciona Retina, el idioma. No es cómo funcionan otros idiomas, por lo que esos idiomas necesitan llamar explícitamente a sus funciones de longitud para obtener la salida correcta.
isaacg

Gracias, ahora entiendo. Después de leer más en la documentación, veo que la etapa predeterminada "Match" realiza esta salida.
Xaero Degreaz

5

JavaScript (ES6), 44 bytes

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

La respuesta trivial puede ser la más corta.


5

BASH 52 50 (sed + wc) 41

-9 gracias a Jordan

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

Si se requieren letras mayúsculas, esto necesita un ial final del comando sed. (Lo dejé fuera porque todas las "letras simples" en la pregunta son minúsculas, aunque algunos ejemplos no lo son).


1
¿Por qué en grep -o .|wc -llugar de wc -c?
Jordan

wc -c cuenta â hasta ẁ como dos.
Riley

Ah, por supuesto. FWIW si usa GNU o BSD wc, puede usar -mpara contar caracteres en lugar de bytes.
Jordan

¿Puedes mover el cde chadentro con el [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop

2
Es una pena ([dfl])\1más tiempo que dd|ff|ll. Solo una consonante doble más favorecería la versión inteligente.
Toby Speight

4

Paja , 30 58 35 33 bytes

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

Reemplaza cada ocurrencia de la expresión regular por 0, y convierte de unario a decimal.

Lamentablemente, Straw no puede pasar banderas a expresiones regulares. Me olvido de la ?flags:construcción

Pruébalo en línea!(El código agregado es para verificar todos los casos de prueba)


¿Cómo difiere este lenguaje de algo como Retina?
Downgoat

@Downgoat Straw está basado en la pila: P
TuxCrafting


3

PowerShell v2 +, 52 50 48 bytes

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

¿Hace una -replaceen todas las letras de una sola letra de dos símbolos, las cambia a 0(hecho porque cambiar a una no numérica requeriría comillas), luego obtiene el.length de la cadena resultante.

Casos de prueba

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

No estoy familiarizado con PowerShell, pero ¿realmente necesitas los paréntesis [prtc]h?
Jordan

@ Jordan No, no lo hago. Eso no es una cosa de PowerShell, eso es algo que no soy bueno en expresiones regulares. : D Gracias por el golf!
AdmBorkBork


2

PHP, 56 bytes

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

1
Creo [dfl]{2}coincidencias df, ldetc., así como sus coincidencias previstas. dd|ff|lles de la misma longitud
ETHproductions

1
Sé que tu creencia es verdadera, pero creo que tu creencia no es un tipo de creencia. parece más que un tipo de kowledge
Jörg Hülsermann

1
En lugar de echo(espacio al final), use <?=, que ahorra 2 bytes. Además, $tno es necesario allí, lo que le ahorra 3 bytes más.
Ismael Miguel

Thnak You Ismael. Debo estar más que un poco confundido de que no elimine el $ t
Jörg Hülsermann

2

Java 7, 156 73 bytes

Un montón de bytes guardados gracias a @ OlivierGrégoire .

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

Sin golf y casos de prueba:

Pruébalo aquí

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

Salida:

8
6
3
50
3
5
7

¿Importas y luego no las usas Matcherdirectamente? : o Además, Matcherse puede definir en el bucle for.
Olivier Grégoire

1
Tengo la fuerte sensación de que return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()es mucho más corto. ¿No puede funcionar esto?
Olivier Grégoire

Bueno, sí, funciona, y son 73 bytes para la versión Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). Y solo 51 para la versión Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire

1
@ OlivierGrégoire Gracias. El Matcherfue un accidente. Lo tenía correctamente en el código de prueba, pero no en el código de golf ..>.> Sin replaceAllembargo, funciona mejor, gracias.
Kevin Cruijssen

1

R, 54 bytes

Muy similar a las otras respuestas. Coincide con cualquiera de las letras de dos caracteres y las reemplaza por, @y posteriormente cuenta el número de caracteres. Lee la entrada de stdin. Utiliza la opción ignore.case = TRUE(tercer argumento para gsub) para que coincida con los caracteres en mayúscula y minúscula.

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

Prima

Ambos gsuby ncharestán vectorizados, lo que significa que esto también funciona en un vector de caracteres, por ejemplo:

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 bytes

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.