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))
|