Google foobar gearing_up_for_destruction

后端 未结 9 636
醉话见心
醉话见心 2020-12-29 11:12

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

9条回答
  •  旧巷少年郎
    2020-12-29 11:53

    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    /
    

提交回复
热议问题