diff options
Diffstat (limited to 'src/mobile.py')
| -rwxr-xr-x | src/mobile.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/mobile.py b/src/mobile.py new file mode 100755 index 0000000..481325c --- /dev/null +++ b/src/mobile.py @@ -0,0 +1,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)) |
