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. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...
随机推荐
- DUIlib使用Fastreport--报表简单使用
fastreport是一个简单优秀的报表,fastreport更多是和delphi联合使用预览和打印数据的.我在开始使用duilib做项目时,打印和数据预览都是自己绘制的,这样不仅绘制麻烦费事费事,而 ...
- 4、Xcode8中的钥匙串保存数据取出时候为空的问题
Xcode7以及之前的版本直接使用Keychain存储数据即可,但是从Xcode8开始,再用之前的方法会发现,读取不到存进去的数据了,或者说,存储不进去了,原因是苹果加强了隐私保护,这个东西需要打开开 ...
- incomplete type is not allowed
keil环境下,报错#70: incomplete type is not allowed,解决 mqtt_conf.h 定义了一个结构体 mqtt_buffer.h #include <std ...
- Redis字符串类型相关操作命令
string是redis最基本的类型,可以包括任何类型数据,如jpg图片或者序列化对象. 单个value最大上限是1G字节 如果只使用string类型,redis就可以被看做具有持久化特性的memca ...
- NIC Bonding: 2 nic port as 1 interface
The following is concluded from here. Consider we have 2 interfaces: eth0 & eth1 bond the two in ...
- js的日期、定时器
第一.js的日期 js的日期是用内置对象Date来操作,首先先创建一个日期 var date=new Date();,然后就可以调用它的API来获取年月日.时分秒等等,这不是本文重点,本文重点讲如何把 ...
- Items divided
Items divided 题目链接:http://acm.xidian.edu.cn/problem.php?id=1183 参考:http://www.cnblogs.com/wanghetao/ ...
- 转换成maven时报错
转自:将项目加入maven管理时报错 将项目加入maven管理时报错: Convert to maven project: An internal error occurred during: “En ...
- JavaScript的BOM(浏览器对象)基础语法总结
1.window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 2.history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. ...
- C#字符串转INT
Convent.ToInt32(string ) 可以转化字符串 其他 * .tostring(); (int ) char //强制类型转换 不能转化字符串