竖式谜题

Posted weiyinfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了竖式谜题相关的知识,希望对你有一定的参考价值。

对于一道数字谜题,人很容易观察出一些特点,从而缩小枚举范围。

对于程序,它如果能够像人一样分析这样的问题,那就能够极大地减少搜索空间。
人在计算时,是一种模糊计算,是一种由模糊逐渐清晰的过程。
当人计算两个数字的乘积时,先大约估计出乘积,而不是一次性精确算出。
如何让计算机模拟人脑进行数值计算的过程?

  • 如何出题才能防止暴力破解?
  • 对于两串大整数字谜,如何快速找到一对解?
import collections

"""
题目生成器
"""
N = 2


def put(puzzle, one, a):
    """
    将数字转化为字母
    :param puzzle:
    :param one:
    :param a: 数字到字母的映射
    :return:
    """
    s = ''
    for i in str(one):
        if i not in a:
            a[i] = chr(ord('A') + len(a))
        s += a[i]
    puzzle.append(s)


def getall():
    all_puzzles = []
    ans = []
    for i in range(10 ** (N - 1) + 1, 10 ** N):
        for j in range(10 ** (N - 1) + 1, 10 ** N):
            if '0' in str(i) or '0' in str(j): continue
            a = dict()
            puzzle = []
            put(puzzle, i, a)
            put(puzzle, j, a)
            for k in range(N):
                put(puzzle, i * (j // (10 ** k) % 10), a)
            put(puzzle, i * j, a)
            all_puzzles.append(puzzle)
            ans.append((i, j))
    return all_puzzles, ans


def filt():
    x, y = getall()
    m = list(map(lambda x: ','.join(x), x))
    cnt = collections.Counter(m)
    nx = []
    ny = []
    for i in range(len(m)):
        if cnt[m[i]] == 1:
            nx.append(tuple(x[i]))
            ny.append(y[i])
    return dict(zip(nx, ny))


def get_ans(s: str):
    return puzzles.get(tuple(s.split(',')))


puzzles = filt()
print("一共有", len(puzzles), "道题目")

以上是关于竖式谜题的主要内容,如果未能解决你的问题,请参考以下文章

谜题28:循环者

竖式问题

竖式问题

《C#零基础入门之百识百例》输出格式控制 -- 竖式计算

竖式问题

竖式问题——巧用字符数组