Übungen / Aufgaben zu Python

1 Lösung Lösung noch nicht öffentlich
Simulation eines Staubsaug-Roboters
Fortgeschrittener - Python von hollst - 22.11.2017 um 22:14 Uhr
Ich bin im Haushalt ein ziemlich fauler Hund. Meine Frau weiß das und so hielt sie mich deshalb kürzlich an, wenigstens hin und wieder das Wohnzimmer zu saugen. Nun gut, mir kam die geniale Idee, dafür einen Staubsaug-Roboter zu kaufen. Gesagt, getan. Meine Frau runzelte zwar, aber letzt­lich war ihr das egal, wichtig war ja nur, dass sie etwas von der Hausarbeit entlastet wird.

Das Gerät überraschte mich von Anfang an. Es fährt immer geradeaus bis es irgendwo anstößt. Dann dreht es sich auf der Stelle in eine zufällige andere Richtung und fährt wieder weiter gerade­aus bis zum nächsten Hindernis. Es teilt mir auch sprachlich z. B. mit, wenn der Akku fast leer ist, es jetzt eine Pause machen wird und zur Ladestation fährt. Andermal sagte es, dass sein Haupt­speicher (sprich Staubsammeltüte) voll ist und ich ihn leeren solle. Das übernimmt natürlich meine Frau, denn bei einem solchen mechanischen Eingriff hat sie kein Vertrauen zu mir.

Der Gipfel war aber, als der Roboter mir bei der gestrigen Arbeit mitteilte, dass er fertig sei und im Zimmer der gesamten Fußboden gereinigt ist.

Das ist doch unmöglich, woher will er das wissen. Und "der gesamte Fußboden" geht schon gar­nicht, denn in die Ecken kommt er ja sowieso nicht. Ich war immer der Meinung, dass er erst fertig zu sein hat, wenn er abgeschaltet wird. Aber Nein sagte meine Frau, das macht er immer so, ich soll­te ihn, wie vereinbart war, nur hin und wieder selbst einsetzen und beobachten (beobachtet wird das Gerät bisweil immer nur von unserer Hauskatze).

Ich wurde neugierig und las entgegen meinen Gewöhnheiten auch die Betriebsanleitung. In der Tat stand darin, dass der Roboter anhält, wenn er mehr als 95 % der Fußbodenfläche gesaugt hat.

Ich dachte, nun gut, 95 % ist okay, aber, wie will er das wissen. Da muss schon eine ziemlich clevere Software im Roboter stecken. Prinzipiell kann man zwar die besaugte Fläche bei Kenntnis der Fahr­geschwindigkeit, der Anstoßpunkte und der neuen Fahrtrichtungen berechnen. Die Flächenseg­mente, die durch das Zufallsprinzip bereits besaugt worden ware, sind entsprechend zu berücksich­tigen (abzuziehen). Alles mathematisch recht kom­pliziert.

Der Gedanke, es statt einer mathematischen Berechnung durch eine informathematische Simulation abzuschätzen, legt auf der Hand. Dies soll daher die Aufgabenstellung sein.

Ausgehend von einer beliebigen Startposition auf einer leeren, rechteckigen Fläche F = LX x LY, mit LX und LY als Seitenlängen des Rechtecks, einer vorgegebenen Fahrgeschwindigkeit V und einer zufälli­gen Richtungsände­rung bei Zusammenstoß mit einem Hindernis (Wand) ist der Anteil besaugter Fläche bzgl. der Gesamtfußbodenfläche wie folgt anzuschätzen:

Auf einem zu Beginn 100 % mit "Staubpixeln" belegten Rechteck wird ein Staubsaug-Roboter mit dem Radius R gesetzt und fährt per Zufall gewählter Richtung staubsaugend geradeaus (Geschwin­digkeit V). Bei Berührung einer Wand ändert er zufällig seine Fahrtrichtung. Während der Fahrt werden alle überfahrenen "Staubpixeln" durch "Reinpixel" ersetzt (siehe Abb. 1). Die Fahrt endet, wenn P_okay = 95 % der Rechtecksfläche mit "Reinpixeln" belegt ist.
0 Lösungen
Onkel Otto sitzt in der Badewanne
Profi - Python von Kath - 16.11.2017 um 15:26 Uhr
Schreibe ein Programm, welches das Spiel "Onkel Otto sitzt in der Badewanne" simuliert. Dabei geht es darum, dass jeder der Spieler ein gefaltetes Blatt mit 6 aufgezeichnete Spalten vor sich hat und in einer etwas eintragen muss. Danach wird das Blatt weitergereicht und der nächste Spieler füllt die nächste Spalte aus, solange bis keine mehr frei ist; dann werden die enstandenen Sätze vorgelesen.

