如何计算Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch中的字母?
print(len('Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch'))
说58
好吧,如果那是那么容易,我不会问你,现在可以吗?
维基百科说(https://en.wikipedia.org/wiki/Llanfairpwllgwyngyll#Placename_and_toponymy)
名称的长格式是英国最长的地名,也是世界上最长的地名之一,共58个字符(因为“ ch”和“ ll”是二字,所以为51个“字母”,在英文字母中被视为单个字母)。威尔士语)。
所以我想算一下,得到答案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://zh.wikipedia.org/wiki/威尔士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
s,然后取了3而不是2。因此,这将需要修复。(不得重叠。)
然后还有另一个问题。的ng
。Wikipedia并没有说名称中有字母“ ng”,但是在我上面引用的页面上,它被列为有向图之一。
Wikipedia在这里为我们提供了更多线索:“可能需要其他信息来区分真正的有向图和字母并列”。并给出了一个示例“ llongyfarch ”,其中ng只是一个“字母并置”,而“ llong ”则是一个有向图。
因此,似乎'Llanfairpwllgwy ng yllgogerychwyrndrobwllllantysiliogogogoch'是其中-ng-只是“字母并置”的那些单词之一。
显然,计算机无法知道这一点。因此,我将不得不提供Wikipedia所说的“其他信息”。
因此,无论如何,我决定查看在线词典http://geiriadur.ac.uk/gpc/gpc.html,您会发现,如果您查找llongyfarch(来自Wikipedia的示例,其具有“字母并置”)它会在n和g之间显示一条垂直线,但是如果您查找“ llong”,则不会执行此操作。
因此,我决定好了,我们需要做的是|
像在字典中那样,通过在输入字符串中放入a来提供其他信息,以使算法知道该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,并且出于正确的原因而做,而不仅仅是fl幸。
现在我得到51,但由于它算作|
一个字母(1太高)而使它起伏不定,然后它又由于(1太低)而脱落了一个太多的字母-ERRORS llll
CANCEL OUT
它是llong
正确的(3)。
它llon|gyfarch
出了错(10)-|
再计算一次
如何正确解决问题?