战胜参考答案从昨晚开始貌似就成了我最大的快乐。互锁词的生成要比昨天的回文词复杂一些,因为这意味着搜索的次数更多了。虽然都是用二分法搜索的思路,但我就是要比参考答案快接近30倍肿么破。至于为什么会这样,我没有研究,或许我应该仔细研究一下。
10万条的单词表里:二词互锁1254条,我用时1.4秒,参考答案用时39.1秒;三词互锁991条,我用时1.5秒,参考答案用时43.4秒。一箩筐的成就感啊啊啊啊啊啊啊~~~
Exercise 12: Two words “interlock” if taking alternating letters from each forms a new word. For example, “shoe” and “cold” interlock to form “schooled”. Solution: http://thinkpython2.com/code/interlock.py. Credit: This exercise is inspired by an example at http://puzzlers.org. Write a program that finds all pairs of words that interlock. Hint: don’t enumerate all pairs! Can you find any words that are three-way interlocked; that is, every third letter forms a word, starting from the first, second or third?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| import time
def in_bisect(library, first, last, myword): # 二分法搜索,10万数据查询最多只需不到20步
if first > last: # 这是一句拯救了我的条件
return -1
else:
mid = (first + last)//2
if myword == library[mid]:
return mid
elif library[mid] > myword:
return in_bisect(library, first, mid-1, myword)
else:
return in_bisect(library, mid+1, last, myword)
def interlock(library, i, num):
m = 0
n = num
while m < num:
if in_bisect(library, 0, len(library)-1, library[i][m::n]) == -1:
return False
else:
m += 1
n -+ 1
return True
count = 0
library = []
fin = open('words.txt')
for line in fin:
word = line.strip()
library.append(word)
library.sort()
start = time.time()
# for i in range(len(library)-1): # 二词互锁
# if interlock(library, i, 2):
# print(library[i], library[i][::2], library[i][1::2])
# count += 1
for i in range(len(library)-1): # 三词互锁
if interlock(library, i, 3):
print(library[i], library[i][::3], library[i][1::3], library[i][2::3])
count += 1
print(count)
end = time.time()
print(end - start)
# 1254, 1.3558001518249512 # 二词互锁 xrspook解法
# 1254, 39.10080027580261 # 二词互锁 参考答案
# 991, 1.4504001140594482 # 三词互锁 xrspook解法
# 991, 43.366000175476074 # 三次互锁 参考答案 |
import time
def in_bisect(library, first, last, myword): # 二分法搜索,10万数据查询最多只需不到20步
if first > last: # 这是一句拯救了我的条件
return -1
else:
mid = (first + last)//2
if myword == library[mid]:
return mid
elif library[mid] > myword:
return in_bisect(library, first, mid-1, myword)
else:
return in_bisect(library, mid+1, last, myword)
def interlock(library, i, num):
m = 0
n = num
while m < num:
if in_bisect(library, 0, len(library)-1, library[i][m::n]) == -1:
return False
else:
m += 1
n -+ 1
return True
count = 0
library = []
fin = open('words.txt')
for line in fin:
word = line.strip()
library.append(word)
library.sort()
start = time.time()
# for i in range(len(library)-1): # 二词互锁
# if interlock(library, i, 2):
# print(library[i], library[i][::2], library[i][1::2])
# count += 1
for i in range(len(library)-1): # 三词互锁
if interlock(library, i, 3):
print(library[i], library[i][::3], library[i][1::3], library[i][2::3])
count += 1
print(count)
end = time.time()
print(end - start)
# 1254, 1.3558001518249512 # 二词互锁 xrspook解法
# 1254, 39.10080027580261 # 二词互锁 参考答案
# 991, 1.4504001140594482 # 三词互锁 xrspook解法
# 991, 43.366000175476074 # 三次互锁 参考答案