Zur Vereinfachung kann jeder Spieler jeweils nacheinander ein Wort eingeben in seinem Client. Die eingegebenen Worte sollen an einen Server geschickt, dem jeweiligen Spiel ( jedes gestartete Spiel soll einen anderen Namen bekommen ) zugeordnet und anschließend die vollständigen Sätze an alle Clients zurückschicken, die an dem jeweiligen Spiel teilgenommen haben.

Designvorschlag für Homescreen: siehe Anhang

Aufgabe: Schreibe den Code für den Client und für den Server!
1 Lösung Lösung noch nicht öffentlich
Gaußsche Primzahlendecke
Fortgeschrittener - Python von hollst - 07.11.2017 um 12:18 Uhr
Die Gaußsche Primzahlendecke soll als Textilie in den 60er Jahren in den USA ein echter Verkaufsschlager gewesen sein.
Es handelt sich dabei um ein (weißes) Tuch, das entsprechend der Verteilung der Primzahlen in der (komplexen) Gaußschen
Ebene bestickt ist. Genau ein solches Muster wollen auch wir hier mittels Coding erzeugen (Abb. 1).

Während die Sache mit den "normalen" Primzahlen recht einfach zu verstehen ist (Primzahl ist eine Ganzzahl, die nur durch
sich selbst bzw. durch EINS ohne Rest teilbar ist), ist das mit den komplexen Primzahlen schon etwas schwieriger, wir haben
es hier schließlich mit einem Zahlenpaar (Real- und Imaginärteil) zu tun. Besonders interessant ist, das einige "normale"
Primzahlen (z. B. 13 = (3 + 2 * i) * (3 - 2 * i)) keine komplexen Primzahlen sind (was sag ich einige, es sind unendlich viele).

Ohne uns vertiefend mit der Zahlentheorie zu beschäftigen, hier die wesentlichen Voraussetzungen für die Programmierung:

Eine komplexe Integerzahl Z = X + i * Y (X (Realteil), Y (Imaginärteil) Ganzahlen, i * i = -1) heißt Gaußsche Primzahl,
wenn sie eine der drei folgenden Bedingungen erfüllt:

1. Wenn sowohl X als auch Y ungleich 0 sind, dann ist Z eine Gaußsche Primzahl, wenn (X * X + Y * Y) eine "normale" Primzahl ist,
2. ist X = 0, dann ist Z = i * Y Gaußsche Primzahl, wenn Y "normale" Primzahl ist und wenn |Y| = 3 (mod 4) (oder in c#: Math.Abs(Y) % 4 == 3) ist,
3. ist Y = 0, dann ist Z = X Gaußsche Primzahl, wenn X "normale" Primzahl ist und wenn |X| = 3 (mod 4) ist.

Die Programmieraufgabe bestehe nun darin, die Gaußschen Primzahlen für {|X|, |Y|} <= N (z. B. N = 50, Abb. 2 (nur erster Quadrant))
graphisch darzustellen.
0 Lösungen
Anzahl möglicher Objektkombinationen
Fortgeschrittener - Python von mty - 16.10.2017 um 19:13 Uhr
Ich möchte die Anzahl aller möglicher Objektkombinationen Z haben, die zu einer bestimmten Anzahl N möglich sind.

Eingabe:

ARRAY Z : object a, object b, object c, object d ... etc
INTEGER N: 10

Ausgabe:
a a a a a a a a a a
a a a a a a a a a b
a a a a a a a a b b
a a a a a a a b b b
a a a a a a b b b b
a a a a a b b b b b
a a a a b b b b b b
a a a b b b b b b b
a a b b b b b b b b
a b b b b b b b b b
b b b b b b b b b b
b b b b b b b b c c
b b b b b b b c c c
b b b b b b c c c c
b b b b b c c c c c
b b b b c c c c c c
....... usw.

Die Anzahl der Objektkombinationen Z kann nicht größer sein als die Anzahl N. Das ganze soll vom Benutzer eingestellt werden können.
Zusätzlich soll das Ergebnis in einem Array gespeichert werden und dann eine eindeutige Eigenschaft jedes Objektes ausgegeben werden können.

Wer will kann sich gerne Versuchen.




1 Lösung Lösung noch nicht öffentlich
Zählen von Flächensegmenten
Fortgeschrittener - Python von hollst - 09.10.2017 um 09:21 Uhr
1) Gegeben sei ein Quadrat mit der Seitenlänge L (z. B. L = 1).

2) Man wähle zufällig N Punktepaare auf den Seitenlinien des Quadrates, wobei nicht beide Punkte auf der gleichen Seitenlinie liegen dürfen.

