こじつけ算を求めるPythonコード

吉凶数に続いて、任意の西暦年月日の数字の組み合わせで、縁起の良い数字あるいは悪い数字との関係性を探索するコード。単なるこじつけなので「こじつけ算」とでも呼ぼう。

コード:


from itertools import itertools

def decompose_number(number):
    return [int(digit) for digit in str(number)]

def calculate_combinations(numbers):
    num_length = len(numbers)
    all_results = []

    for combination in product(['+', '*'], repeat=num_length - 1):
        expression = [str(numbers[i]) + combination[i] for i in range(num_length - 1)] + [str(numbers[-1])]
        expression_str = ''.join(expression)
        result = eval(expression_str)
        all_results.append((expression_str, result))

    return all_results

def find_matching_expressions(A, B):
    decomposed = decompose_number(A)
    results = calculate_combinations(decomposed)
    
    matching_expressions = []
    for idx, (expression, result) in enumerate(results, start=1):
        if result == B:
            matching_expressions.append(f"result_{idx}: {expression} = {result}")

    return matching_expressions, results

# 標準入力から数字Aと数字Bを取得
A = int(input("数字Aを入力してください: "))
B = int(input("数字Bを入力してください: "))

matching_expressions, all_results = find_matching_expressions(A, B)

# AとBが一致する計算式を表示または「一致無し」を表示
if matching_expressions:
    print("AとBが一致する計算式:")
    for expression in matching_expressions:
        print(expression)
else:
    print("一致無し")

# 全ての組み合わせを表示
print("\n組み合わせ一覧:")
for idx, (expression, result) in enumerate(all_results, start=1):
    print(f"result_{idx}: {expression} = {result}")

結果

数字Aに西暦年月日を、数字Bにはこじつけたい数字を入れると、一致するバターンがあれば表示して、なければ「一致無し」と出る。ついでに全組み合わせも表示する。引き算、割り算を考慮すると複雑になるので、加算と乗算のみ。0の扱いも課題だけど、とりあえずそのまま計算。

例えば、数字A = 20231119(2023年11月19日)、数字B=18(6+6+6で、いわゆる獣の数字で、縁起悪い)だと、以下のような組み合わせが該当する。

result_2: 2+0+2+3+1+1+1*9 = 18
result_3: 2+0+2+3+1+1*1+9 = 18
result_5: 2+0+2+3+1*1+1+9 = 18
result_9: 2+0+2+3*1+1+1+9 = 18
result_20: 2+0+2*3+1+1*1*9 = 18
result_22: 2+0+2*3+1*1+1*9 = 18
result_23: 2+0+2*3+1*1*1+9 = 18
result_26: 2+0+2*3*1+1+1*9 = 18
result_27: 2+0+2*3*1+1*1+9 = 18
result_29: 2+0+2*3*1*1+1+9 = 18
result_81: 2*0+2*3+1+1+1+9 = 18    

さらに目標とする「こじつけ算」に一致する組み合わせが出てくるまで任意の範囲を虱潰しで探索するとか、年月日時分秒((YYYYMMDDhhddss)まで含めるとか、いろいろ拡張すれば使い勝手(?)が良くなりそう。面倒くさいけど。