forked from colonelpanic/dotfiles
plus minus
This commit is contained in:
parent
8fc2cd4141
commit
efa0de090f
63
dotfiles/lib/python/plus_minus.py
Normal file
63
dotfiles/lib/python/plus_minus.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
def groupings(numbers):
|
||||||
|
if len(numbers) == 0:
|
||||||
|
raise StopIteration()
|
||||||
|
if len(numbers) == 1:
|
||||||
|
yield ((numbers[0],),)
|
||||||
|
raise StopIteration()
|
||||||
|
this_number = numbers[0]
|
||||||
|
this_tuple = (this_number,)
|
||||||
|
next_groupings = groupings(numbers[1:])
|
||||||
|
for grouping in next_groupings:
|
||||||
|
yield (this_tuple,) + grouping
|
||||||
|
yield (this_tuple + grouping[0],) + grouping[1:]
|
||||||
|
|
||||||
|
|
||||||
|
def plus_minus_n(numbers, n):
|
||||||
|
for grouping in groupings(numbers):
|
||||||
|
numbers = map(group_to_int, grouping)
|
||||||
|
pms = plus_minuses(len(numbers) - 1)
|
||||||
|
for pm in pms:
|
||||||
|
result = compute(numbers, pm)
|
||||||
|
string = generate_string(numbers, pm)
|
||||||
|
if result == n:
|
||||||
|
yield string
|
||||||
|
|
||||||
|
|
||||||
|
def generate_string(numbers, pms):
|
||||||
|
string = ''
|
||||||
|
for number in numbers:
|
||||||
|
string += '{0}'.format(number)
|
||||||
|
if pms:
|
||||||
|
string += '+' if pms[0] is PLUS else '-'
|
||||||
|
pms = pms[1:]
|
||||||
|
return string
|
||||||
|
|
||||||
|
|
||||||
|
def compute(numbers, plus_minus):
|
||||||
|
sum = numbers[0]
|
||||||
|
remaining = numbers[1:]
|
||||||
|
while remaining:
|
||||||
|
if plus_minus[0] == PLUS:
|
||||||
|
sum += remaining[0]
|
||||||
|
else:
|
||||||
|
sum -= remaining[0]
|
||||||
|
remaining = remaining[1:]
|
||||||
|
plus_minus = plus_minus[1:]
|
||||||
|
return sum
|
||||||
|
|
||||||
|
|
||||||
|
def group_to_int(group):
|
||||||
|
return int(''.join(map(str, group)))
|
||||||
|
|
||||||
|
|
||||||
|
PLUS = object()
|
||||||
|
MINUS = object()
|
||||||
|
|
||||||
|
|
||||||
|
def plus_minuses(n):
|
||||||
|
if n == 0:
|
||||||
|
yield ()
|
||||||
|
raise StopIteration()
|
||||||
|
for pm in plus_minuses(n-1):
|
||||||
|
yield (PLUS,) + pm
|
||||||
|
yield (MINUS,) + pm
|
Loading…
Reference in New Issue
Block a user