summaryrefslogtreecommitdiff
path: root/mobile.py
blob: 86c0fdd0ecf77a25671db270c963feab50d4cfd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python3
from math import floor
import random

# python list mit Elementen in der Form (Position, [Gewicht oder Liste]), wobei Position auf der linken Seite negativ ist
Mobile = [(-4, [(-2, [(0, 1)]), (1, [(0, 2)])]), (-1, [(0, 2)]), (2, [(0, 3)]), (4, [(0, 2)])]

Figuren = [2, 3, 1, 2, 3]

# gibt eine Liste zurück, in der die Elemente aus `fig` auf 4er-Balken aufgeteilt sind
def split(fig):
    _fig = fig[:]
    if len(_fig) > 4:
        b = [[] for j in range(4)]
        for k, item in enumerate(_fig):
            b[k % 4].append(item)

        _fig = list(filter(None, b))

        b = []
        for f in _fig:
            summe = 0
            for (j, k) in f:
                summe += k

            weight = summe
            #        Gewicht   Inhalt
            b.append((weight, split(f)))

        _fig = b
    return _fig

# gibt ein ausgeglichenes Mobile zurück
def weight(fig):
    res = []

    if len(fig) % 2 == 1:
        # ist die Anzahl an Elementen ungerade, muss eines - hier das mittlerste - auf die Position 0
        middle = floor(len(fig) / 2)
        res.append((0, fig[middle][1]))
        del fig[middle]

    for j in range(len(fig)):
        # Die Position des Elements wird auf das Gewicht des gegenüberliegenden Elements gesetzt,
        # sodass sich jeweils das Element mit dem Gegenüber ausgleicht
        side = -1 if j < len(fig) / 2 else 1
        opposite = len(fig) - j - 1

        figure = list(fig[j])
        if type(figure[1]) is list:
            figure[1] = weight(figure[1])

        #             Position                Inhalt
        element = (fig[opposite][0] * side, figure[1])
        res.append(element)

    return res

def mobile(liste):
    r = list([(j, j) for j in liste]) # der Input wird aufbereitet
    f = split(r)
    w = weight(f)
    return w

if __name__ == "__main__":
    print(mobile(Figuren))