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
źródło
Odpowiedzi:
05AB1E ,
242321 bajtówKod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
Siatkówka , 23 bajty
Wypróbuj online!
Nawet regex moar.
źródło
JavaScript (ES6), 44 bajty
Trywialna odpowiedź może być najkrótsza.
źródło
BASH
52 50(sed + wc) 41-9 dzięki Jordanowi
Jeśli wymagana jest wielka litera, musi to znajdować się
i
na 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ą).źródło
grep -o .|wc -l
zamiastwc -c
?wc
, możesz użyć-m
do liczenia znaków zamiast bajtów.c
zch
wz[prt]
?sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
([dfl])\1
byłoby dłużej niżdd|ff|ll
. Jeszcze jedna podwójna spółgłoska sprzyjałaby sprytnej wersji.Słoma ,
30583533 bajtówZamień każde wystąpienie wyrażenia regularnego na
0
i przekonwertuj z unary na decimal.Niestety, Słoma nie może przekazywać flag do wyrażeń regularnych.Zapomniałem o?flags:
konstrukcjiWypróbuj online! (Dodany kod służy do weryfikacji wszystkich przypadków testowych)
źródło
Python 3, 64 bajty
Ponownie używa wyrażenia regularnego
Ideone to!
źródło
PowerShell v2 +,
525048 bajtówWykonuje a
-replace
na wszystkich literach składających się z dwóch symboli i jednej litery, zmienia je na0
(zrobione, ponieważ zmiana na postać nieliczbową wymagałaby cudzysłowów), a następnie pobiera.length
wynikowy ciąg.Przypadki testowe
źródło
[prtc]h
?V , 31 bajtów
Wypróbuj online lub Zweryfikuj wszystkie przypadki testowe!
Zawiera niektóre niedrukowalne znaki, więc oto zrzut heksowy:
źródło
PHP, 56 bajtów
źródło
[dfl]{2}
meczówdf
,ld
itp, a także zamierzonych wyników.dd|ff|ll
jest tej samej długości.echo
(spacja na końcu) użyj<?=
, co pozwala zaoszczędzić 2 bajty. Ponadto$t
nie jest to konieczne, co pozwala zaoszczędzić jeszcze 3 bajty.Java 7,
15673 bajtówMnóstwo bajtów zaoszczędzonych dzięki @ OlivierGrégoire .
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wydajność:
źródło
Matcher
bezpośrednio? : oMatcher
Można również zdefiniować w pętli for.return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()
jest o wiele krótszy. Czy to nie działa?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()
).Matcher
był wypadek. Miałem go poprawnie w kodzie testowym, ale nie w kodzie golfowym ..>.> TwojereplaceAll
prace są lepsze, dzięki.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 opcjiignore.case = TRUE
(trzeci argument dogsub
), aby dopasować zarówno wielkie, jak i małe litery.Premia
Zarówno
gsub
inchar
są wektorowy co oznacza, że działa to także w postaci wektorowej, np:produkuje:
źródło
Perl 6 , 36 bajtów
Wypróbuj online!
źródło
XQuery, 77 bajtów
źródło
tcl, 71
próbny
źródło
Perl 5 , 35 + 1 (
-p
) = 36 bajtówWypróbuj online!
źródło