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
|
#!/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
r = list([(j, j) for j in figuren]) # der Input wird aufbereitet
f = split(r)
w = weight(f)
print(w)
|