字母算术的python算法
据说Google出过一道题目:WWWDOT – GOOGLE = DOTCOM。
其中每个字母代表一个数字,数字不能重复,而且最高位的数字不能为0。
像这样的谜题被称为cryptarithms或者字母算术(alphametics)。字母可以拼出实际的单词,而如果你把每一个字母都用0–9中的某一个数字代替后, 也同样可以拼出一个算术等式。关键的地方是找出每个字母都映射到了哪个数字。每个字母所有出现的地方都必须映射到同一个数字,数字不能重复, 并且“单词”不能以0开始。
最著名的字母算术谜题是SEND + MORE = MONEY。
Raymond Hettinger写过一个令人难以置信的Python程序,这个程序只用14行代码来解决任何字母算术谜题。
代码见:http://woodpecker.org.cn/diveintopython3/advanced-iterators.html
不过该代码是python 3.x版本的,下面是我改过的可以在2.x版运行的代码:
# -*- coding : utf-8 -*-
# Copyright (c) 2009, Raymond Hettinger, All rights reserved.
# Ported to Python 2.x and modified by poboke.com import re
import itertools
import string def solve(puzzle): #匹配出所有字母,转为大写
words = re.findall('[A-Z]+', puzzle.upper()) #将字母放到集合里
unique_chars = set(''.join(words)) #因为数字只有10个,所以如果字母大于10个就会出错
assert len(unique_chars) <= 10, 'Too many letters' #将式子的首字母排到前面,方便判断首字母是否为0
first_letters = {word[0] for word in words}
n = len(first_letters)
sorted_chars = ''.join(first_letters) + \
''.join(unique_chars - first_letters) #所有数字
digits = '0123456789'
zero = digits[0] #获取所有数字的全排列
for guess in itertools.permutations(digits, len(sorted_chars)): #所有式子的首字母都不能为0
if zero not in guess[:n]: #将字母替换为数字
trans = string.maketrans(sorted_chars, ''.join(guess))
equation = puzzle.translate(trans) #如果数字式子的计算结果正确
if eval(equation):
print equation if __name__ == '__main__':
import sys
for puzzle in sys.argv[1:]:
print(puzzle)
solve(puzzle)
这个是python2的代码,如果是python3,需要修改
string.maketrans 为 str.maketrans
print加括号
执行结果如下:
poboke$ python alphametics.py "WWWDOT - GOOGLE == DOTCOM"
WWWDOT - GOOGLE == DOTCOM
777589 - 188103 == 589486
777589 - 188106 == 589483 poboke$ python alphametics.py "WWWDOT - POBOKE == DOTCOM"
WWWDOT - POBOKE == DOTCOM
666435 - 231397 == 435038
666435 - 231398 == 435037
666180 - 485893 == 180287
666180 - 485897 == 180283 poboke$ python alphametics.py "SEND + MORE == MONEY"
SEND + MORE == MONEY
9567 + 1085 == 10652 poboke$ python alphametics.py "SIX + SEVEN + SEVEN == TWENTY"
SIX + SEVEN + SEVEN == TWENTY
650 + 68782 + 68782 == 138214
字母算术的python算法的更多相关文章
- GitHub标星2.6万!Python算法新手入门大全
今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万.这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各 ...
- 安装Python算法库
安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Python算法(含源代码下载)
关键字:Python Algorithms Python算法 Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...
- python算法题 python123网站单元四题目
目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来) 下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...
- python算法介绍:希尔排序
python作为一种新的语言,在很多功能自然要比Java要好一些,也容易让人接受,而且不管您是成年人还是少儿都可以学习这个语言,今天就为大家来分享一个python算法教程之希尔排序,现在我们就来看看吧 ...
- Java && Python 算法面试常用类以及方法总结
数据结构 逻辑结构上: 包括集合,线性结构,非线性结构. 存储结构: 顺序存储,链式存储,索引存储,散列存储. Java 常见数据结构 大专栏 Java && Python 算法面试 ...
随机推荐
- [转]ssh和SSH服务(包含隧道内容)
本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...
- 复习下C 链表操作(双向循环链表,查找循环节点)
双向循环链表 和 单向循环链表 查找循环节点 思路都是一样. 快慢指针查找法. 理论可参考 c 链表之 快慢指针 查找循环节点 typedef struct Student_Double { ]; ...
- Python--Redis实战:第四章:数据安全与性能保障:第7节:非事务型流水线
之前章节首次介绍multi和exec的时候讨论过它们的”事务“性质:被multi和exec包裹的命令在执行时不会被其他客户端打扰.而使用事务的其中一个好处就是底层的客户端会通过使用流水线来提高事务执行 ...
- django 拷贝一个 model 实例
今天做一个拷贝功能,把某个 obj 拷贝并修改部分数据,提交表单后保存为一个新实例.结果google 出来的结果不对,都是相互copy 的代码,大概如下: obj = MyModel.objects. ...
- YII页面显示trace
修改protected/config/main.php 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=te ...
- VS2012+openCV 2.4.8进行编译:VS2012 64位 使用OPENCV应用程序不能正常启动 (0xc000007b)怎么处理?
[OpenCV入门教程之一] 安装OpenCV:OpenCV 2.4.8 +VS 开发环境配置 http://blog.csdn.net/poem_qianmo/article/details/198 ...
- Ubuntu 14.04 下搭建SVN服务器 (转载自 http://www.linuxidc.com/Linux/2015-01/111956.htm)-------------我所用到是红色字体
http://www.linuxidc.com/Linux/2015-01/111956.htm Ubuntu 14.04 下搭建SVN服务器 svn:// 安装软件包: sudo apt-get i ...
- ZMQ通信模式
本文简要介绍ZMQ常用的通信模式 请求响应模式 常规搭配:ZMQ_REQ + ZMQ_REP 带输入负载(Round Robin)均衡搭配:ZMQ_REQ + ZMQ_ROUTER 消息分发搭配:ZM ...
- 如何把大段文字转为带html标签的文字
开发网页的时候,有时候会遇到大段的隐私声明,用户协议等等,我们呀要复制粘贴展示出来,必须加大量的p标签,h1,h2,空格符,br标签,这对我们来说无疑是泪崩的,有个很好的办法,可以快速给这些文字加标签 ...
- gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第二篇:gradle简单实战
一个bug 一个脚印的叫你们用gradle. 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊,走 ...