字謎程式 python

2021-06-21 04:07:27 字數 2222 閱讀 5427

最近學習python,看到了別人寫的乙個求解字謎的程式,十分精簡,充分應用了python的itertools模組,也體現其特有的語法。這裡我稍作修改後,把每段**都做了詳細注釋,適合初學者閱讀

#coding=utf-8

'''字謎程式 如:

hawaii + idaho + iowa + ohio == states

其中每個總目對應數字,上式的解為

510199 + 98153 + 9301 + 3593 == 621246

採用窮舉方式求解

1.通過re.findall()函式找到謎題中的所有字母

2.使用集合和set()函式找到謎題出現的所有不同的字母

3.通過assert語句檢查是否有超過10個的不同的字母 (意味著謎題無解)

4.通過乙個生成器物件將字元轉換成對應的ascii碼值

5.使用itertools.permutations()函式計算所有可能的解法

6.使用translate()字串方法將所有可能的解轉換成python表示式

7.使用eval()函式通過求值python 表示式來檢驗解法

8.返回第乙個求值結果為true的解法

具體可參見

'''

import re

import itertools

def solve(puzzle):

# upper把字元全部轉化為大寫字母

words = re.findall('[a-z]+', puzzle.upper())

#  集合set 是裝有獨特值的無序「袋子」。如果有兩個集合,則可以執行像聯合、交集以及集合求差等標準集合運算。

#   如:a_set.intersection(b_set)

# 'tag'.join(s)以tag連線字串s    s.split('tag')以tag拆分字串

unique_characters = set(''.join(words))

# 當表示式結果不成立時,assertionerror異常被丟擲,並列印資訊

assert len(unique_characters) <= 10, 'too many letters'

# 採用生成器表示式,取出所有單詞首字母到set集合中

# 生成器表示式返回迭代器,呼叫 next(gen) 返回迭代器的下乙個值,可以將生成器表示式 list(),set()等來迭代所有的值返回列表或者集合。

# ord(c)為返回c字元的ascii數值

# 生成器表示式取代列表解析可以同時節省cpu 和 記憶體(ram)

first_letters =

n = len(first_letters)

#  unique_characters - first_letters表示剔除unique_characters 中的first_letters

#     \表示連線下一行

sorted_characters = ''.join(first_letters) + \

''.join(unique_characters - first_letters)

characters = tuple(ord(c) for c in sorted_characters)

digits = tuple(ord(c) for c in '0123456789')

zero = digits[0]

# itertools.permutations(a,2)返回所有a序列2排列情況的迭代器

for guess in itertools.permutations(digits, len(characters)):

if zero not in guess[:n]:

#             translate為字元翻譯 >>>'mark'.translate()   >>>『mork』

#             dict為字典,無序鍵值對

#             zip為交替返回兩個序列

equation = puzzle.translate(dict(zip(characters, guess)))# 是**的,只用於對信任的表示式求解

if eval(equation):

return equation

if __name__ == '__main__':

solution = solve('send + more == money')

if solution:

print(solution)

猜字謎遊戲

include include include int main void printf 請輸入四個不重複的數字 n for else printf da db m,n 猜數字 系統在0 9中隨機生成不重複四個數排列成四位數,然後讓猜數者每次通過從0 9中任選四個數字來猜使用的是哪四個數字和這四個數...

LeetCode 字謎分組

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 思路 使用乙個map和multiset進行維護,用multiset讀入每乙個字串,看是否在map中...

歷屆試題 猜字謎

村的元宵節燈會上有一迷題 請猜謎 請猜謎 請邊賞燈邊猜 小明想,一定是每個漢字代表乙個數字,不同的漢字代表不同的數字。請你用計算機按小明的思路算一下,然後提交 請猜謎 三個字所代表的整數即可。請嚴格按照格式,通過瀏覽器提交答案。注意 只提交乙個3位的整數,不要寫其它附加內容,比如 說明性的文字。思路...