Jak długie jest walijskie słowo?

37

Napisz program lub funkcję, która odbiera jako wejście ciąg znaków reprezentujący walijskie słowo (UTF-8, chyba że określiłeś inaczej).

Wszystkie poniższe litery są w języku walijskim:

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, ty, u, w, y

Cytując Wikipedię ,

Podczas gdy każdy z digraphów ch , dd , ff , ng , ll , ph , rh , th jest zapisany dwoma symbolami, wszystkie są uważane za pojedyncze litery. Oznacza to na przykład, że Llanelli (miasto w południowej Walii) ma tylko sześć liter w języku walijskim, w porównaniu do ośmiu liter w języku angielskim.

Te litery istnieją również w języku walijskim, choć są ograniczone do słownictwa technicznego zapożyczonego z innych języków:

k, q, v, x, z

Litery z znakami diakrytycznymi nie są traktowane jako osobne litery, ale twoja funkcja musi je zaakceptować i być w stanie je policzyć. Możliwe takie litery to:

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

(Oznacza to, że ASCII nie jest dopuszczalnym kodowaniem wejściowym, ponieważ nie może kodować tych znaków.)

Uwagi:

  • To jest kod golfowy.
  • Nie musisz uwzględniać takich słów jak llongyfarch , w których ng nie jest wykresem, ale dwiema oddzielnymi literami. To słowo składa się z dziewięciu liter, ale można je przeliczyć na osiem. (Jeśli można wyjaśnić takich słów, to rodzaj niesamowite, ale poza zakres tego wyzwania.)
  • Dane wejściowe z pewnością nie mają spacji (chyba że wolisz je z pojedynczym końcowym znakiem nowej linii (lub czymś bardziej ezoterycznym), w którym to przypadku można to podać). Na pewno nie będzie wewnętrznych białych znaków.

Przypadki testowe:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (naprawdę 51, ale policzymy 50)
  • Tŷr, 3
  • Cymru, 5
  • Glyndŵr, 7
Wymuskany
źródło
4
Czy dane wejściowe można podawać małymi literami?
ETHprodukcje
15
Moja żona, która jest rodzimym walijskim mówcą, poleciłaby dodanie litery J w sekcji „Pożyczone” litery, ponieważ tak naprawdę nie jest to część walijskiego alfabetu
Rich Starkie
@RichStarkie Artykuł w Wikipedii był nieco niejasny w tej kwestii. Rozumiem, że j jest używane w zapożyczonych słowach, nawet jeśli nie występuje w oryginalnym słowie, więc jest używane fonologicznie, co oznacza, że ​​na tym etapie jest natualizowane w języku. Widziałem podobne argumenty na temat v w języku irlandzkim. Powszechnie uważa się, że nie należy do alfabetu irlandzkiego, ale istnieje w niektórych irlandzkich nazwach, takich jak Ó Cuiv .
TRiG
1
A przypis w walijskim artykule o ortografii wymienia mh , nh i ngh jako grafemy . Pomyślę, że muszę otworzyć pytanie dotyczące Linguistics SE .
TRiG
3
Szkoda, że ​​jest już za późno; to potrójne „glif” „ngh” mogło sprawić, że będzie to trochę bardziej skomplikowane.
megaflop

Odpowiedzi:

6

05AB1E , 24 23 21 bajtów

Kod:

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

Wyjaśnienie:

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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
16

Siatkówka , 23 bajty

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

Wypróbuj online!

Nawet regex moar.

użytkownik48538
źródło
Prawdopodobnie jest to moja ignorancja na temat siatkówki, ale gdzie wyprowadza się długość tekstu wejściowego? Dokumentacja Retina nie wyjaśnia, jak to działa w „Wypróbuj online!” teren.
Xaero Degreaz,
2
Dane wyjściowe są niejawne, ponieważ jedynym wierszem jest etap dopasowania, zwracający liczbę dopasowań. Tutaj regex pasuje do każdej walijskiej litery.
user48538
Tak więc dzięki tej logice każdą odpowiedź poniżej, w której długość jest jawnie wywołana w kodzie, można skrócić?
Xaero Degreaz,
2
@XaeroDegreaz Retina jest jednym z niewielu języków, który automatycznie zlicza mecze i drukuje je. Tak działa język Retina. Inne języki nie działają, więc języki te muszą jawnie wywoływać swoje funkcje długości, aby uzyskać właściwe wyniki.
isaacg
Dzięki, teraz rozumiem. Po przeczytaniu więcej w dokumentacji widzę, że domyślny etap „Dopasuj” wykonuje to wyjście.
Xaero Degreaz,
5

JavaScript (ES6), 44 bajty

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

Trywialna odpowiedź może być najkrótsza.

ETHprodukcje
źródło
5

BASH 52 50 (sed + wc) 41

-9 dzięki Jordanowi

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

