View Single Post
Kan enkelt bare bruteforce alle kombinasjonene av tall og operasjoner, når det er så få tall som 6. Ble ikke så veldig sexy loop når jeg måtte lagre mellomregninger underveis, men for eksempelet ditt over så vil noe sånt som det her fungere:

Kode

from itertools import product
from collections import defaultdict

def gen_all_combos(part_sum, numbers_left, history=None):
    combos = product("+-*/", numbers_left)
    if not history:
        history = str(part_sum)
    for combo in combos:
        numbers_left_copy = list(numbers_left[:])
        numbers_left_copy.remove(combo[1])
        calc_string = history+''.join(map(str,combo))
        result = eval(calc_string)
        if result < 0 or abs(int(result)-result) > 1e-6:
            continue
        yield int(result), numbers_left_copy, '('+calc_string+')'

NUMBERS = [25, 75, 10, 7, 5, 4]
TARGET = 459
solutions = defaultdict(set)
for num in NUMBERS:
    nums = NUMBERS[:]
    nums.remove(num)
    for c1 in gen_all_combos(num, nums):
        solutions[c1[0]].add(c1[2])
        for c2 in gen_all_combos(*c1):
            solutions[c2[0]].add(c2[2])
            for c3 in gen_all_combos(*c2):
                solutions[c3[0]].add(c3[2])
                for c4 in gen_all_combos(*c3):
                    solutions[c4[0]].add(c4[2])
                    for c5 in gen_all_combos(*c4):
                        solutions[c5[0]].add(c5[2])
                        for c6 in gen_all_combos(*c5):
                            solutions[c6[0]].add(c6[2])
print(solutions[459])
Kjører på noen sekunder her.
Sist endret av Dyret; 9. juli 2019 kl. 01:09.