summaryrefslogtreecommitdiff
path: root/src/mobile.py
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2014-11-23 12:18:04 +0100
committerschneefux <schneefux+commit@schneefux.xyz>2014-11-23 12:18:04 +0100
commit5d3189d7345dd3b26a5753a16020ed4f7df0c4b1 (patch)
tree8b260aa3116d6a2cdf58950e332726a3678754d3 /src/mobile.py
parentc8aa48924b284512075432b042ca15c31394ed14 (diff)
downloadbwinf-33-5d3189d7345dd3b26a5753a16020ed4f7df0c4b1.tar.gz
bwinf-33-5d3189d7345dd3b26a5753a16020ed4f7df0c4b1.zip
Verschieben aller Dateien in Unterordner
Diffstat (limited to 'src/mobile.py')
-rwxr-xr-xsrc/mobile.py76
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))