summaryrefslogtreecommitdiff
path: root/src/mobile.py
blob: 481325ce7857a2598483865508016674fd6ed78e (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
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# getestet mit Python 2.7.8 und 3.4.2
'''Verteilt und gleicht ein Mobile aus'''

from math import floor

# 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]

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

        _fig = list(filter(None, temp))

        temp = []
        for afig in _fig:
            summe = 0
            for (_, k) in afig:
                summe += k

            myweight = summe
            #            Gewicht   Inhalt
            temp.append((myweight, split(afig)))

        _fig = temp
    return _fig

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

    if len(fig) % 2 == 1:
        # ist die Anzahl an Elementen ungerade,
        # muss eines - hier das mittlerste - auf die Position 0
        middle = int(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):
    '''erstellt ein Mobile aus einer Liste von Figuren'''
    inp = list([(j, j) for j in liste]) # der Input wird aufbereitet
    splitted = split(inp)
    weighted = weight(splitted)
    return weighted

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