#!/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 def mobile(liste): r = list([(j, j) for j in liste]) # der Input wird aufbereitet f = split(r) w = weight(f) return w if __name__ == "__main__": print(mobile(Figuren))