-
Notifications
You must be signed in to change notification settings - Fork 1
/
utilities.py
158 lines (130 loc) · 3.91 KB
/
utilities.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import sys
import re
import array
import primes
codepage = """₀₁₂₃₄₅₆₇₈₉ₓ₌ₔ∂€₵⟨⟩⟪⟫⇑⇓⇐⇒↑↓←→⇈⇊⇇⇉ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
«»…┅⌋⌉⊂⊃∧∨ΣΠ‼×÷⁻øؤ¶§ ₸ℍȦĊḊĖḞĠḢṀṄȮṖṘṠṪẆẊẎŻȧċḋėḟġḣṁṅȯṗṙṡṫẇẋẏżẠḄḌẸḤḲḶṂṆỌṚṢṬỤṾẈỴẒạḅḍẹḥḳḷṃṇọṛṣṭụṿẉỵẓ¿¡⁇⁈↻↺∞¦†‡∆∇⊢⊣‖ ⌡⌠∫ªº° “”‘’„‟""" # TODO: finish code page
manualOutput = False
inputs = []
randoms = [0]
def flatten(l):
result = []
for i in l:
if type(i) == list:
# If the element is a list, recursively flatten it and append its elements
result += flatten(i)
else:
# Otherwise just append that element
result.append(i)
return result
def toBase(num, base):
sign = -1 if num < 0 and base > 0 else 1
num = abs(num)
if num == 0:
return [0]
if base == 0:
return [num]
if base == 1:
return [sign]*num
digits = []
while num:
num, digit = divmod(num, base)
if digit < 0:
num += 1
digit -= base
digits.insert(0, digit*sign)
return digits
def fromBase(digits, base):
return sum(digits[~i]*(base**i) for i in range(len(digits)))
def formatNum(num):
return int(num) if num == int(num) else num
def getInput():
try:
line = input().strip()
value = None
match = re.match("^-?(\d+(\.\d+)?|\.\d+)$", line)
if match:
if match.group(2): # Only do float parsing if it actually has a fractional part
value = formatNum(float(line))
else:
value = int(match.group(0))
elif re.match("^\s*“[^”]*”\s*$", line):
value = re.match("^\s*“([^”]*)”\s*$", line).group(1)
else:
value = line
inputs.append(value)
return value
except EOFError:
return inputs[-1]
## TODO: Finish this function (add list parsing?)
def codepageEncode(code):
result = []
for c in code:
if codepage.find(c) != -1:
result.append(codepage.index(c))
return array.array('B', result).tostring()
def codepageDecode(code):
result = ""
for byte in code:
result += codepage[byte]
return result
def outputFormat(value):
if type(value) == int:
return str(value)
elif type(value) == float:
return str(formatNum(value))
elif type(value) == str:
return value
elif type(value) == list:
result = '['
for i in value:
if type(i) == list:
result += outputFormat(i)
elif type(i) == str:
result += '"'+i+'"'
else:
result += str(formatNum(i))
result += ' '
result = re.sub(" ?$", "]", result)
return result
def castToNumber(v):
if type(v) == int or type(v) == float:
return formatNum(v)
elif type(v) == str:
match = re.match("^\s*((-|\+)?(\d+(\.\d+)?|\.\d+))", v)
return 0 if match == None else formatNum(float(match.group(1)))
elif type(v) == list:
return fromBase([castToNumber(d) for d in v], 10)
def castToString(v):
if type(v) == int or type(v) == float:
return str(formatNum(v))
elif type(v) == str:
return v
elif type(v) == list:
newList = [castToString(item) for item in v]
return "".join(newList)
def castToList(v):
if type(v) == int or type(v) == float:
sign = -1 if v < 0 else 1
v = abs(int(v))
return list(map(lambda x:x*sign, list(range(1, v+1) if v>0 else [0])))
elif type(v) == str:
return list(v)
elif type(v) == list:
return v
# Add a new prime to the prime list
def generatePrime():
p = primes.primes[-1] + 1
while not all(p%n for n in primes.primes):
p += 1
primes.primes.append(p)
# Get the nth prime
def getPrime(n):
while len(primes.primes) < n:
generatePrime()
return primes.primes[n-1]
# Get the first n primes
def getPrimes(n):
while len(primes.primes) < n:
generatePrime()
return primes.primes[:n]