I was doing the google foobar challenge but ran out of time on the following challenge i am trying to see what i did wrong.
Challenge
As
a passed solution:
from fractions import Fraction
def solution(p):
n = len(p)
if n >= 2:
r0_n = -2 * (p[n - 1] + reduce(
lambda a, b: a + b, [0] + [(-1)**i * 2 * p[i]
for i in range(n - 2, 0, -1)]) + (-1)**(n-1)*p[0])
r0_d = 1 + ((n+1) % 2)*2
if r0_n < r0_d:
return [-1, -1]
r = ['NAN'] * n
r[0] = float(r0_n) / float(r0_d)
for i in range(1, n):
r[i] = p[i] - p[i - 1] - r[i - 1]
if r[i] < 1:
return [-1, -1]
r0 = Fraction(r0_n, r0_d)
r0.limit_denominator()
return [r0.numerator, r0.denominator]
return [-1, -1]
some tests:
if __name__ == '__main__':
print solution([4, 30, 50]), [12, 1]
print solution([4, 17, 50]), [-1, -1]
print solution([1, 51]), [100, 3]
print solution([1, 31]), [20, 1]
print solution([1, 31, 51, 71]), [20, 1]
print solution([1, 31, 51, 71, 91]), [20, 1]
print solution([4, 9, 17, 31, 40]), [4, 1]
output:
[12, 1] [12, 1]
[-1, -1] [-1, -1]
[100, 3] [100, 3]
[20, 1] [20, 1]
[20, 1] [20, 1]
[20, 1] [20, 1]
[4, 1] [4, 1]
some thinking
# equaltion | i
# ---------------------|---
# / r0 + r1 == p1 - p0 [0]
# | r1 + r2 == p2 - p1 [1]
# | r2 + r3 == p3 - p2 [2]
# | r3 + r4 == p4 - p3 [3]
# | r4 + r5 == p5 - p4 [4]
# \ r5 == r0/2 [5]
#
#
# / r0 + r1 + 0 + 0 + 0 + 0 = p1 - p0
# | 0 + r1 + r2 + 0 + 0 + 0 = p2 - p1
# | 0 + 0 + r2 + r3 + 0 + 0 = p3 - p2
# | 0 + 0 + 0 + r3 + r4 + 0 = p4 - p3
# | 0 + 0 + 0 + 0 + r4 + r5 = p4 - p4
# \ r0 + 0 + 0 + 0 + 0 - 2*r5 = 0
#
# / 1 1 0 0 0 0 \ / r0 \ / p1 - p0 \
# | 0 1 1 0 0 0 | | r1 | | p2 - p1 |
# | 0 0 1 1 0 0 | | r2 | | p3 - p2 |
# | 0 0 0 1 1 0 | * | r3 | = | p4 - p3 |
# | 0 0 0 0 1 1 | | r4 | | p5 - p4 |
# \ 1 0 0 0 0 -2 / \ r5 / \ 0 /