Cryptarithmetic Problem ‘ODD+ODD == EVEN’

这段代码不仅仅是针对一个‘ODD+ODD==EVEN’,更重要的是它可以针对很多这种类型的等式,来寻找可能的数字数字表示。例如:‘655+655=1310’

from __future__ import division     #在python2版本中,3/2返回1,而在python3版本中却返回1.5,在这个问题中,我们需要1.5作为结果,但是我们又用的是python2,故添加这一句来转化
import string, re, itertoolsdef solve(formula):"""Given a formula like 'ODD + ODD == EVEN', fill in digits to solve it.Input formula is a string; output is a digit-filled-in string or None."""for f in fill_in(formula):if valid(f):return fdef fill_in(formula):"Generate all possible fillings-in of letters in formula with digits."letters = ''.join(set(re.findall('[A-Z]',formula))) #should be a stringfor digits in itertools.permutations('1234567890', len(letters)):table = string.maketrans(letters, ''.join(digits))yield formula.translate(table)def valid(f):"""Formula f is valid if and only if it has no numbers with leading zero, and evals true."""try: return not re.search(r'\b0[0-9]', f) and eval(f) is Trueexcept ArithmeticError:return False

注解:

  1. valid()函数:判断一个数是否是正确格式的数,若是,则返回True,否则返回False。该函数把以0开头的数字去除掉了,因为以0开头的数字在计算机中是以八进制进行识别的,不符合我们解决这个问题的规则。
  2. fill_in()函数:该函数是一个生成器函数,返回一个数字等式对应于输入的字母等式字符串。
    (i)若输入是‘ODD+ODD==EVEN’,那么letters=‘ODEVN’这样一个字符串。join是字符串的一个方法,把join括号里面的东西连接成一个字符串。
    (ii)**set()**返回一个集合,集合的概念类似我们高中时期学的数学概念集合,有一篇博客写得不错,适合入门set,如果有对set不是很清楚地可以参考:
    https://www.cnblogs.com/SmallWZQ/p/8488744.html
    (iii)re.findall(’[A-Z]’,formula) 这一部分查找formula里面所有的大写字母,这一部分是正则表达式模块的内容
    (iv)itertools.permutations(‘1234567890’,len(letters)),这一部分返回的是所有len(letters)长度的数字的全排列。对这个例子来讲,letters的长度是5,所以我们从0-9这10个数字中任选5个全排列,返回所有的可能性。
    (v)maketrans(from,to),该方法接收两个参数,返回一个转换表。该表将把from中的每个字符映射到to中相同位置的字符中;from和to的长度必须相同。
    (vi)string.translate(table,delete_string), 该方法接受一个由上述maketrans()方法创建的table和一个将要被删除的字符串,先将string中匹配到的delete_string删除掉,然后再将string中的‘from’替换成‘to’(from和to如前所述)。当然,第二个参数可以省略。
  3. slove()函数:检查fill_in()函数返回的等式中的数字是否符合正确的数字规则。
  4. 上述代码仅仅返回了一种可能性,若是把所有的可能性都打印出来,那么我们只需要把solve()函数中的return改成print就可以了,因为外层是一个for循环,他会一直打印结果直到结束,而不是碰到第一个结果就return了。

把‘YOU’变成‘(1*U+10*O+100*Y)

def compile_word(word):"""Compile a word of uppercase letters as numeric digits.E.g., compile_word('YOU') => '(1*U+10*O+100*Y)'Non-uppercase words uncahanged: compile_word('+') => '+'"""if word.isupper():terms = [('%s*%s' % (10 ** i, d))for (i, d) in enumerate(word[::-1])]return '(' + '+'.join(terms) + ')'else:return word

map()

  1. map() 是python内置的高阶函数,他接受一个函数f和一个或多个list,并通过把函数f依次作用在list的每个元素上,得到一个新的object并返回。不改变原来的list(注:python2返回列表,python3返回迭代对象即object)
res = map(compile_word, ['YOU', 'ME', 'you'])
print(res)
print(list(res))
>>><map object at 0x000001B2E47EE908>  # 迭代对象
>>>['(1*U+10*O+100*Y)', '(1*E+10*M)', 'you']  # 将其转化为列表
# 也可以使用lambda匿名函数
print(list(map(lambda x: x**2, [1,2,3])))
print(list(map(lambda x,y: x+y, [1,3,5], [2,4,6])))
>>>[1, 4, 9]
>>>[3, 7, 11]

reduce()