3) Die Punkte eines Punktepaares werden nun jeweils durch eine Linie miteinander verbunden. Auf diese Weise wird die Fläche des Quadrates
in eine Vielzahl von Flächensegmenten unterteilt - siehe exemplarisch die zwei Abb. 1 und 2 mit N = 5 bzw. N = 6.

4) Man schreibe ein Programm, das die Anzahl der auf die Weise erzeugten Flächensegmente zurückgibt.
5 Lösungen Lösungen öffentlich
Zahlen umwandeln: Binär zu Dezimal
Anfänger - Python von Nachbar - 13.09.2017 um 14:19 Uhr
Schreibe eine Funktion, die Zahlen aus dem Dualsystem in Zahlen des Dezimalsystems umwandelt.

Beispiel:

Binär: 11010
Dezimal: 26
1 Lösung Lösung noch nicht öffentlich
Ermittlung der Periodenlänge einer unendlichen Zahlenfolge
Anfänger - Python von hollst - 12.09.2017 um 12:58 Uhr
Wir betrachten eine Zahlenfolge N mit den Parametern n0, a, b und m (alles natürliche Zahlen > Null),
die iterativ definiert ist durch

N(i + 1) = (a * N(i) + b) mod m

und

N(0) = n0.

Diese Zahlenfolge wird naturgemäß ab einem bestimmten Startglied periodisch weiterverlaufen mit einer
Periodenlänge F, wobei immer 0 < F < m + 1 sein wird.

Man schreibe ein Program, das die Parameter n0, a, b und m als natürliche Zahlen entgegennimmt und
die Periodenlänge F rückgibt.

Anmerkung: Im Falle F = m stellen die Glieder einer Periode von N Pseudo-Zufallszahlen mit dem Bereich 0 ... m - 1 dar,
man kann somit seinen eigenen Zufallsgenerator kreiren (ist allerdings nicht (kaum) geeignet für kryptische Verschlüsselungen,
da relativ leicht "knackbar").
0 Lösungen
Maximale Zügezahl beim Springerschachspiel
Fortgeschrittener - Python von hollst - 02.09.2017 um 16:50 Uhr
Wir betrachten ein vom Schachspiel abgeleitetes Spiel, bei dem
lediglich die vier Springer mitwirken (Abb. 1). Das Spiel hat
weder Gewinner noch Verlierer (wird manchmal als Lernübung für das
Schachspiel verwendet, insbesondere, um die eigenartige Gangart
des Springers zu verinnerlichen). Die vier Springer stehen in ihrer
normalen Ausgangsstellung und können in der beim Schach üblichen
Art ziehen und schlagen. Weitere Figuren sind auf dem Schachbrett
nicht vorhanden. Weiß und Schwarz ziehen abwechselnd, Weiß beginnt.

Eine Partie ist beended, wenn eine der zwei folgenden Bedingungen
erfüllt ist:

1. Einer der zwei Spieler hat lediglich nur noch einen Springer
- in diesem Fall könnte man auch vereinbaren, dass der Spieler
mit den zwei Springern als Sieger gewertet wird.
2. Es ist mit dem letzten Zug eine Stellug entstanden, die im
Verlaufe des Spieles breits einmal zuvor auf dem Brett war.

Die Programmieraufgabe besteht darin, die hinsichtlich der
Zügezahl längst mögliche Zugfolge(n) zu ermitteln.
3 Lösungen Lösungen öffentlich
Groß- und Kleinuchstaben
Anfänger - Python von MeLThRoX - 22.08.2017 um 19:03 Uhr
Erstelle ein Programm, welches in einem String die Kleinbuchstaben in Großbuchstaben umwandelt und andersherum. Zahlen und Zusatzzeichen sollen nicht beachtet werden
0 Lösungen
Wetteinsatzstrategien: statisch, martingal, reverse-martingal oder Fibonacci
Fortgeschrittener - Python von hollst - 18.07.2017 um 09:49 Uhr
Bei zweiwertigen Wettspielen wie bspw. Münzwerfen (Kopf/Zahl), Roulette (Rot/Blau) oder Würfeln (gerade Zahl/ungerade Zahl) gibt es verschiedene Strategien zum Setzen des Einsatzes, um eingefahrenen Verlust so schnell wie möglich wieder zurückzuholen. Neben der statischen Strategie, d. h. man setzt in jeder Runde immer auf das gleiche Ereignis, sind die bekanntesten Strategien die martingale, die reverse-martingale und die Fibonacci-Strategie.

