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

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
- 作者: 増井敏克
- 出版社/メーカー: 翔泳社
- 発売日: 2015/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
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 無い言語で解くの死ぬほど面倒そうな…