说完map(),不得不说一下reduce();只针对python2,在python3中,移除了reduce(),并把它放在了functools模块里,用的时候只需要from functools import reduce 即可

  1. reduce() 函数会对参数序列中元素进行累积。
  2. reduce() 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
def add(x, y) :            # 两数相加return x + y
reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
>>> 15
reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
>>> 15
reduce(add, [1,2,3,4,5],100)  # 可接受第三个参数作为初始值

Cryptarithmetic Problem ‘ODD+ODD == EVEN’;map()函数,reduce()相关推荐

  1. python之Map函数 reduce 函数

    转载:https://www.cnblogs.com/gongxr/p/7247855.html python之Map函数 # map()函数使用举例 # 功能:map()接受一个函数f和一个或多个l ...

  2. filter 函数 map 函数 reduce函数 介绍

    filter 遍历序列中的每一个元素,判断每个元素得到的布尔值,如果是True则留下来 初级版本 1 movie_people = ['lining','zhaoheng','m aoxin','m_ ...

  3. Python高级函数Counter、defaultdict、map、reduce、filter使用

    在这里为大家介绍一下Python非常实用的Counter.defaultdict.map.reduce.filter的函数使用,提高大家在平时使用Python的效率 计数器函数 Counter 带默认 ...

  4. Python 高阶函数filter、map、reduce、reversed、sorted及迭代器函数 iter

    1. filter(function, iterable) 过滤器,过滤掉不满足函数 function 的元素,重新返回一个新的迭代器. 其中 function 函数的第一个参数是可迭代对象 iter ...

  5. Python之常用的高阶函数——abs、map、reduce、filter、sorted

    1.abs 简单来说abs的功能就是求一个数的绝对值 例: 特点: <1>函数本身也可以赋值给变量,变量也可以指向函数 <2>传递的参数包括函数名 2.map map()函数接 ...

  6. Python中的map()函数和reduce()函数的用法

    Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下  

  7. Python的函数名作为参数传入调用以及map、reduce、filter

    零.python的lambda函数: 1 #lambda function 2 func = lambda x : x+1 3 #这里是一个匿名函数,x是参数,x+1是对参数的操作 4 func(1) ...

  8. 好好学python · 内置函数(range(),zip(),sorted(),map(),reduce(),filter())

    内置函数 range函数 zip() 函数 其它内置函数 数据类型转换相关内置函数 变量相关函数 数学相关函数 进制相关函数 高阶函数 sorted(iterable,[reverse,key]) m ...

  9. Python中map和reduce函数?

    1.从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce( ...

最新文章

  1. 阿里AI再揽2员大将:挖角高通、360,年薪百万美元
  2. javascript箭头函数和this的指向问题
  3. Druid如何自动根据URL自动识别DriverClass的
  4. JavaScript入门(part9)--函数
  5. 测试丢包_入行游戏测试之弱网测试工具
  6. 如何查看vantUI官方组件的.vue文件(抛转篇)
  7. 要做互联星空的SP接口,一点头绪都没有
  8. 文件类型总结 MIME
  9. 不要网上乱拷贝代码了!一段网上找的代码把公司服务器崩了!
  10. 手机html页面图片不显示,是什么原因?HTML插入图片显示不出来?
  11. 美国金融危机产生的原因
  12. java学习之htlm总结
  13. 正大国际期货:为什么外盘期货顺势交易这么难
  14. #38 WARNING(SPCODD-38): ERROR(SPCODD-47):
  15. 如何在vim快速删除全部内容
  16. cocos2d-x 使用Box2d制作的台球游戏
  17. Datawhale零基础入门NLP day5/Task5基于深度学习的文本分类2
  18. Microsoft SQL Server--导入excel数据
  19. 黑科技:CSS定制多行省略 1
  20. 好用的 ScreenToGif gif录制

热门文章

  1. 剑网三修复选择服务器,老玩家回坑剑网三去哪个区服,要注意啥?这有一份终极宝典请查收...
  2. GD32F307 DAC 输出波形
  3. 面经分享 | 2年经验,1个月拿下阿里P6 Offer
  4. mos管 rl_MOS管放大电路
  5. keil的sct文件_STM32 分散加载文件 .sct 解析
  6. 监控视频压缩存储该如何解决?
  7. 无线传感器网络知识点
  8. 查看oracle配置信息,查看 Oracle Solaris 系统配置信息
  9. RxJava2 转换操作符之FlatMap()方法
  10. 一起去追寻那大漠孤烟