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 - 字母算术谜题

时间: 2024-12-28 18:59:11

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

字母算术的python算法

据说Google出过一道题目:WWWDOT – GOOGLE = DOTCOM. 其中每个字母代表一个数字,数字不能重复,而且最高位的数字不能为0. 像这样的谜题被称为cryptarithms或者字母算术(alphametics).字母可以拼出实际的单词,而如果你把每一个字母都用0–9中的某一个数字代替后, 也同样可以拼出一个算术等式.关键的地方是找出每个字母都映射到了哪个数字.每个字母所有出现的地方都必须映射到同一个数字,数字不能重复, 并且"单词"不能以0开始. 最著名的字母算术谜

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

本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用户自定义变量. 词法分析,检查单词变量是否正确:语法分析,检查算术表达式语法是否正确并输出生成语法树:语义分析,输出四元表达式. 最终效果图: 例如输入: 词法分析结果: 语法分析结果: 语义分析结果: 算术表达式的组成语法如下: 无符号整数 = 〈数字〉{〈数字〉} 〈标识符〉= 〈字母〉{〈字母

python里面算术的用法

一般在平常的算术中我们常见的“+”,“-”,“*”,“/”都是再正常普通不过了,但它的算术中有个不一样的点,刚上手学习,也说不清楚,先把我理解的记录下来. 例如: >>>3+2 5  计算得出的<和> >>>3-1 2 计算得出的<差> >>>3*6 18 计算得出的<积> >>>18/6 3 计算得出的<商> 而当除法变得多一条斜杠的时候,计算得出的值又不一样了. 例如: >&g

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

注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程语句有单行注释和多行注释 2. 单行注释 单行注释是以#开头,#右边的所有的文字都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用 示例代码如下(为了保障可读性,#后面一般要加上一个空格): # 这是单行注释 print("Hello word") 在代码的后面加上单行注释 为了

Python——day2_基础_模块概念,列表,元组,字典

模块初识 Python中的模块是什么 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的. 那么在Python中,如果要引用一些内置的函数,该怎么处理呢? 在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块, 下面就来了解一下P

【2】快速入门学习python整体

注意一下 >>>主提示符 ...    次提示符 python主要通过两种方式来解决问题:语句和表达式(函数,算术表达式): abs()函数,输出绝对值函数. 绝对值的英文是Absolute value,取前面的abs,好记点. abs(-4) 4 abs(4) 4 当然我们现在需要的是先学习print语句. 注意一下 python的输出重定向. python那些带括号的东西都是函数. 在python中学会使用help()函数 help(函数名) 核心风格:一直在函数外做用户交互操作 将

Python的语法的基本的总结

1.Python的对汉字的支持 #!/usr/bin/python #coding: UTF-8 print "你好,世界"; 2.Python标识符 在python里,标识符有字母.数字.下划线组成. 在python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. python中的标识符是区分大小写的. 以下划线开头的标识符是有特殊意义的.以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"from xxx impo

一张图认识Python(附基本语法总结)

一张图带你了解Python,更快入门, 视频介绍>>>> [简单学Python安全] Python基础语法总结: 1.Python标识符 在 Python 里,标识符有字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小写的. 以下划线开头的标识符是有特殊意义的.以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import *

python入门系列:Python基础知识

Python注释 单行注释 这是一个单行注释 print("test")多行注释 '''这里就是python的多行注释方式可以直接分行进行注释操作本质上是字符串'''import thisprint("hello world")特殊注释 #!/usr/bin/python3指定解释器的版本#encoding=utf-8python 2.x解决中文文本乱码Python变量 变量使用 使用之前不用声明:做参数传递时,所有的变量都是引用 定义变量 arg = val a