-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfinder.py
42 lines (35 loc) · 1.28 KB
/
finder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from itertools import combinations
# Loopi de loop
# subset sum problem
def findMatchesForAllStatements(statements: list[int], invoices: dict[int, int]):
matches = dict()
for statement in statements:
finds = findMatchesForStatement(statement, invoices)
if len(finds) > 0:
matches[statement] = finds
return matches, getDuplicates(matches)
def findMatchesForStatement(statement: int, invoices: dict[int, int]):
"""
Find all invoices that sum up to the statement
2^n-1 combinations
"""
ids = list(invoices.keys())
matches: list[dict[int, int]]= []
for length in range(len(ids) + 1):
for subset in combinations(ids, length):
subsetSum = sum([invoices[id] for id in subset])
if subsetSum == statement:
matches.append({id: invoices[id] for id in subset})
return matches
def getDuplicates(matches: dict[int, list[dict[int, int]]]):
invoiceIds = []
for invoices in matches.values():
for invoice in invoices:
invoiceIds = [*invoiceIds, *list(invoice.keys())]
seen = set()
duplicates = set()
for id in invoiceIds:
if id in seen:
duplicates.add(id)
seen.add(id)
return duplicates