Programmatuur bij Drie op een Rij

# Eerste programma
# invoer is een rij van getallen, 
# uitvoer is maximum en de gesorteerde rij sommen, indien de sommen allen verschillen
# Er wordt gebruik gemaakt van de functie MaxSommen en VerschilSommen

# MaxSommen bepaalt het maximum van de sommen
def MaxSommen(S):
    ls = len(S)
    m = 0
    for i in range(0,ls-2):
        som = S[i] + S[i+1] + S[i+2]
        if som > m:
            m = som
    som = S[0] + S[ls-2] + S[ls-1]
    if som > m:
        m = som
    som = S[0] + S[1] + S[ls-1]
    if som > m:
        m = som
    return m

def VerschilSommen(S):
    ls = len(S)
    Sommen = []
    for i in range(0,ls-2):
        Sommen.append(S[i] + S[i+1] + S[i+2])
    Sommen.append(S[0] + S[ls-2] + S[ls-1])
    Sommen.append(S[0] + S[1] + S[ls-1])
    Sommen.sort()
    ok = 0
    for i in range(0,ls-2):
        if Sommen[i] == Sommen[i+1]:
            ok += 1
    if ok == 0:
        return Sommen
    else:
        return []

print(MaxSommen([1,2,3,4,5]))
print(VerschilSommen([1,2,3,4,5]))

 

# Tweede programma: Het doorlopen van n! mogelijkheden

# bron: https://www.geeksforgeeks.org/permutation-and-combination-in-python/
# A Python program to print all permutations using library function 

# hierboven staan de twee procedures die worden gebruikt.

import time
from itertools import permutations 
  
# Get all permutations of [1, 2, 3, ..., n] 

minN = 4         # kleinste waarde voor n
maxN = 11        # grootste waarde voor n
MINMAX = [6]     # lijst van minmax vanaf 3
MINMAXCNT = [1]  # lijst van aantallen oplossingen vanaf 3 (minmax)
VSOMMENCNT = [1] # lijst van aantallen oplossingen vanaf 3 (vsommen)
for nn in range(maxN - minN + 1):
    n = nn + minN
    perms = permutations(range(1,n)) # hiermee worden alle permutaties van 1 .. n-1 gemaakt
    # print("aantal elementen:", n)
    # Print the obtained permutations 
    t0 = time.process_time()
    minmax = 3*n   # minimum van maximum
    vsommen = 2*n  # verschil van grootste en kleinste van de verschillende sommen
    minmaxcnt = 0  # aantal oplossingen bij minmax
    vsommencnt = 0 # aantal oplossingen bij vsommen
    VBmtot = []    # voorbeeld bij minmax
    VBvtot = []    # voorbeeld bij vsommen
    ResSommen = [] # resultaat van uitkomst van vsommen (gesorteerd)
    for perm in list(perms):       # we gaan alle permutaties stuk voor stuk bekijken
        if perm[0] < perm[n-2]:    # de helft van de permutaties kunnen we overslaan
            L = list(perm)
            L.append(n)            # we voegen uiteindelijk n toe
            m = MaxSommen(L)       # procedure uitvoeren
            v = VerschilSommen(L)  # procedure uitvoeren
            if m < minmax:         # een beter resultaat
                VBmtot = L         # een nieuw voorbeeld
                minmax = m         # minmax aanpassen
                minmaxcnt = 0      # aantal oplossingen resetten
            if m == minmax:        # bij een gelijk resultaat
                minmaxcnt += 1     # het aantal oplossingen verhogen met 1
            if len(v) > 0:         # als len(v) == 0, dan zijn niet alle sommen verschil..
                vmin = v[0]
                vmax = v[n-1]
                vv = vmax-vmin     # verschil van grootste en kleinste verschil
                if vv < vsommen:   # een beter resultaat
                    VBvtot = L     # een nieuw voorbeeld
                    vsommen = vv   # vsommen aanpassen
                    ResSommen = v  # we bewaren de verschillende sommen
                    vsommencnt = 0 # aantal oplossingen resetten
                if vv == vsommen:
                    vsommencnt += 1 # aantal oplossingen verhogen met 1
    t1 = time.process_time()
    MINMAX.append(minmax)          # Toevoegen van minmax in de lijst van oplossingen
    MINMAXCNT.append(minmaxcnt)    # Toevoegen van minmaxcnt in de lijst van oplossingen
    VSOMMENCNT.append(vsommencnt)  # Toevoegen van vsommencnt in de lijst van oplossingen
    print(n, ": minmax:", minmax, ", verschillende sommen:", ResSommen)
    print("     aantal oplossingen minmax:", minmaxcnt, "voorbeeld:", VBmtot)
    print("     aantal oplossingen sommen:", vsommencnt, "voorbeeld:", VBvtot)
    T = t1-t0
    D = 1
    while T < 1000:
        T *= 10
        D *= 10
    TT = round(T)
    print("     Gebruikte tijd", TT/D)
print("minmax", MINMAX)
print("minmax aantallen", MINMAXCNT)
print("sommen aantallen", VSOMMENCNT)