"""
    return int that's the minimum number of 
    keypresses needed when the number of slots is given 
    by int parameter slots, and integer lists numbers 
    and howMany give information about dialing
    
    >>> speedDial([9753,1245987,4833,34473,8733,1437], [5,2,4,3,2,4], 4)
    52
    
    >>> speedDial([124839,9876,43823], [73,95,102], 5)
    540
"""
 
def speedDial1 (numbers, howMany, slots):
    keypresses = [ len(str(num)) * count for (num, count) in zip(numbers, howMany) ]
    total = 0
    for k in range(min(slots, len(numbers))):
        indexMax = keypresses.index(max(keypresses))
        total += 2 * howMany[indexMax]
    return  total + sum(keypresses)


def speedDial2 (numbers, howMany, slots):
    pressesMax = [ len(str(num)) * count for (num, count) in zip(numbers, howMany) ]
    pressesMin = [ 2 * n for n in howMany ]
    diff = sorted([ maxx - minn for (maxx,minn) in zip(pressesMax, pressesMin) ], reverse=True)[:slots]
    for k in range(len(diff)):
        pressesMax[k] = pressesMin[k]
    return sum(pressesMax)


def speedDial3 (numbers, howMany, slots):
    pressed = [ len(str(num)) * count for (num, count) in zip(numbers, howMany) ]
    saved = [ (num - 2) * count for (num, count) in zip(pressed, howMany) ]
    return sum(pressed) - sum(sorted(saved)[-slots:])






numbers = [1111,123456,654321,1234567,7654321,123456789,111222,2222]
howMany = [3,4,5,8,7,2,2,3]
slots = 4
expected = 102
print("actual = " + str(speedDial1(numbers, howMany, slots)) + ", expected = " + str(expected))
print("actual = " + str(speedDial2(numbers, howMany, slots)) + ", expected = " + str(expected))
print("actual = " + str(speedDial3(numbers, howMany, slots)) + ", expected = " + str(expected))
