Як порахувати літери в Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch?
print(len('Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch'))
Каже 58
Ну, якби це було так просто, я б не запитував вас, зараз би ?!
У Вікіпедії сказано ( https://en.wikipedia.org/wiki/Llanfairpwllgwyngyll#Placename_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
. У Вікіпедії нічого не сказано про те, що в назві є буква "нг", але вона вказана як один з диграфів на сторінці, яку я цитував вище.
Вікіпедія дає нам тут ще кілька підказок: "може знадобитися додаткова інформація, щоб відрізнити справжній диграф від зіставлення літер" . І це наводить приклад " llongyfarch ", де ng - це просто "зіставлення літер", і " llong ", де це диграф.
Отже, здається, що "Llanfairpwllgwy ng yllgogerychwyrndrobwllllantysiliogogogoch" - це одне з тих слів, де -ng- це лише "супровід букв".
І, очевидно, комп’ютер не може цього знати. Тож мені доведеться надати їй ту «додаткову інформацію», про яку говорить Вікіпедія.
Так чи інакше, я вирішив заглянути в Інтернет-словник http://geiriadur.ac.uk/gpc/gpc.html, і ви можете переконатися, що якщо ви подивитесь на llongyfarch (приклад з Вікіпедії, де є "зіставлення літер") він відображає його вертикальною лінією між n і g, але якщо ви шукаєте "llong", то це не робить.
Тож я вирішив, що нам потрібно зробити, це надати додаткову інформацію, ввівши |
рядок введення, як це робиться у словнику, щоб алгоритм знав, що 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) - відлік |
знову
Як я можу це виправити правильно?