PythonCode bij Omgekeerde driehoek van PasCal

 

Programma 1

# Pascal driehoek met eigen getallen
# invoer: [a1, a2, .., an]
# uitvoer: TRUE / FALSE, bij TRUE: max, bij FALSE: 0
# [1, 2, 3, 4] > 0
# [4, 1, 2, 6] > x

def Pascal(S):
    errors = 0
    ls = len(S)
    T = []
    U = []
    V = []
    for s in S:
        T.append(s)
        V.append(s)
    for i in range(ls-1):
        lt = ls - i - 1
        for j in range(lt):
            s = T[j] + T[j+1]
            U.append(s)
            if s in V:
                errors += 1
            else:
                V.append(s)
        T = U
        U = []
    #print(V)
    if errors > 0:
        return 0
    #print(V)
    return T[0]

S = [[4,1,2,7], [5,1,2,6], [7,2,1,4,6]]
for s in S:
    print(s, Pascal(s))

Programma 2

# Poging 1
# Er wordt gebruik gemaakt van bovengenoemde procedure Pascal

import itertools

# afmeting 3
n = 3
m = 6
M = []
for mm in range(m):
    M.append(mm+1)
for c in itertools.permutations(M,n):
    p = Pascal(c)
    if p > 0:
        print(c, p)

Programma 3

# Poging 1, nu alleen resultaten die gelijk of beter dan voorafgaande 
# resultaten zijn.
# Er wordt gebruik gemaakt van bovengenoemde procedure Pascal

import itertools
import time

for nn in range(5):
    n = nn + 3
    print("Afmeting", n)
    m = 2 * n
    M = []
    minmax = 1000
    t0 = time.process_time()
    for mm in range(m):
        M.append(mm+1)
    for c in itertools.permutations(M,n):
        p = Pascal(c)
        if( p > 0) & (p <= minmax):
            print(c, p)
            minmax = p
    t1 = time.process_time()
    T = t1-t0
    D = 1
    while T < 1000:
        T *= 10
        D *= 10
    TT = round(T)
    print("Gebruikte tijd", TT/D)

print("Ready")

Programma 4

# Poging 2, er wordt vooraf berekend of het eindresultaat een verbetering is
# Er wordt gebruik gemaakt van bovengenoemde procedure Pascal

import itertools
import time
import sympy

def BerekenResultaat(S,n):
    sumB = 0
    for b in range(n):
        sumB += B[b] * S[b]
    return sumB

for nn in range(5):
    B = []
    n = nn + 3
    for b in range(n):
        B.append(sympy.binomial(n-1,b))
    print("Afmeting", n)
    m = 2 * n
    M = []
    minmax = 1000
    t0 = time.process_time()
    for mm in range(m):
        M.append(mm+1)
    for c in itertools.permutations(M,n):
        b = BerekenResultaat(c,n)
        if b <= minmax:
            p = Pascal(c)
            if p > 0:
                print(c, p)
                minmax = p
    t1 = time.process_time()
    T = t1-t0
    D = 1
    while T < 1000:
        T *= 10
        D *= 10
    TT = round(T)
    print("Gebruikte tijd", TT/D)

print("Ready")

Programma 5

# Poging 3, er wordt vooraf berekend of het eindresultaat een verbetering is
# Er wordt gebruik gemaakt van bovengenoemde procedure Pascal

import itertools
import time
import sympy

def BerekenResultaat(S,n):
    sumB = 0
    for b in range(n):
        sumB += B[b] * S[b]
    return sumB

RES = []
for nn in range(6):
    B = []
    n = nn + 3
    hn = (n+1) // 2 - 1
    for b in range(n):
        B.append(sympy.binomial(n-1,b))
    print("Afmeting", n)
    m = 2 * n
    M = []
    minmax = 1000
    t0 = time.process_time()
    for mm in range(m):
        M.append(mm+1)
    for c in itertools.permutations(M,n):
        errors = 0
        if c[hn] < 4:
            for i in range(hn):
                if c[hn-i] > c[hn-i-1] + 2:
                    errors += 1
            if errors == 0:
                for i in range(n-hn-1):
                    #print(n, hn, i, hn+i, hn+i+1)
                    if c[hn+i] > c[hn+i+1] + 2:
                        errors += 1
            if errors == 0:
                b = BerekenResultaat(c,n)
                if b <= minmax:
                    p = Pascal(c)
                    if p > 0:
                        print(c, p)
                        minmax = p
    t1 = time.process_time()
    RES.append(minmax)
    T = t1-t0
    D = 1
    while T < 1000:
        T *= 10
        D *= 10
    TT = round(T)
    print("Gebruikte tijd", TT/D)
print("Optimale resultaten:", RES)
print("Ready")