Wie lang ist ein walisisches Wort?

37

Schreiben Sie ein Programm oder eine Funktion, die als Eingabe eine Zeichenfolge empfängt, die ein walisisches Wort darstellt (UTF-8, sofern von Ihnen nicht anders angegeben).

Folgendes sind alle Einzelbuchstaben auf Walisisch:

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

Wikipedia zitieren ,

Während die Digraphen ch , dd , ff , ng , ll , ph , rh , th jeweils mit zwei Symbolen geschrieben sind, werden sie alle als einzelne Buchstaben betrachtet. Dies bedeutet zum Beispiel, dass Llanelli (eine Stadt in Südwales) nur sechs Buchstaben auf Walisisch hat, verglichen mit acht Buchstaben auf Englisch.

Diese Buchstaben gibt es auch auf Walisisch, sie sind jedoch auf Fachwörterbücher beschränkt, die aus anderen Sprachen entlehnt wurden:

k, q, v, x, z

Buchstaben mit diakritischen Zeichen werden nicht als separate Buchstaben betrachtet, aber Ihre Funktion muss sie akzeptieren und zählen können. Mögliche solche Buchstaben sind:

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

(Dies bedeutet, dass ASCII keine akzeptable Eingabecodierung ist, da diese Zeichen nicht codiert werden können.)

Anmerkungen:

  • Das ist Code Golf.
  • Sie müssen Wörter wie llongyfarch nicht berücksichtigen , in denen das ng kein Digraph ist, sondern zwei separate Buchstaben. Dieses Wort hat neun Buchstaben, aber Sie können es als acht falsch zählen. (Wenn Sie solche Wörter erklären können , ist das ziemlich beeindruckend, aber außerhalb des Rahmens dieser Herausforderung.)
  • Die Eingabe darf garantiert kein Leerzeichen enthalten (es sei denn, Sie bevorzugen es mit einer einzelnen nachgestellten Zeile (oder etwas Esoterischerem). In diesem Fall kann dies angegeben werden). Es wird sicher kein internes Leerzeichen geben.

Testfälle:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (wirklich 51, aber wir werden 50 zählen)
  • Tŷr, 3
  • Cymru, 5
  • Glyndŵr, 7
TRiG
quelle
4
Kann die Eingabe in Kleinbuchstaben erfolgen?
ETHproductions
15
Meine Frau, die Walisisch als Muttersprache spricht, würde empfehlen, das J in den Abschnitt "Ausgeliehene Buchstaben" aufzunehmen, da es eigentlich nicht Teil des Walisischen Alphabets ist
Rich Starkie
@RichStarkie Der Wikipedia-Artikel war in dieser Hinsicht etwas vage. Ich verstehe, dass j in geliehenen Wörtern verwendet wird, auch wenn es im Originalwort nicht vorhanden ist. Daher wird es phonologisch verwendet, was impliziert, dass es zu diesem Zeitpunkt in die Sprache integriert ist. Ich habe ähnliche Argumente über v auf Irisch gesehen. Es wird allgemein angenommen, dass es nicht Teil des irischen Alphabets ist, aber es gibt einige irische Namen, wie z. B. Ó Cuiv .
TRiG
1
Und eine Fußnote im walisischen Orthographieartikel listet mh , nh und ngh als Grapheme auf . Ich möchte eine Frage zur Linguistics SE stellen .
TRiG,
3
Schade, dass es zu spät ist; dieses dreifach glyphenartige "ngh" hätte es vielleicht etwas komplizierter gemacht.
Megaflop

Antworten:

6

05AB1E , 24 23 21 Bytes

Code:

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

Erläuterung:

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.

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Adnan
quelle
16

Netzhaut , 23 Bytes

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

Probieren Sie es online!

Sogar Regex.

user48538
quelle
Es ist wahrscheinlich meine Unkenntnis der Netzhaut, aber wo ist die Ausgabe der Länge des Eingabetextes? Die Dokumentation zu Retina scheint nicht zu erklären, wie das im Abschnitt "Online ausprobieren!" Seite? ˅.
Xaero Degreaz
2
Die Ausgabe ist implizit, da die einzige Zeile eine Übereinstimmungsstufe ist, die die Anzahl der Übereinstimmungen zurückgibt. Hier passt der reguläre Ausdruck zu jedem walisischen Buchstaben.
user48538
Durch diese Logik kann also jede Antwort, bei der die Länge im Code explizit genannt wird, gekürzt werden?
Xaero Degreaz
2
@XaeroDegreaz Retina ist eine der wenigen Sprachen, die Übereinstimmungen automatisch zählt und druckt. So funktioniert die Sprache Retina. Es ist nicht so, wie andere Sprachen funktionieren. Daher müssen diese Sprachen ihre Längenfunktionen explizit aufrufen, um die richtige Ausgabe zu erhalten.
Isaacg
Danke, ich verstehe jetzt. Nachdem ich mehr in die Dokumentation gelesen habe, sehe ich, dass die Standardstufe "Match" diese Ausgabe ausführt.
Xaero Degreaz
5

