Як довго валлійське слово?


37

Напишіть програму або функцію, яка отримує у якості введення рядок, що представляє валлійське слово (UTF-8, якщо інше не вказано вами).

Нижче наведено всі одиничні букви валійською мовою:

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, го, ю, ш, у

Щоб цитувати Вікіпедію ,

У той час, як диграфи ch , dd , ff , ng , ll , ph , rh , th написані двома символами, всі вони вважаються єдиними літерами. Це означає, що, наприклад, Лланеллі (місто в Південному Уельсі) вважається лише шістьма літерами у валійській мові, порівняно з вісьмома літерами англійською мовою.

Ці листи також є у валлійській мові, хоча вони обмежені технічною лексикою, запозиченою з інших мов:

k, q, v, x, z

Листи з діакритикою не розглядаються як окремі букви, але ваша функція повинна їх приймати і вміти їх рахувати. Можливі такі листи:

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

(Це означає, що ASCII не є прийнятним кодуванням вводу, оскільки він не може кодувати ці символи.)

Примітки:

  • Це код гольфу.
  • Вам не доведеться рахувати такі слова, як llongyfarch , у яких ng - це не диграф, а дві окремі літери. Це слово має дев'ять букв, але ви можете неправильно рахувати його як вісім. (Якщо ви можете пояснити такі слова, це дивним чином, але поза сферою цього виклику.)
  • Гарантовано, що на вході не буде пробілів (якщо ви не віддасте перевагу одному осередковому рядку (або щось більш езотеричне), у цьому випадку це може бути надано). Звичайно, не буде внутрішнього простору.

Тестові приклади:

  • Лладудно, 8
  • Лланеллі, 6
  • Ріл, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (дійсно 51, але ми порахуємо 50)
  • Тŷр, 3
  • Кімру, 5
  • Гліндр, 7

4
Чи можна ввести дані в усіх малих літерах?
ETHproductions

15
Моя дружина, яка є носієм валійської мови, порекомендує J додати в розділ літер «Позичені», оскільки він насправді не є частиною валійської абетки
Rich Starkie

@RichStarkie Стаття Вікіпедії на цьому фронті була дещо невиразною. Я розумію, що j використовується в запозичених словах навіть тоді, коли його немає в початковому слові, тому він використовується фонологічно, що означає, що на цьому етапі він натуралізується в мові. Я бачив подібні аргументи щодо v в ірландській мові. Вважається, що він не є частиною ірландського алфавіту, але він існує в деяких ірландських назвах, таких як Ó Cuiv .
TRiG

1
А виноска у статті валлійської орфографії зазначає mh , nh та ngh як графеми . Методики, про які мені потрібно відкрити питання лінгвістику SE .
TRiG

3
Сором, що пізно; що потрійне гліфоване "ngh", можливо, зробило б це трохи складніше.
мегафлоп

Відповіді:


6

05AB1E , 24 23 21 байт

Код:

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

Пояснення:

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.

Використовує CP-1252 кодування . Спробуйте в Інтернеті!


16

Сітківка , 23 байти

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

Спробуйте в Інтернеті!

Навіть мургель.


Це, мабуть, моє незнання Retina, але де виведення довжини введеного тексту? Документація щодо Retina, схоже, не пояснює, як це працює у розділі "Спробуйте в Інтернеті!" сайт.
Xaero Degreaz

2
Вихід неявний, оскільки єдиний рядок - це етап відповідності, який повертає кількість збігів. Тут регулярний вираз відповідає кожному валлійському листу.
user48538

Отже, за цією логікою, то кожну відповідь нижче, де явно називається довжина в коді, можна скоротити?
Xaero Degreaz

2
@XaeroDegreaz Retina - одна з єдиних мов, яка автоматично підраховує відповідність і роздруковує їх. Так працює мова Retina, мова. Це не так, як працюють інші мови, і тому ці мови повинні чітко викликати свої функції довжини, щоб отримати правильний вихід.
isaacg

Дякую, я зараз розумію. Прочитавши детальніше документацію, я бачу, що цей етап "Збіг" виконує цей вихід.
Xaero Degreaz

5

JavaScript (ES6), 44 байти

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

Тривіальна відповідь може бути найкоротшою.


5

БАШ 52 50 (sed + wc) 41

-9 дякую Йордану

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

If uppercase letter are required this needs an i at the end of the sed command. (I left it out because all of the "single letters" in the question are lowercase even though some examples aren't).


1
Why grep -o .|wc -l instead of wc -c?
Jordan

wc -c counts â through ẁ as two.
Riley

Ah, of course. FWIW if you use GNU or BSD wc you can use -m to count characters instead of bytes.
Jordan

Can you move the c from ch in with the [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop

2
It's a shame ([dfl])\1 would longer than dd|ff|ll. Just one more doubled-consonant would favour the clever version.
Toby Speight

4

Straw, 30 58 35 33 bytes

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

Replace each occurence of the regex by 0, and convert from unary to decimal.

Sadly, Straw can't pass flags to regexs. I forget about the ?flags: construct

Try it online! (The added code is to verify all test cases)


How does this language differ from something like Retina?
Downgoat

@Downgoat Straw is stack-based :P
TuxCrafting


3

PowerShell v2+, 52 50 48 bytes

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

Does a -replace on all the two-symbol-single-letter letters, changes 'em to 0 (done because changing to a non-numeral would require quotes), then gets the .length of the resultant string.

Test cases

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

I'm not familiar with PowerShell, but do you really need the parentheses around [prtc]h?
Jordan

@Jordan No, I do not. That's not a PowerShell thing, that's a me-not-good-at-regex thing. :D Thanks for the golf!
AdmBorkBork

2

V, 31 bytes

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

Try it online, or Verify all test cases!

This contains some unprintable characters, so here is a 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 Bytes

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

1
I believe [dfl]{2} matches df, ld, etc. as well as its intended matches. dd|ff|ll is the same length.
ETHproductions

1
I know that your believe is true but I think that your believe s not a type of believe. it looks more than a type of kowledge
Jörg Hülsermann

1
Instead of echo(space at the end), use <?=, which saves 2 bytes. Also, the $t isn't necessary there, saving you 3 more bytes.
Ismael Miguel

Thnak You Ismael . I must be more then a little confused that I not remove the $t
Jörg Hülsermann

2

Java 7, 156 73 bytes

Loads of bytes saved thanks to @OlivierGrégoire.

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

Ungolfed & test cases:

Try it here.

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

Output:

8
6
3
50
3
5
7

You import and then you don't use Matcher directly? :o Also, Matcher can be defined in the for loop.
Olivier Grégoire

1
I have the strong feeling that return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length() is way, way shorter. Can't this work?
Olivier Grégoire

Well, yes, it works, and it's 73 bytes for the Java 7 version (int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). And only 51 for the Java 8 version (s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire

1
@OlivierGrégoire Thanks. The Matcher was an accident. I had it correctly in the test code, but not in the golfed code.. >.> Your replaceAll works better though, thanks.
Kevin Cruijssen

1

R, 54 bytes

Very similar to the other answers. Matches any of the two character letters and replaces them with @ and subsequently counts the number of characters. Reads input from stdin. Uses the option ignore.case = TRUE (third argument to gsub) to match both upper and lowercase characters.

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

Bonus

Both gsub and nchar are vectorized which means that this also works on a character vector, e.g.:

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

produces:

[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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.