class Romans():
"""docstring for Romanos"""
def __init__(self):
self.eq = [("M",1000), ("CM", 900), ("D", 500), ("CD", 400), ("C", 100), ("XC", 90),
("L", 50), ("XL", 40), ("X", 10), ("IX", 9), ("V", 5), ("IV", 4), ("I", 1)]
self.dic = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I": 1}
def to_roman(self, n):
ans = ""
for r,d in self.eq:
for i in range(0,3):
if n >= d:
ans += r
n -= d
else: break
return ans
def to_decimal(self, rom):
ans = 0
last = 0
for c in rom:
if (last > 0) and (last < self.dic[c]):
ans += self.dic[c] - last
last = 0
else:
ans += last
last = self.dic[c]
return ans+last
class Parents():
"""docstring for Parents"""
def __init__(self):
self.a = ["{", "(", "["]
self.b = ["}", ")", "]"]
def validar(self, line):
st = []
for c in line:
if c in self.a:
st.append(c)
elif c in self.b:
if len(st) == 0:
return False
ind = self.b.index(c)
if st.pop() != self.a[ind]:
return False
return True
class Subconjs():
def subs(self, lista):
l = len(lista)
pl = (1<<l)
ans = []
for mask in range(0, pl):
cmb = []
for i in range(0, l):
if (mask&(1<<i)) > 0:
cmb.append(lista[i])
ans.append(cmb)
return ans
prueba1 = Romans()
print(prueba1.to_roman(39))
print(prueba1.to_decimal('XXXIX'))
prueba2 = Parents()
print(prueba2.validar("()[]{}"))
print(prueba2.validar("({[)]"))
prueba3 = Subconjs()
print(prueba3.subs([4, 5, 6]))
Y2xhc3MgUm9tYW5zKCk6CiAgICAiIiJkb2NzdHJpbmcgZm9yIFJvbWFub3MiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmVxID0gWygiTSIsMTAwMCksICgiQ00iLCA5MDApLCAoIkQiLCA1MDApLCAoIkNEIiwgNDAwKSwgKCJDIiwgMTAwKSwgKCJYQyIsIDkwKSwKICAgICAgICAoIkwiLCA1MCksICgiWEwiLCA0MCksICgiWCIsIDEwKSwgKCJJWCIsIDkpLCAoIlYiLCA1KSwgKCJJViIsIDQpLCAoIkkiLCAxKV0KICAgICAgICBzZWxmLmRpYyA9IHsiTSI6MTAwMCwgIkQiOjUwMCwgIkMiOjEwMCwgIkwiOjUwLCAiWCI6MTAsICJWIjo1LCAiSSI6IDF9CgogICAgZGVmIHRvX3JvbWFuKHNlbGYsIG4pOgogICAgICAgIGFucyA9ICIiCiAgICAgICAgZm9yIHIsZCBpbiBzZWxmLmVxOgogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLDMpOgogICAgICAgICAgICAgICAgaWYgbiA+PSBkOgogICAgICAgICAgICAgICAgICAgIGFucyArPSByCiAgICAgICAgICAgICAgICAgICAgbiAtPSBkCiAgICAgICAgICAgICAgICBlbHNlOiBicmVhawogICAgICAgIHJldHVybiBhbnMKCiAgICBkZWYgdG9fZGVjaW1hbChzZWxmLCByb20pOgogICAgICAgIGFucyA9IDAKICAgICAgICBsYXN0ID0gMAogICAgICAgIGZvciBjIGluIHJvbToKICAgICAgICAgICAgaWYgKGxhc3QgPiAwKSBhbmQgKGxhc3QgPCBzZWxmLmRpY1tjXSk6CiAgICAgICAgICAgICAgICBhbnMgKz0gc2VsZi5kaWNbY10gLSBsYXN0CiAgICAgICAgICAgICAgICBsYXN0ID0gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYW5zICs9IGxhc3QKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLmRpY1tjXQogICAgICAgIHJldHVybiBhbnMrbGFzdAoKY2xhc3MgUGFyZW50cygpOgogICAgIiIiZG9jc3RyaW5nIGZvciBQYXJlbnRzIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5hID0gWyJ7IiwgIigiLCAiWyJdCiAgICAgICAgc2VsZi5iID0gWyJ9IiwgIikiLCAiXSJdCgogICAgZGVmIHZhbGlkYXIoc2VsZiwgbGluZSk6CiAgICAgICAgc3QgPSBbXQogICAgICAgIGZvciBjIGluIGxpbmU6CiAgICAgICAgICAgIGlmIGMgaW4gc2VsZi5hOgogICAgICAgICAgICAgICAgc3QuYXBwZW5kKGMpCiAgICAgICAgICAgIGVsaWYgYyBpbiBzZWxmLmI6CiAgICAgICAgICAgICAgICBpZiBsZW4oc3QpID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICBpbmQgPSBzZWxmLmIuaW5kZXgoYykKICAgICAgICAgICAgICAgIGlmIHN0LnBvcCgpICE9IHNlbGYuYVtpbmRdOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgpjbGFzcyBTdWJjb25qcygpOgogICAgZGVmIHN1YnMoc2VsZiwgbGlzdGEpOgogICAgICAgIGwgPSBsZW4obGlzdGEpCiAgICAgICAgcGwgPSAoMTw8bCkKICAgICAgICBhbnMgPSBbXQogICAgICAgIGZvciBtYXNrIGluIHJhbmdlKDAsIHBsKToKICAgICAgICAgICAgY21iID0gW10KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbCk6CiAgICAgICAgICAgICAgICBpZiAobWFzayYoMTw8aSkpID4gMDoKICAgICAgICAgICAgICAgICAgICBjbWIuYXBwZW5kKGxpc3RhW2ldKQogICAgICAgICAgICBhbnMuYXBwZW5kKGNtYikKICAgICAgICByZXR1cm4gYW5zCgoKcHJ1ZWJhMSA9IFJvbWFucygpCnByaW50KHBydWViYTEudG9fcm9tYW4oMzkpKQpwcmludChwcnVlYmExLnRvX2RlY2ltYWwoJ1hYWElYJykpCgpwcnVlYmEyID0gUGFyZW50cygpCnByaW50KHBydWViYTIudmFsaWRhcigiKClbXXt9IikpCnByaW50KHBydWViYTIudmFsaWRhcigiKHtbKV0iKSkKCnBydWViYTMgPSBTdWJjb25qcygpCnByaW50KHBydWViYTMuc3VicyhbNCwgNSwgNl0pKQo=