-
Notifications
You must be signed in to change notification settings - Fork 0
/
day25.py
127 lines (105 loc) · 2.88 KB
/
day25.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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
def makeInput(file):
with open(file) as f:
lines = f.readlines()
input = []
for x in lines:
y = x.strip()
line = []
for char in y:
line.append(char)
input.append(line)
return input
input = makeInput('day25test3.txt')
def snafuToInt(line):
pow = 0
total = 0
for char in line:
if char == '-':
total += 5**pow * (-1)
elif char == '=':
total += 5**pow * (-2)
else:
total += 5**pow * int(char)
pow += 1
return total
# total = 0
# for line in input:
# newTotal = snafuToInt(line[::-1])
# print(newTotal)
# total += newTotal
# print(total)
# 31242554356360
def intToSnafu(int):
pow = 0
mult = 1
prod = mult * (5**pow)
while prod < int:
if mult == 1:
mult = 2
else:
pow += 1
mult = 1
prod = mult * (5**pow)
if mult == 2:
prod = sum([5**pow] + [2*(5**i) for i in range(pow)])
if prod >= int:
mult = 1
topPow = pow
elif mult == 1:
prod = sum([2*(5**i) for i in range(pow)])
if prod < int:
topPow = pow
else:
mult = 2
topPow = pow-1
# print(mult)
# print(topPow)
snafuList = [0 for _ in range(topPow)] + [mult]
coeffs = [-2,-1,0,1,2]
for pow in range(topPow-1,-1,-1):
# print(pow)
prod = sum([snafuList[i] * (5**i) for i in range(topPow+1)])
# print(prod)
choices = [prod + (coeff * 5**pow) for coeff in coeffs]
# print(choices)
diffs = [abs(int - choice) for choice in choices]
# print(diffs)
minDiff = min(diffs)
# print(minDiff)
minDiffIdx = diffs.index(minDiff)
# print(minDiffIdx)
snafuList[pow] = coeffs[minDiffIdx]
# print(snafuList)
snafuList.reverse()
# print(snafuList)
res = ''
for char in snafuList:
if char == -2:
res += '='
elif char == -1:
res += '-'
else:
res += str(char)
return res
print(intToSnafu(31242554356360))
# if mult == 2:
# if (prod - int) < (int - 5**(pow)):
# snafuLst = ['2']
# else:
# mult = 1
# snafuLst = ['1']
# topPow = pow
# else:
# if (prod - int) < (int - (2 * (5**(pow-1)))):
# topPow = pow
# snafuLst = ['1']
# else:
# topPow = pow-1
# mult = 2
# snafuLst = ['2']
# currentSum = mult * 5**topPow
# pows = [topPow - i for i in range(1,topPow+1)]
# mults = [2,1,0,-1,-2]
# for pow in pows:
# nextSums = [currentSum + mult*(5**pow) for mult in mults]
# diffs = [abs(int-nextSum) for nextSum in nextSums]