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 generate( arrSize ):
    random.seed(1234321)
    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 randomFill( arrSize, maxVal ):
    random.seed(1234321)
    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 quadruplesWithSum( a, Sum ):
    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 )
    printf( "Found %d quadruples.\n", num )


def triplesWithSum( arr, Sum ):
    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 )
    printf( "Found %d triples.\n", num )


def pairsWithSum( arr, Sum ):
    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 )
    printf( "Found %d pairs.\n", num )


# --------------------------------------------------------------------------------
#    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
# - number of nested loops


if False:
    arrSize = 10000
    array = generate( arrSize )
    pairsWithSum( array, 7 )

if False:
    arrSize = 1000
    array = generate( arrSize )
    triplesWithSum( array, 7 )

if False:
    arrSize = 20
    array = generate( arrSize )
    quadruplesWithSum( array, 9 )

if False:
    arrSize = 200
    array = randomFill( arrSize, 200 )
    triplesWithSum( array, 7 )

if True:
    arrSize = 200
    array = randomFill( arrSize, 60 )
    quadruplesWithSum( array, 9 )





