import random
import time
import sys

# --------------------------------------------------------------------------------
#    U T I L I T I E S

def printf(format, *args):
    sys.stdout.write(format % args)

printLim = 200 # if array len is bigger than printLim it will not be printed

# --------------------------------------------------------------------------------
#    S I M P L E    A R R A Y   G E N E R A T O R S

def generateShuffled( arrSize ):
    random.seed(time.time())
    t1 = time.time()
    zz = list(range(arrSize)) # create list [0,1,2, ..., n-1 ]
    random.shuffle(zz)
    t2 = time.time()
    #printf("time shuffling %f\n", t2-t1  )
    if arrSize <= printLim: print(zz)
    return zz

def randomArray( arrSize, maxVal ):
    random.seed(time.time())
    t1 = time.time()
    zz = [0] * arrSize
    for i in range( arrSize ):
        zz[i] = random.randint(0, maxVal)
    random.shuffle(zz)
    t2 = time.time()
    #printf("time shuffling %f\n", t2-t1  )
    if arrSize <= printLim:
        print(zz)
    return zz


# --------------------------------------------------------------------------------
#    F I N D    T U P L E S   W I T H   S P E C I F I C  P R O P E R T I E S

def pairsWithSum( arr, Sum ):
    t1 = time.time()
    num = 0
    for i in range( 0, len(arr)-1 ):
        for j in range( i+1, len(arr) ):
                if arr[i] + arr[j] == Sum:
                    num += 1
                    #printf( "%d.  %d+%d = %d\n", \
                    #num, arr[i], arr[j],  Sum )
    t2 = time.time()
    printf( "Found %d pairs.\n", num )
    printf( "Time  %d ms\n", 1000*(t2-t1) )


def triplesWithSum( arr, Sum ):
    t1 = time.time()
    num = 0
    for i in range( 0, len(arr)-2 ):
        for j in range( i+1, len(arr)-1 ):
            for k in range( j+1, len(arr) ):
                if arr[i] + arr[j] + arr[k] == Sum:
                    num += 1
                    #printf( "%d.  %d+%d+%d = %d\n", \
                    #       num, arr[i], arr[j], arr[k], Sum )
    t2 = time.time()
    printf( "Found %d triples.\n", num )
    printf( "Time  %d ms\n", 1000*(t2-t1) )

def quadruplesWithSum( a, Sum ):
    t1 = time.time()
    num = 0
    for i in range( 0, len(a)-3 ):
        for j in range( i+1, len(a)-2 ):
            for k in range( j+1, len(a)-1 ):
                for m in range( k+1, len(a) ):
                    if a[i] + a[j] + a[k] + a[m]== Sum:
                        num += 1
                        #printf( "%d.  %d+%d+%d+%d = %d\n", \
                        #    num, a[i], a[j], a[k], a[m], Sum )
    t2 = time.time()
    printf( "Found %d quadruples.\n", num )
    printf( "Time  %d ms\n", 1000*(t2-t1) )






# --------------------------------------------------------------------------------
#    A R E A   F O R   E X P E R I M E N T S
# --------------------------------------------------------------------------------
# modify the size of arrays and check how long does it take to process the array
# - to check all tuples -
#  depending on the size of the array and the complexity of the task

if True:
    arrSize = 15
    maxvalue = arrSize
    array = randomArray( arrSize, maxvalue )
    pairsWithSum( array, 12 )

if True:
    arrSize = 15
    maxvalue = arrSize
    array = randomArray( arrSize, maxvalue )
    triplesWithSum( array, 12 )

if True:
    arrSize = 15
    array = randomArray( arrSize, maxvalue )
    quadruplesWithSum( array, 12 )





