#!/usr/bin/env python3 # -*- coding: utf-8 -*- '''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 = 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))