JavaScript (ES6), 44 Byte

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

Die triviale Antwort kann die kürzeste sein.

ETHproductions
quelle
5

BASH 52 50 (sed + wc) 41

-9 Danke an Jordan

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

Wenn Großbuchstaben erforderlich sind, muss dies iam Ende des sed-Befehls erfolgen. (Ich habe es weggelassen, weil alle "Einzelbuchstaben" in der Frage Kleinbuchstaben sind, obwohl einige Beispiele dies nicht tun).

Riley
quelle
1
Warum grep -o .|wc -lstatt wc -c?
Jordanien
wc -c zählt - bis - als zwei.
Riley
Ah, natürlich. FWIW Wenn Sie GNU oder BSD verwenden wc, können Sie -manstelle von Bytes Zeichen zählen.
Jordanien
Können Sie das cvon chinnen mit bewegen [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
Megaflop
2
Es ist eine Schande, ([dfl])\1würde länger dauern als dd|ff|ll. Nur ein weiterer Doppelkonsonant würde die clevere Version bevorzugen.
Toby Speight
4

Stroh , 30 58 35 33 Bytes

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

Ersetzen Sie jedes Vorkommen des regulären Ausdrucks durch 0und konvertieren Sie von unär zu dezimal.

Leider kann Straw keine Flaggen an Regex übergeben. Ich vergesse das ?flags:Konstrukt

Probieren Sie es online! (Der hinzugefügte Code dient zur Überprüfung aller Testfälle.)

TuxCrafting
quelle
Wie unterscheidet sich diese Sprache von so etwas wie Retina?
Downgoat
@ Downgoat Straw ist stapelbasiert: P
TuxCrafting
3

Python 3, 64 Bytes

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

Verwendet wieder Regex

Ideone es!

Beta-Zerfall
quelle
3

PowerShell v2 +, 52 50 48 Bytes

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

Tut ein -replaceauf alle Zwei-Symbol-Einzelbuchstaben, ändert sie in 0(getan, weil das Ändern zu einer Nicht-Ziffer Anführungszeichen erfordern würde), dann erhält .lengthdie sich ergebende Zeichenfolge.

Testfälle

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
quelle
Ich kenne PowerShell nicht, aber brauchen Sie wirklich die Klammern [prtc]h?
Jordanien
@Jordan Nein, ich nicht. Das ist keine PowerShell-Sache, das bin ich-nicht-gut-bei-Regex-Sache. : D Danke für den Golf!
AdmBorkBork
2

V , 31 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle!

Dies enthält einige nicht druckbare Zeichen, daher hier ein 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
quelle
2

PHP, 56 Bytes

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);
Jörg Hülsermann
quelle
1
Ich glaube , [dfl]{2}Streichhölzer df, ldetc. sowie die beabsichtigten Ergebnisse geführt . dd|ff|llist die gleiche Länge.
ETHproductions
1
Ich weiß, dass dein Glaube wahr ist, aber ich denke, dass dein Glaube keine Art von Glauben ist. Es sieht mehr aus als nur eine Art Wissen
Jörg
1
Anstelle von echo(Leerzeichen am Ende) wird verwendet <?=, was 2 Bytes spart. Außerdem ist das $tdort nicht nötig, wodurch Sie 3 weitere Bytes sparen.
Ismael Miguel
Thnak Sie Ismael. Ich muss mehr als ein wenig verwirrt sein, dass ich das $ t nicht entferne
Jörg Hülsermann
2

Java 7, 156 73 Bytes

Dank @ OlivierGrégoire werden viele Bytes gespeichert .

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

Ungolfed & Testfälle:

Probieren Sie es hier aus.

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

Ausgabe:

8
6
3
50
3
5
7
Kevin Cruijssen
quelle
Sie importieren und verwenden dann nicht Matcherdirekt? : o MatcherKann auch in der for-Schleife definiert werden.
Olivier Grégoire
1
Ich habe das starke Gefühl, dass return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()es viel, viel kürzer ist. Kann das nicht funktionieren?
Olivier Grégoire
Nun ja, es funktioniert und es sind 73 Bytes für die Java 7-Version ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). Und nur 51 für die Java 8-Version ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire
1
@ OlivierGrégoire Danke. Das Matcherwar ein Unfall. Ich hatte es richtig im Testcode, aber nicht im Golf-Code.>.> Dein replaceAllfunktioniert aber besser, danke.
Kevin Cruijssen
1

R, 54 Bytes

Sehr ähnlich zu den anderen Antworten. Stimmt mit einem der beiden Buchstaben überein und ersetzt sie durch @und zählt anschließend die Anzahl der Zeichen. Liest die Eingabe von stdin. Verwendet die Option ignore.case = TRUE(drittes Argument bis gsub), um sowohl Groß- als auch Kleinbuchstaben zu finden.

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

Bonus

Beide gsubund ncharsind vektorisiert, was bedeutet, dass dies auch für einen Zeichenvektor funktioniert, zB:

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

produziert:

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

XQuery, 77 Bytes

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

tcl, 71

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

Demo

Sergiol
quelle