blob: 3127099d5e30ad681876342c5a975c62272185b7 (
plain) (
tree)
|
|
#!/usr/bin/python2
# Fuel Injection Perfection
# =========================
# Commander Lambda has asked for your help to refine the automatic quantum
# antimatter fuel injection system for her LAMBCHOP doomsday device. It's a
# great chance for you to get a closer look at the LAMBCHOP - and maybe sneak
# in a bit of sabotage while you're at it - so you took the job gladly.
# Quantum antimatter fuel comes in small pellets, which is convenient since the
# many moving parts of the LAMBCHOP each need to be fed fuel one pellet at a
# time. However, minions dump pellets in bulk into the fuel intake. You need to
# figure out the most efficient way to sort and shift the pellets down to a
# single pellet at a time.
# The fuel control mechanisms have three operations:
# 1) Add one fuel pellet
# 2) Remove one fuel pellet
# 3) Divide the entire group of fuel pellets by 2 (due to the destructive
# energy released when a quantum antimatter pellet is cut in half, the safety
# controls will only allow this to happen if there is an even number of
# pellets)
# Write a function called solution(n) which takes a positive integer as a
# string and returns the minimum number of operations needed to transform the
# number of pellets to 1. The fuel intake control panel can only display a
# number up to 309 digits long, so there won't ever be more pellets than you
# can express in that many digits.
# For example:
# solution(4) returns 2: 4 -> 2 -> 1
# solution(15) returns 5: 15 -> 16 -> 8 -> 4 -> 2 -> 1
def change(b, n):
a = int("".join([str(x) for x in b]), 2) + n
return [int(i) for i in list("{0:b}".format(a))]
def solution(n):
if n == "1": return 0
if n == "2": return 1
b = [int(i) for i in list("{0:b}".format(int(n, 10)))]
c = 0
flag = True
while flag == True:
if (len(b) <= 2):
flag = False
continue
if b[-1] == 0:
c += 1
b.pop()
else:
if b[-2] == 1:
c += 1
b = change(b, 1)
else:
c += 1
b = change(b, -1)
if b[1] == 1:
c += 2
else:
c += 1
return c
def funny_add1(b):
b.reverse()
carry = 0
for i in range(0, len(b)):
if b[i] == 0:
b[i] = 1
break
else: #if b[i] == 1:
b[i] = 0
carry = 1
if i == len(b) - 1 and carry == 1:
b.append(1)
b.reverse()
return b
print(solution("19"))
print(solution("4")) # => 2
print(solution("15")) # => 5
|