#1 18. Mai 2010 Hoi! Ich hab ein kleines Problem mit einer Aufgabe. Entweder ist sie so einfach, dass ich den Wald vor lauter Bäumen nicht sehe, oder ich verstehe es einfach nicht. Aufgabe: Die 6 Widerstände 10 Ω, 12 Ω, 15 Ω, 18 Ω, 22 Ω und 27 Ω werden zu einem Tetraeder verlötet. (an jeder Kante ein Widerstand, jede Ecke ist ein Knoten) Schreiben Sie ein Python-Programm, das folgendes ausgibt: a) Die Anzahl unterschiedlicher möglicher Widerstände zwischen zwei Ecken eines solchen Tetraeders, b) den niedrigsten und den höchsten dieser Widerstände, c) den größten prozentualen Sprung zwischen zwei aufeinanderfolgenden sortierten Widerständen. Mir geht es hier nicht um das Python Programm, noch um eine perfekte Lösung. Das Programm bekomme ich schon noch alleine hin, aber erstmal logisch gedacht: Eigentlich kann es zwischen zwei Knoten in einem Tetraeder nur 6 verschiedene Verbindungsstücke (Widerstände) geben, da diese alle verschieden sind. Ist es denn so einfach? Zwischen zwei Knoten befindet sich nur ein Widerstand, nicht mehrere. Bei der b) erkennt man ja einfach, dass es 10 und 27 sind, oder? Die c) könnte ich mir auch einfach ausrechnen lassen. Es reicht, wenn mir Jemand schon bei der a) helfen kann. Ich möchte wissen, was die Lösung ist, nicht das Programm, was hier verlangt ist. Will halt vermeiden, dass es an einem Verständnisproblem scheitert. greez + Multi-Zitat Zitieren
#2 18. Mai 2010 AW: Kombinatorik Würde das genau sehen wie du. Vielleicht liegt die Schwierugkeit der Aufgabe in der Programmumsetzung, damit kenn ih mich nciht aus wie komplex dieser Teil ist. + Multi-Zitat Zitieren
#3 18. Mai 2010 AW: Kombinatorik a) und b) seh ich ganz klar genau so wie du. c) ist meiner Meinung nach komisch gestellt, da verstehe ich dieses "aufeinanderfolgenden _sortierten_ Widerständen" nicht so ganz. Die Widerstände sind ja nicht in Reihe geschaltet, demnach gibt es in dem Sinne keine aufeinander folgenden Widerstände, da immer 3 verschiedene an einem der 4 Knoten hängen. + Multi-Zitat Zitieren
#4 18. Mai 2010 AW: Kombinatorik Hab die b und c nun so gelöst: Code: l = [10, 12, 15, 18, 22, 27] #b print("Aufgabe b)") l.sort() print(l[0], "= kleinster Widerstand,", l[len(l) - 1], "= groesster Widerstand") #c print("Aufgabe c)") l.sort() biggest = (0, 0, 0) for i in range(len(l)): if i + 1 <= len(l) - 1: if l[i+1] / l[i] > biggest[2]: biggest = (l[i], l[i+1], l[i+1] / l[i]) print("Groesster prozentualer Sprung zwischen:", biggest[0], "und", biggest[1], "-> ", str((biggest[2]-1)*100) + "%") Damit bekomme ich den kleinsten und größten Widerstand bei b) (wenn die Liste sortiert ist) und bei c) bekomme ich die Zahlen 12 und 15, da der prozentuale Sprung dazwischen 25% beträgt und damit am größten ist. Vielleicht fällt noch wem was nettes für die a) ein Danke schonmal, BWs sind raus! greez //edit: @Kurdish: ich glaube, dass er mit "aufeinanderfolgend" nur meint, dass sie in aufsteigender Reihenfolge in einer Liste sortiert sind. + Multi-Zitat Zitieren
#5 18. Mai 2010 AW: Kombinatorik Oh bei den Aufgaben kann Python richtig seine Stärken zeigen, das will ich auch nicht vorenthalten: Code: # enable floating point division: 1/2 = 0.5, 1//2 = 0 from __future__ import division import operator def faculty(n): """returns the faculty of n for an integer n > 0""" return reduce(operator.mul, range(1, n+1)) def main(): l = sorted((10, 12, 15, 18, 22, 27)) print 'a) %s' % faculty(len(l)) print 'b) smallest: %s, biggest: %s' % (l[0], l[-1]) print 'c) %.f%%' % sorted((a/b-1)*100 for a, b in zip(l[1:], l[:-1]))[-1] if __name__ == '__main__': main() + Multi-Zitat Zitieren
#6 18. Mai 2010 AW: Kombinatorik Oh man, List comprehensions, wie ich sie total vergessen habe. Habe sie nun auch eingebaut und damit ist es viel eleganter. Aber sicher, dass 6! bei der a richtig ist? Ich glaub irgendwie nicht :/ BW hast dennoch bekommen Hier mal mein Code: Code: #a l = [] for p in permutations([10, 12, 15, 18, 22, 27]): if not p[0] in l: l.append(p[0]) l.sort() print("Aufgabe a):", len(l), "ist die Anzahl der moeglichen Widerstaende zwischen zwei Knoten") #b print("Aufgabe b):", l[0], "= kleinster Widerstand,", l[-1], "= groesster Widerstand") #c biggest = sorted([(b, a, (a/b-1)*100) for a, b in zip(l[1:], l[:-1])], key = lambda x: x[2])[-1] print("Aufgabe c): Groesster prozentualer Sprung zwischen:", biggest[0], "und", biggest[1], "-> ", str(biggest[2]) + "%") greez + Multi-Zitat Zitieren