Jeśli wymagana jest wielka litera, musi to znajdować się ina końcu polecenia sed. (Pominąłem to, ponieważ wszystkie „pojedyncze litery” w pytaniu są pisane małymi literami, chociaż niektóre przykłady nie są).

Riley
źródło
1
Dlaczego grep -o .|wc -lzamiast wc -c?
Jordan
wc -c liczy â – ẁ jako dwa.
Riley
Ach, oczywiście. FWIW, jeśli używasz GNU lub BSD wc, możesz użyć -mdo liczenia znaków zamiast bajtów.
Jordan
Można przenieść cz chwz [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop
2
Szkoda ([dfl])\1byłoby dłużej niż dd|ff|ll. Jeszcze jedna podwójna spółgłoska sprzyjałaby sprytnej wersji.
Toby Speight,
4

Słoma , 30 58 35 33 bajtów

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

Zamień każde wystąpienie wyrażenia regularnego na 0i przekonwertuj z unary na decimal.

Niestety, Słoma nie może przekazywać flag do wyrażeń regularnych. Zapomniałem o ?flags:konstrukcji

Wypróbuj online! (Dodany kod służy do weryfikacji wszystkich przypadków testowych)

TuxCrafting
źródło
Czym różni się ten język od Retina?
Downgoat
@Downgoat Straw jest oparty na stosie: P
TuxCrafting
3

Python 3, 64 bajty

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

Ponownie używa wyrażenia regularnego

Ideone to!

Rozpad beta
źródło
3

PowerShell v2 +, 52 50 48 bajtów

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

Wykonuje a -replacena wszystkich literach składających się z dwóch symboli i jednej litery, zmienia je na 0(zrobione, ponieważ zmiana na postać nieliczbową wymagałaby cudzysłowów), a następnie pobiera .lengthwynikowy ciąg.

Przypadki testowe

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
źródło
Nie znam PowerShell, ale czy naprawdę potrzebujesz nawiasów [prtc]h?
Jordan
@Jordan Nie, nie wiem. To nie jest sprawa PowerShell, to jest coś, co nie jest dobre w wyrażeniach regularnych. : D Dzięki za golfa!
AdmBorkBork
2

V , 31 bajtów

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

Wypróbuj online lub Zweryfikuj wszystkie przypadki testowe!

Zawiera niektóre niedrukowalne znaki, więc oto zrzut heksowy:

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
źródło
2

PHP, 56 bajtów

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);
Jörg Hülsermann
źródło
1
Wierzę [dfl]{2}meczów df, lditp, a także zamierzonych wyników. dd|ff|lljest tej samej długości.
ETHprodukcje
1
Wiem, że twoje przekonanie jest prawdziwe, ale myślę, że twoje przekonanie nie jest rodzajem wiary. wygląda więcej niż rodzaj niewiasty
Jörg Hülsermann
1
Zamiast echo(spacja na końcu) użyj <?=, co pozwala zaoszczędzić 2 bajty. Ponadto $tnie jest to konieczne, co pozwala zaoszczędzić jeszcze 3 bajty.
Ismael Miguel
Thnak You Ismael. Muszę być trochę zmieszany, że nie
usunę
2

Java 7, 156 73 bajtów

Mnóstwo bajtów zaoszczędzonych dzięki @ OlivierGrégoire .

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

Przypadki bez golfa i testy:

Wypróbuj tutaj.

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

Wydajność:

8
6
3
50
3
5
7
Kevin Cruijssen
źródło
Importujesz, a następnie nie używasz Matcherbezpośrednio? : o MatcherMożna również zdefiniować w pętli for.
Olivier Grégoire,
1
Mam silne przeczucie, że return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()jest o wiele krótszy. Czy to nie działa?
Olivier Grégoire,
Cóż, tak, działa i ma 73 bajty dla wersji Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). I tylko 51 dla wersji Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire,
1
@ OlivierGrégoire Thanks. To Matcherbył wypadek. Miałem go poprawnie w kodzie testowym, ale nie w kodzie golfowym ..>.> Twoje replaceAllprace są lepsze, dzięki.
Kevin Cruijssen
1

R, 54 bajty

Bardzo podobny do innych odpowiedzi. Dopasowuje dowolną z dwóch liter znakowych i zastępuje je, @a następnie liczy liczbę znaków. Odczytuje dane wejściowe ze standardowego wejścia. Używa opcji ignore.case = TRUE(trzeci argument do gsub), aby dopasować zarówno wielkie, jak i małe litery.

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

Premia

Zarówno gsubi ncharsą wektorowy co oznacza, że działa to także w postaci wektorowej, np:

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

produkuje:

[1]  8  6  3 50  3  5  7
Billywob
źródło
0

XQuery, 77 bajtów

declare variable$s external;count(tokenize($s,'[cprt]h|ff|dd|ll|ng|.','i'))-1
Kniffler
źródło
0

tcl, 71

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

próbny

sergiol
źródło