Python - 字母算术谜题
如: 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 - 字母算术谜题的更多相关文章
- 字母算术的python算法
据说Google出过一道题目:WWWDOT – GOOGLE = DOTCOM. 其中每个字母代表一个数字,数字不能重复,而且最高位的数字不能为0. 像这样的谜题被称为cryptarithms或者字母 ...
- python实现算术表达式的词法语法语义分析(编译原理应用)
本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...
- Python浮点算术:争议和限制
浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数.举例而言,十进制的小数 0.125 等于 1/10 + 2/100 + 5/1000 ,同理,二进制的小数 0.001 等于0/2 + 0/4 ...
- 【编程的乐趣-用python解算法谜题系列】谜题一 保持一致
谜题一 保持一致 谜题 假设有一大群人排队等待观看棒球比赛.他们都是主场球迷,每个人都戴着队帽,但不是所有人都用同一种戴法,有些人正着戴,有些人反着戴. 假定你是保安,只有在全组球迷帽子戴法一致时才能 ...
- PYTHON实现算术表达式构造二叉树
LEETCOCE 224. Basic Calculator Implement a basic calculator to evaluate a simple expression string. ...
- Python学习-算术运算符,赋值运算符和复合运算符
算术运算符 常见的算术运算符有 : + 加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 - ...
- Python3中文教程
搜索 此文档来源自网络 安装 PYTHON❝ Tempora mutantur nos et mutamur in illis. (时光流转,吾等亦随之而变.) ❞ — 古罗马谚语 深入欢迎来到 Py ...
- Python算术运算符
Python 运算符 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4和5被称为操作数,"+"号为运算符. Python语言支持 ...
- python基础学习(二)注释和算术运算符
注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...
随机推荐
- iOS 如何随意的穿插跳跃,push来pop去
OS 如何随意的穿插跳跃,push来pop去 主题思想:如A.B.C.D 四个视图控制器 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A ...
- assembly打包实例
1.先在pom.xml文件中添加assembly打包插件 <build> <plugins> <plugin> <groupId>org.apache. ...
- hibernate异常:org.hibernate.NonUniqueObjectException
异常:org.hibernate.NonUniqueObjectException 提示:a different object with the same identifier value was a ...
- css3选择器:nth-child和nth-of-type之间的差别
<section> <p>我是第1个p标签</p> <p>我是第2个p标签</p> </section> 然后对应2个选择器对应 ...
- Linux服务器rsync自动备份
一.在 server 端配置 1. 编辑配置文件 #vi /etc/rsyncd.conf 添加下面的配置参数: uid = nobody # 该选项指定当该模块传输文件时守护进程应该具有的uid.默 ...
- LOOPS
LOOPS 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3853 递推 设dp[i][j]为(i,j)到终点期望的使用魔力值,mp[i][ ...
- LINQ 查询集合总的重复项
select new FMDS_FarmPlotNewInfo { FarmPlo ...
- Arrays.toString(a)--->将数组a的值转换为字符串
Arrays.toString(数组)是java内置类Arrays类的一个方法,具体查Api可知.因为数组是不可直接输出的,它的作用是将数组转换为字符串.其实用for循环也是可以做到的,只不过比for ...
- jQuery复习:第五章
一.表单应用 1.表单验证: 首先创建一个表单: <form method="post" action=""> <div class=&quo ...
- 四大类NoSQL数据库
http://blog.sina.com.cn/s/blog_636415010101945l.html 原文:http://blog.monitis.com/index.php/2011/05/22 ...