diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2014-11-21 20:25:24 +0100 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2014-11-21 20:25:24 +0100 |
| commit | 0d70b4ed80c0c04549ec8da4871eace2aebc608e (patch) | |
| tree | 22c15ec8c5841745d20dba7ae605443ef23f6472 | |
| parent | 4f7322ae784962174b8dbb6a8c307f7dac478a0a (diff) | |
| download | bwinf-33-0d70b4ed80c0c04549ec8da4871eace2aebc608e.tar.gz bwinf-33-0d70b4ed80c0c04549ec8da4871eace2aebc608e.zip | |
Dokumentation Mobile
| -rw-r--r-- | mobile.md | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/mobile.md b/mobile.md new file mode 100644 index 0000000..af55d3d --- /dev/null +++ b/mobile.md @@ -0,0 +1,42 @@ +Mobile +====== + +Textuelle Darstellung +--------------------- + +Die textuelle Darstellung setzt sich aus einer Liste von Position-Gewichts-Tuples zusammen. Ein Gewicht ist hierbei ebenfalls eine Liste. Positionen sind auf der einen Seite negativ, auf der anderen positiv. +Ein Balken lässt sich daran erkennen, dass er mehr als ein Gewicht hat. Eine Figur ist an der Position 0 mit dem Gewicht der entsprechenden Figur. +Beispiel für ein Mobile mit einer Figur des Gewichts 2: `[(0, 2)]` +Beispiel für einen Balken mit zwei Figuren des Gewichts 3: `[(-3, 3), (3, 3)]` + +Das abgebildete Mobile sieht in der textuellen Darstellung wie folgt aus: +``` +[(-4, [(-2, [(0, 1)]), (1, [(0, 2)])]), (-1, [(0, 2)]), (2, [(0, 3)]), (4, [(0, 2)])] +``` + +Umsetzung +--------- + +Die Lösung besteht aus zwei Funktionen, `split(alle_Figuren_an_einem_Balken)`, welche eine textuelle Darstellung verteilt. Diese eingehende Darstellung ist ein einziger Balken mit allen Figuren, die mithilfe dieser Funktion ausgeglichen werden. Im Endergebnis hat dann jeder Balken maximal vier Gewichte. Die Liste, die zurückgegeben wird, ähnelt der textuellen Darstellung, jedoch ist statt der Position das Gewicht des Gewichts in dem Tuple enthalten. +Diese Liste wird von der zweiten Funktion `weight(Liste_erstellt_durch_split)` angeglichen. +Aus Benutzerfreundlichkeitsgründen fasst eine dritte Funktion `mobile(List)` diese zwei zusammen. Sie benötigt nur noch eine Liste aller Gewichte für das Mobile. + +Die Funktion `split` sortiert alle Items der mitgelieferten Liste in vier Plätze ein (realisiert mit dem Modulo-Operator). Das Gesamtgewicht dieser vier Plätze wird berchnet, dann wird jedes Gewicht in diesen vier Plätzen durch einen rekursiven Funktionsaufruf erneut verteilt. + +`weight` berechnet die Position mit der Gegenzahl des Gesamtewichts des Gewichts an der gegenüberliegenden Position. Ist die Anzahl an Gewichten auf dem Balken ungerade, wird ein Gewichte in die Mitte (Position 0) platziert. +Durch diese Verteilung gleichen sich die jeweils äußersten und innersten Gewichtpaare aus. Auch diese Funktion ruft sich selbst auf, um die Gewichte von der Spitze des Mobiles hinab bis zu den Figuren alle zu verteilen. + +Beispiele +--------- + +``` +>>> import mobile +>>> mobile.mobile([1, 4]) +[(-4, 1), (1, 4)] +>>> mobile.mobile([4, 6, 2, 3]) +[(-3, 4), (-2, 6), (6, 2), (4, 3)] +>>> mobile.mobile([1, 3, 5, 2, 3, 6]) +[(-2, [(-3, 1), (1, 3)]), (-5, [(-6, 3), (3, 6)]), (9, [(0, 5)]), (4, [(0, 2)])] +>>> mobile.mobile([4, 6, 2, 3, 45, 6, 3, 6, 1, 8, 5, 3, 67, 24]) +[(-12, [(-67, 4), (-1, 45), (45, 1), (4, 67)]), (-10, [(-24, 6), (-8, 6), (6, 8), (6, 24)]), (44, [(0, 3), (-5, 2), (2, 5)]), (117, [(0, 6), (-3, 3), (3, 3)])] +``` |
