技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

プログラム脳を鍛える数学パズル13

アルファベットを数字に置き換え、成立させてください。

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

import re
import itertools
import copy

src = 'READ + WRITE + TALK = SKILL'
num_expression = re.split('[^a-zA-Z]+', src)
unique_chars = list(set(''.join(num_expression)))
non_zero_chars = [n[0] for n in num_expression]


def is_invalid(kv: dict) -> bool:
    for c in non_zero_chars:
        if kv[c] == 0:
            return True
    return False


count = 0
for perm in itertools.permutations(range(10), len(unique_chars)):
    zipped = dict(zip(unique_chars, perm))

    if is_invalid(zipped):
        continue

    tmp_str = src
    for k in zipped.keys():
        tmp_str = tmp_str.replace(k, str(zipped[k]))

    if eval(tmp_str.replace('=', '==')):
        print(tmp_str)
        count += 1

print(count)

python は名前付き break がないので、中途半端に関数出し…。
ちなみに解き方は直接文字を数字に置き換えて、文字列のまま eval に食わせるという力技。

つっても結局汎用的に解こうとすると 10! ケースがあり得るのだから、もう諦めかなと。

この足し算の部分が、引き算とか、掛け算とか汎用的に…と言われてしまうと、eval 無い言語で解くの死ぬほど面倒そうな…