Как долго валлийское слово?

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 , в которой нг - не орграф, а две отдельные буквы. Это слово состоит из девяти букв, но вы можете ошибочно считать его как восемь. (Если вы можете объяснить такие слова, это круто, но выходит за рамки этой задачи.)
  • У входа гарантированно не будет пробела (если вы не предпочитаете его с одним завершающим символом новой строки (или чем-то более эзотерическим), в этом случае это может быть предоставлено). Конечно, не будет внутреннего пробела.

Тестовые случаи:

  • Лландудно, 8
  • Лланелли, 6
  • Рил, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (на самом деле 51, но мы будем считать 50)
  • Тёр, 3
  • Cymru, 5
  • Глындара, 7
наряжать
источник
4
Можно ли вводить все строчные буквы?
ETHproductions
15
Моя жена, которая является носителем валлийского языка, порекомендовала бы, чтобы J был добавлен в раздел «Заимствованные» буквы, поскольку он фактически не является частью валлийского алфавита
Rich Starkie
@RichStarkie В этой статье Википедия была немного расплывчатой. Насколько я понимаю, j используется в заимствованных словах, даже если его нет в исходном слове, поэтому он используется фонологически, что подразумевает, что на данном этапе он переводится в язык. Я видел подобные аргументы о v на ирландском языке. Считается, что он не является частью ирландского алфавита, но существует в некоторых ирландских именах, таких как Ó Cuiv .
TRiG
1
И сноска в списках орфографии статьи уэльских мГна , пНа и NGH в graphems . Метинкс Мне нужно открыть вопрос по Linguistics SE .
TRiG
3
Позор, это слишком поздно; этот тройной глиф «нг», возможно, сделал его немного сложнее.
мегафлоп

Ответы:

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|.

Попробуйте онлайн!

Даже моар регулярное выражение.

user48538
источник
Вероятно, это мое невежество в отношении Retina, но где вывод длины введенного текста? Документация по Retina, похоже, не объясняет, как это работает в «Попробуй онлайн!» сайт.
Xaero Degreaz
2
Вывод неявный, потому что единственная строка - стадия соответствия, возвращающая количество совпадений. Здесь регулярное выражение соответствует каждой валлийской букве.
user48538 13.09.16
Таким образом, по этой логике, каждый ответ ниже, где длина явно вызывается в коде, может быть сокращен?
Xaero Degreaz
2
@XaeroDegreaz Retina - один из немногих языков, который автоматически считает совпадения и распечатывает их. Вот как работает Retina, язык. Это не то, как работают другие языки, и поэтому эти языки должны явно вызывать свои функции длины, чтобы получить правильный вывод.
Исаак
Спасибо, теперь я понимаю. После прочтения дополнительной документации я вижу, что стандартная стадия «Соответствие» выполняет этот вывод.
Xaero Degreaz
5

JavaScript (ES6), 44 байта

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

Тривиальный ответ может быть самым коротким.

ETHproductions
источник
5

BASH 52 50 (сед + туалет) 41

-9 спасибо Джордану

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

Если требуются заглавные буквы, это необходимо iв конце команды sed. (Я пропустил это, потому что все «отдельные буквы» в вопросе строчные, хотя некоторые примеры - нет).

Райли
источник
1
Почему grep -o .|wc -lвместо wc -c?
Джордан
wc -c считается от ẁ до ẁ как два.
Райли
Ах, конечно. FWIW, если вы используете GNU или BSD, wcвы можете использовать -mдля подсчета символов вместо байтов.
Джордан,
Можете ли вы переместить cиз chв с [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
мегафлоп
2
Обидно ([dfl])\1бы дольше dd|ff|ll. Еще одна двойная согласная предпочтет умную версию.
Тоби Спейт
4

Солома , 30 58 35 33 байта

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

Замените каждое вхождение регулярного выражения на 0и преобразуйте из унарного в десятичное.

К сожалению, Солома не может передавать флаги регулярным выражениям. Я забыл о ?flags:конструкции

Попробуйте онлайн! (Добавлен код для проверки всех тестовых случаев)

TuxCrafting
источник
Чем этот язык отличается от чего-то вроде Retina?
Downgoat
@Downgoat Straw основан на стеке: P
TuxCrafting,
3

Python 3, 64 байта

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

Снова использует регулярные выражения

Идео это!

Бета распад
источник
3

PowerShell v2 +, 52 50 48 байт

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

Делает -replaceна всех двухсимвольных однобуквенных буквах, заменяет их на 0(сделано потому, что для перехода к нецифровым потребуются кавычки), затем получает .lengthрезультирующую строку.

Контрольные примеры

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
источник
Я не знаком с PowerShell, но вам действительно нужны круглые скобки [prtc]h?
Иордания
@ Джордан Нет, не знаю. Это не вещь PowerShell, это вещь, в которой я не хорош в регулярных выражениях. : D Спасибо за гольф!
AdmBorkBork
2

PHP, 56 байт

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);
Йорг Хюльсерманн
источник
1
Я считаю , [dfl]{2}спички df, ldи т.д., а также его предполагаемые матчи. dd|ff|llтакой же длины.
ETHпродукция
1
Я знаю, что твоя вера верна, но я думаю, что твоя вера не является типом веры. это выглядит не просто чем-то вроде
Йорг Хюльсерманн,
1
Вместо echo(пробел в конце) используйте <?=, что экономит 2 байта. Кроме того, в $tэтом нет необходимости, экономя еще 3 байта.
Исмаэль Мигель
Спасибо, Измаил. Должно быть, я немного сбит с толку тем, что я не убрал $ t
Jörg Hülsermann
2

Java 7, 156 73 байта

Множество байтов сохранено благодаря @ OlivierGrégoire .

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

Ungolfed и тестовые случаи:

Попробуй это здесь.

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

Выход:

8
6
3
50
3
5
7
Кевин Круйссен
источник
Вы импортируете, а затем не используете Matcherнапрямую? Также Matcherможно определить в цикле for.
Оливье Грегуар
1
У меня есть сильное чувство, что return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()намного, намного короче. Разве это не может работать?
Оливье Грегуар
Ну, да, это работает, и это 73 байта для версии Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). И только 51 для версии Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Оливье Грегуар
1
@ OlivierGrégoire Спасибо. Это Matcherбыл несчастный случай. У меня это было правильно в тестовом коде, но не в коде для игры в гольф ..>.> Ваши replaceAllработы лучше, спасибо.
Кевин Круйссен
1

R, 54 байта

Очень похоже на другие ответы. Сопоставляет любую из двухсимвольных букв и заменяет их, @а затем подсчитывает количество символов. Читает ввод из стандартного ввода. Использует опцию ignore.case = TRUE(третий аргумент для gsub) для сопоставления как прописных, так и строчных букв.

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

бонус

Оба gsubи ncharвекторизованы, что означает, что это также работает на символьном векторе, например:

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

производит:

[1]  8  6  3 50  3  5  7
Billywob
источник
0

XQuery, 77 байт

declare variable$s external;count(tokenize($s,'[cprt]h|ff|dd|ll|ng|.','i'))-1
Kniffler
источник