summaryrefslogblamecommitdiffstats
path: root/3.3.py
blob: 663d6f1bf41619270fe67587a3abfe09ed6d1c34 (plain) (tree)































































































                                                                               
#!/usr/bin/python2

# Find the Access Codes
# =====================

# In order to destroy Commander Lambda's LAMBCHOP doomsday device, you'll need
# access to it. But the only door leading to the LAMBCHOP chamber is secured
# with a unique lock system whose number of passcodes changes daily. Commander
# Lambda gets a report every day that includes the locks' access codes, but
# only she knows how to figure out which of several lists contains the access
# codes. You need to find a way to determine which list contains the access
# codes once you're ready to go in.

# Fortunately, now that you're Commander Lambda's personal assistant, she's
# confided to you that she made all the access codes "lucky triples" in order
# to help her better find them in the lists. A "lucky triple" is a tuple (x, y,
# z) where x divides y and y divides z, such as (1, 2, 4). With that
# information, you can figure out which list contains the number of access
# codes that matches the number of locks on the door when you're ready to go in
# (for example, if there's 5 passcodes, you'd need to find a list with 5 "lucky
# triple" access codes).

# Write a function solution(l) that takes a list of positive integers l and
# counts the number of "lucky triples" of (li, lj, lk) where the list indices
# meet the requirement i < j < k. The length of l is between 2 and 2000
# inclusive. The elements of l are between 1 and 999999 inclusive. The answer
# fits within a signed 32-bit integer. Some of the lists are purposely
# generated without any access codes to throw off spies, so if no triples are
# found, return 0.

# For example, [1, 2, 3, 4, 5, 6] has the triples: [1, 2, 4], [1, 2, 6], [1, 3,
# 6], making the answer 3 total.


# Test cases
# ==========
# Your code should pass the following test cases.
# Note that it may also be run against hidden test cases not shown here.

# Input:
# solution.solution([1, 2, 3, 4, 5, 6])
# Output:
#     3

# Input:
# solution.solution([1, 1, 1])
# Output:
#     1
    
## O(n^2)
def solution(l):
    c = [0] * len(l)
    count = 0
    for i in range(0, len(l)):
        for j in range(0, i):
            if l[i] % l[j] == 0:
                c[i] = c[i] + 1
                count = count + c[j]
    return count

## O(n^3)
def solution2(l):
    c = 0
    while len(l) > 2:
        t = l[1:]
        for id,i in enumerate(t):
            if i % l[0] == 0:
                for j in t[(id + 1):]:
                    if j % i == 0:
                        c += 1
        l = l[1:]
    return c

## Way too much memory, it's not even funny
## python is supposed to do list comprehension in a good way, lol
def solution3(l):
    return len([(i, j, k)
                for id,i in enumerate(l)
                for jd,j in enumerate(l[(id+1):])
                for k in l[(id+jd+2):]
                if j%i==0 and k%j==0])

def solve(l):
    print(l)
    print(solution(l))

solve([1, 2, 3, 3, 5, 2])
solve([1, 2, 3, 4, 5, 6])
solve([1, 2, 3, 3, 2, 1])
solve([1 for x in xrange(2000)])
solve([1, 1, 1])
solve([])
solve([2])
solve([2, 5])
solve([1, 5, 6])
solve([1, 999999, 2])