Как посчитать буквы в Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogogoch?
print(len('Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch'))
Говорит 58
Ну, если бы это было так просто, я бы не спрашивал тебя, не так ли ?!
Википедия говорит (https://en.wikipedia.org/wiki/Llanfairpwllgwyngyll#Placename_and_toponyname_and_toponymy)
Полная форма названия - это самое длинное географическое название в Соединенном Королевстве и одно из самых длинных в мире, состоящее из 58 символов (51 буква, поскольку ch и ll являются диграфами, и на валлийском языке они рассматриваются как отдельные буквы). .
Я хочу посчитать это и получить ответ 51.
Оки Доки.
print(len(['Ll','a','n','f','a','i','r','p','w','ll','g','w','y','n','g','y','ll','g','o','g','e','r','y','ch','w','y','r','n','d','r','o','b','w','ll','ll','a','n','t','y','s','i','l','i','o','g','o','g','o','g','o','ch']))
51
Да, но это обман, очевидно, я хочу использовать слово в качестве ввода, а не список.
В Википедии также говорится, что диграфы на валлийском языке - это ch, dd, ff, ng, ll, ph, rh, th
https://en.wikipedia.org/wiki/Welsh_orthography#Digraphs
Итак, поехали. Сложим длину, а затем снимем двойной счет.
word='Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch'
count=len(word)
print('starting with count of',count)
for index in range(len(word)-1):
substring=word[index]+word[index+1]
if substring.lower() in ['ch','dd','ff','ng','ll','ph','rh','th']:
print('taking off double counting of',substring)
count=count-1
print(count)
Это заводит меня так далеко
starting with count of 58
taking off double counting of Ll
taking off double counting of ll
taking off double counting of ng
taking off double counting of ll
taking off double counting of ch
taking off double counting of ll
taking off double counting of ll
taking off double counting of ll
taking off double counting of ch
49
Похоже, я тогда вычел слишком много. Я должен получить 51. Теперь одна проблема в том, что с llll
он нашел 3 ll
и снял три вместо двух. Так что это нужно исправить. (Не должно перекрываться.)
А тут еще одна проблема. ng
. Википедия ничего не говорит о том, что в имени есть буква ng, но она указана как один из диграфов на странице, которую я цитировал выше.
Википедия дает нам еще одну подсказку: может потребоваться дополнительная информация, чтобы отличить настоящий диграф от сопоставления букв. И это дает пример llongyfarch, где ng - это просто сопоставление букв, и llong, где это орграф.
Таким образом, кажется, что «Llanfairpwllgwy ng yllgogerychwyrndrobwllllantysiliogogogoch» - одно из тех слов, где -ng- - это просто сочетание букв.
И, очевидно, компьютер не может это узнать. Так что мне придется предоставить ему дополнительную информацию, о которой говорит Википедия.
Так или иначе, я решил поискать в онлайн-словаре http://geiriadur.ac.uk/gpc/gpc.html, и вы увидите, что если вы посмотрите llongyfarch (пример из Википедии, в котором есть сопоставление букв), он отобразит его с вертикальной линией между n и g, но если вы посмотрите вверх, он этого не сделает.
Итак, я решил, что хорошо, что нам нужно сделать, это предоставить дополнительную информацию, поместив |
во входную строку, как это делается в словаре, просто чтобы алгоритм знал, что бит ng
на самом деле состоит из двух букв. Но, очевидно, я не хочу, чтобы сама |
считалась буквой.
Итак, теперь у меня есть эти данные:
word='llong'
ANSWER NEEDS TO BE 3 (ll o ng)
word='llon|gyfarch'
ANSWER NEEDS TO BE 9 (ll o n g y f a r ch)
word='Llanfairpwllgwyn|gyllgogerychwyrndrobwllllantysiliogogogoch'
ANSWER NEEDS TO BE 51 (Ll a n f a i r p w ll g w y n g y ll g o g e r y ch w y r n d r o b w ll ll a n t y s i l i o g o g o g o ch)
и еще этот список орграфов:
['ch','dd','ff','ng','ll','ph','rh','th']
и правила будут такими:
игнорировать регистр
если вы видите орграф, засчитайте его как 1
работайте слева направо, чтобы
llll
былоll
+ll
, а неl
+ll
+l
если вы видите
|
, не считайте его, но вы не можете полностью игнорировать его, он должен перестатьng
быть диграфом
и я хочу, чтобы он считал его 51 и делал это по правильным причинам, а не просто случайно.
Теперь я получаю 51, но он ошибается, потому что он считает |
как букву (1 слишком высокий), а затем вылетает слишком много с llll
(1 слишком мало) - ОШИБКИ ОТМЕНА
Становится llong
правильно (3).
Неправильно llon|gyfarch
(10) - снова считая |
Как я могу это исправить?
count=count-1
, не могли бы вы добавитьindex=index+1
, чтобы пропустить следующую букву? - person rhavelka   schedule 21.08.2020"ch dd ff ng ll ph rh th |".Split().ToList().ForEach(a => sb.Replace(a, a == "|" ? ".": "")); //sb is a stringbuilder
- просто замените каждый из диграфов символом, которого нет в строке, и, наконец, замените|
ничем; результирующая длина - это ваша строка. Не разработчик python, но должен работать тот же процесс, чтобы заменить двойные на одиночные .. - person Caius Jard   schedule 22.08.2020