如: SEND + MORE == MONEY

   9567  + 1085  == 10652

  • 字母和数字一一对应
  • 首字母不为0
解法:

import re
from itertools import permutations def solve(puzzle):
puzzle= puzzle.upper()
words = re.findall('[A-Z]+', puzzle)
unique_characters = set(''.join(words))
assert len(unique_characters) <= 10, 'Too many letters'
first_letters = {word[0] for word in words}
n = len(first_letters)
sorted_characters = ''.join(first_letters) + \
''.join(unique_characters - first_letters)
characters = tuple(ord(c) for c in sorted_characters)
digits = tuple(ord(str(c)) for c in range(10))
zero = digits[0]
for guess in permutations(digits, len(characters)):
if zero not in guess[:n]:
equation = puzzle.translate(dict(zip(characters, guess)))
if eval(equation):
return equation if __name__ == '__main__':
puzzle = "send + more == money"
try:
print(puzzle.upper())
solution = solve(puzzle)
if solution:
print(solution)
else:
print("Nothing match this")
except Exception as e:
print("Error: "+str(e))

几点说明:

itertools.permutations(iterable, r=None) -> 返回 从iterable中取出r个元素的有序组合 的迭代器

  例如:list( permutations([1,2,3], 2) ) ->  [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]  

类似的 itertools.combinations(iterable, r=None)  ->   有序组合  
  例如:list( combinations([1,2,3], 2) ) ->  [(1, 2), (1, 3), (2, 3)] 
str.translate(map) -> 按照map的对应关系进行字符替换
  map 一般为一个字典,其键和值都是ASCII字符的十进制表示,
    例如 "abc123".translate({97:65, 98:97}) -> 'Aac123'
  map可以通过str.maketrans()生成
    例如:str.maketrans('123', 'abc') -> {49: 97, 50: 98, 51: 99}
  本例中是通过ord、zip、dict的方式生成的
    zip(*iterables) -> 返回一个元组迭代器,
      例如: list( zip([1,2,3], 'abc') ) -> [(1, 'a'), (2, 'b'), (3, 'c')]
          list( zip('ABC', 'xy') ) -> [('A','x'), ('B', 'y')] 以少的为准
    ord(string) -> int
      例如: ord('a') -> 97 ord('1') -> 49
eval(expression, globals=None, locals=None) -> 把expression字符串解析为Python表达式(就是相当于去掉最外面一层引号)
  例如 eval('1+1') -> 2 、 eval('1+1==2') -> True 、 eval('"1+1"') -> "1+1"
  
  repr(object) 和eval正好相反,给对象加上一层引号 一般有 eval(repr(object)) == object   exec(object) 执行存储在字符串中的Python语句
    例如 exec('print("Hello")') -> Hello

  


Python - 字母算术谜题的更多相关文章

  1. 字母算术的python算法

    据说Google出过一道题目:WWWDOT – GOOGLE = DOTCOM. 其中每个字母代表一个数字,数字不能重复,而且最高位的数字不能为0. 像这样的谜题被称为cryptarithms或者字母 ...

  2. python实现算术表达式的词法语法语义分析(编译原理应用)

    本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...

  3. Python浮点算术:争议和限制

    浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数.举例而言,十进制的小数 0.125 等于 1/10 + 2/100 + 5/1000 ,同理,二进制的小数 0.001 等于0/2 + 0/4 ...

  4. 【编程的乐趣-用python解算法谜题系列】谜题一 保持一致

    谜题一 保持一致 谜题 假设有一大群人排队等待观看棒球比赛.他们都是主场球迷,每个人都戴着队帽,但不是所有人都用同一种戴法,有些人正着戴,有些人反着戴. 假定你是保安,只有在全组球迷帽子戴法一致时才能 ...

  5. PYTHON实现算术表达式构造二叉树

    LEETCOCE 224. Basic Calculator Implement a basic calculator to evaluate a simple expression string. ...

  6. Python学习-算术运算符,赋值运算符和复合运算符

    算术运算符 常见的算术运算符有 : +     加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 -   ...

  7. Python3中文教程

    搜索 此文档来源自网络 安装 PYTHON❝ Tempora mutantur nos et mutamur in illis. (时光流转,吾等亦随之而变.) ❞ — 古罗马谚语 深入欢迎来到 Py ...

  8. Python算术运算符

    Python 运算符 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4和5被称为操作数,"+"号为运算符. Python语言支持 ...

  9. python基础学习(二)注释和算术运算符

    注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...

随机推荐

  1. url地址数据转换成json数据格式

    var urlToJson = function(){ var ret = {}; window.location.search.substr(1).replace(/(\w+)=(\w+)/ig, ...

  2. 《C程序设计语言》 squeeze函数(从字符串s中删除字符c)

    squeeze void squeeze(char string[], int ch) { int i, j; ; string[i] != '\0'; i++) { if (string[i] != ...

  3. 每个Web开发者必备的9个软技能

    对于一份工作,你可能专注于修炼自己的内功,会在不自觉中忽视软技能.硬技能决定你是否能得到工作,而软技能能够表明你是否适合这份工作和适应工作环境等.所有的公司都有属于自己的文化,并努力将这些文化传承下去 ...

  4. 在java中json的使用案例

    import java.text.ParseException; import org.json.JSONArray; import org.json.JSONObject; public class ...

  5. Linux文件挂载命令mount

    在linux系统中硬盘.u盘.光驱等其他设备都需要挂载后才能正常使用.下面是对挂载命令mount使用方法的一些总结. 文件挂载命令mountmount [-t 文件系统类型][-L卷标名][-o特殊选 ...

  6. winsock编程IOCP模型实现代码

    winsock编程IOCP模型实现代码 话不多说,上代码.借鉴<windows核心编程>部分源码和CSDN小猪部分代码. stdafx.h依赖头文件: #include <iostr ...

  7. Python简记

    1.字符换行: print('ab \ncd \nef')

  8. 寻找中位数v1.0

    题目内容: 编写一个函数返回三个整数中的中间数.函数原型为: int mid(int a, int b, int c); 函数功能是返回a,b,c三数中大小位于中间的那个数. 输入格式: " ...

  9. C#中Invoke的用法

    在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫"打开",单击之后按钮上的文本显示 ...

  10. DOS下导入导出MySQL备份

    导入: 1. cd d:\mysql\bin #cd 到 mysql 的 bin 目录下 2. mysql -u root -p mysql_db_name < d:\mysql\data\ba ...