Die martingale Strategie sollte in der Praxis immer zu einem Gewinn führen, allerdings bräuchte man dafür unbegrenzte Ressourcen in der Hinterhand und einen Gegener (die Bank), der sich darauf einlässt. Die Strategie geht wie folgt: Hat man in einer Runde verloren, so setzt man in der Folgerunde den doppelten Einsatz. Die Hoffnung ist, dass man keine zu lang anhaltende Pechstähne hat und irgendwann auch einmal gewinnt. In diesem Falle hat man unter dem Strich genau seinen Starteinsatz gewonnen. Allerdings sind eiserne Nerven notwendig. Gehen wir einmal davon aus, dass wir mit dem Starteinsatz von einem EURO begonnen haben und zehnmal hintereinander verloren (1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 = 1.023), also bereits bei einem Spielstand von -1.023 EURO stehen. Für den elften Versuch müssten wir 1.024 EURO setzen mit der Perspektive, bei einem Gewinn unter dem Strich genau einen einzigen EURO gewonnen zu haben oder bei Verlust auf dann -2.047 EURO zu sitzen. Mindestens an dieser Stelle würde die Bank das Spiel sicher auch abbrechen.

Bei der reverse-martingalen Strategie geht man ganau anders herum vor: Bei einem Verlust setzt man immer wieder den gleichen Startbetrag (sagen wir wieder einen EURO). Bei einem Gewinn hofft man, dass dies der Beginn einer kleinen Glückssträhne ist und wir verdoppeln für die nächste Wettrunde den Einsatz. Die Länge dieser Strähne muss allerdings zuvor festgelegt worden sein, nehmen wir bspw. fünf an. Ist sie eingetroffen, dann beginnen wir wieder mit dem Starteinsatz und streichen die hier z. B. insgesamt gewonnenen 31 EURO ein. Bei der reverse-martingalen Strategie führt ein Rundenverlust immer nur zum Verlust des Starteinsatzes (ein EURO) u. z. auch dann nur, wenn die angestrebte Gewinnserie z. B. erst mit der letzten Wette (fünften) zerstört worden ist.

Bei der Fibonacci-Strategie folgt man bzgl. des Wetteinsatzes der Fibonaccireihe (1, 1, 2, 3, 5, 8, 13, 21, 34 …). Man startet bei 1 und im Falle eines oder mehrerer Verluste geht man jeweils einen Schritt weiter in der Folge. Der Wetteinsatz ist dann das Produkt des Starteinsatzes (ein EURO) mit der entsprechenden Fibonaccizahl. Im Gewinnfall geht man zwei Glieder in der Reihe zurück. Das wird solange wiederholt, bis man vor dem ersten Glied landet. Man hat dann wie bei der martingale Strategie genau den Starteinsatz gewonnen. Allerdings ist eine längere Pechstähne nicht so katastrophal wie beim „Martingale“, man bleibt mit der Fibonacci-Strategie in der Regel „länger am Leben“.

Ohne tiefer auf die Vor- und Nachteile der Setzstrategien einzugehen (im wahren Leben werdet ihr mit keiner davon auf Dauer wirklich reich werden können) soll die Programmieraufgabe darin bestehen, alle vier Strategien zu simulieren und statistisch zu bewerten. Folgendes sei vereinbart: Wir starten eine Serie immer mit einem EURO. In der Hinterhand (Startkapital) haben wir z. B. 100 EURO. Eine Serie sei dann beendet, wenn wir entweder alles verloren haben oder mindestens das doppelte Startkapital auf dem Konto haben. Sollten wir bei einer Wette nicht mehr den geforderten Einsatz zur Verfügung haben, so setzen wir soviel, wie noch auf dem Konto ist. Maximal soll eine Wettserie über 1.000 Runden gehen. Unsere Gewinn-/Verlustwahrscheinlichkeit soll variabel zwischen 40 % und 60 % liegen, bei einer Serie allerdings jeweils konstant bleiben.

In den beigefügten Bildern ist exemplarisch dargestellt, wie eine Wettserie im zeitlichen Verlauf etwa aussehen könnte. Das Startkapital war hier auf 1.024 EURO festgelegt worden.
3 Lösungen Lösungen öffentlich
Wurzel ziehen mit Intervallschachtelung
Anfänger - Python von Felix - 11.07.2017 um 21:30 Uhr
Schreibe eine Methode die aus einer Zahl die Wurzel zieht, benutze dafür die Intervallschachtelung.
3 Lösungen Lösungen öffentlich
Funktion um Pi zu berechnen.
Anfänger - Python von Felix - 09.07.2017 um 21:59 Uhr
Schreibe eine Methode um Pi zu berechnen. Versuche Pi auf so viele Stellen wie möglich zu berechnen.