Übungen / Aufgaben zu PHP

0 Lösungen
Wetteinsatzstrategien: statisch, martingal, reverse-martingal oder Fibonacci
Fortgeschrittener - PHP 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.
0 Lösungen
Wurzel ziehen mit Intervallschachtelung
Anfänger - PHP von Felix - 11.07.2017 um 21:30 Uhr
Schreibe eine Methode die aus einer Zahl die Wurzel zieht, benutze dafür die Intervallschachtelung.
0 Lösungen
Funktion um Pi zu berechnen.
Anfänger - PHP 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.
0 Lösungen
Mononacci, Fibonacci, Multinacci
Anfänger - PHP von hollst - 09.07.2017 um 12:16 Uhr
Die Fibonacci-Folge beginnt bekanntlich mit {1, 1}, also zwei Einsen
und jedes Folgeglied ist die Summe seiner zwei Vorgänger. Wir wollen die Fibonacci-Folge wegen der zwei Starteinsen "fibo2" nennen.

Unter einer Multinacci-Folge (fibok) sei eine Folge verstanden, die mit k Einsen beginnt
und jedes Folgeglied die Summe der k Vorgängerglieder ist. Ist k = 1, so heiße der Spezialfall Mononacci.

Die Glieder der Multinacci-Folgen werden ab Glied k immer größer und streben gegen unendlich.
Allerdings strebt der Quotient zweier benachbarter Folgeglieder immer gegen einen endlichen Grenzwert, bei fibo2
ist es bekanntlch der goldene Schnitt phi (phi = 1.618034).

Wir wollen den entsprechenden Grenzwert der Multinacci-Folgen mit "phi_fibok" benennen.

Schreibe ein Programm, das für k = 1, 2, 3 ... 100 die ersten 10 Glieder der Multinacci-Folgen ab Glied k und den Grenzwert phi_fibok ausgibt.

Hinweis: Beider der Grenzwertbildung könnt ihr es mit sehr große Zahlen zu tun bekommen, deshalb Ergebnis auf Plausibilität testen!
0 Lösungen
Kleine Variablenspielerei
Anfänger - PHP von kjaenke - 03.07.2017 um 15:05 Uhr
Schreibe ein Programm das zwei Zahlen entgegen nimmt und jeweils in eine Variable speichert.
Tausche die Werte der Variablen ohne weitere Variablen zu definieren.
Es sind im ganzen Programm nur die zwei vorher definierten Variablen erlaubt!

Viel Spaß :)
0 Lösungen
Ist Freitag der 13. ein Unglücks- oder Glückstag?
Anfänger - PHP von hollst - 26.06.2017 um 13:14 Uhr
Wir betrachten den Gregorianischen Kalender mit den üblichen 12 Monaten und Schaltjahren.

Schaltjahr ist, wenn die Jahreszahl durch 4 teilbar ist, mit Ausnahme der Jahre, die durch 100,
jedoch nicht durch 400 teilbar sind. Im Schaltjahr hat der Februar 29 Tage.

Unsere Zeitrechnung beginne mit dem 1. Januar 00.

Frage: Welcher Wochentag fällt

a) am häufigsten auf einen 13. des Monats und
b) welcher bzw. welche am wenigsten.
2 Lösungen Lösungen noch nicht öffentlich
Anfängeraufgabe FizzBuzz
Anfänger - PHP von Nachbar - 11.06.2017 um 10:26 Uhr
Dies ist eine Anfängeraufgabe, die gerne für ein erstes Aussieben bei Bewerbungsgesprächen gestellt wird, da tatsächlich erstaunlich viele Bewerber die Aufgabe falsch
lösen oder zu viel Zeit dafür benötigen. Für jemanden der als Programmierer sein Geld verdienen will, sollte die Aufgabe in zwei Minuten lösbar sein.

Aufgabe:
Schreibe ein Programm das alle Zahlen von 1 bis 100 ausgibt. Wenn die Zahl allerdings ein Vielfaches von 3 ist, soll statt der Zahl das Wort "Fizz" ausgegeben werden. Wenn die Zahl ein Vielfaches von 5 ist, soll statt der Zahl das Wort "Buzz" ausgegeben werden. Ist die Zahl sowohl ein Vielfaches von 3 als auch von 5, soll statt der Zahl das Wort "FizzBuzz" ausgegeben werden.
0 Lösungen
Schneller als der Taschenrechner
Anfänger - PHP von hollst - 16.05.2017 um 16:39 Uhr
Wenn ihr die folgende Aufgabe programmiert habt, könnt ihr auf jeder Party durch eure brilliante Kopfrechenleistung glänzend, ihr werdet schneller sein als jeder andere, selbst wenn er einen Tscherechner oder euren benutzen darf.

Zu programmieren ist ein kleiner, aber sehr spezieller Taschenrechner (Bild 1), der folgendes kann:

1) Entgegennahme einer dreistelligen positiven, geraden Ganzzahl (Bild 2).
2) Vergrößern der Dreistellenzahl auf sechs Stellen, indem die Zahl einfach noch einmal angehängt wird (Bild 3).
3) … 5) (komplizierte) Division der Sechstellenzahl nacheinander durch 22, 7 und 13. Reihenfolge spielt keine Rolle, aber nur jeweils 1x (deshalb deuten rote Buttons auf „nicht mehr benutzbar“ hin).

Im Beispiel (Bild 1 … 6) habt ihr allerdings das Ergebnis (117) wesentlich schneller per Kopf ausgerechnet als euer Freund mit dem Taschenrechner. Das liegt nicht daran, dass der Rechner so langsam rechnet, sondern daran, das das Buttondrücken so lange dauert.

Die ganze Übung vor größerem Publikum solltet ihr allerdings nach etwa höchstens 10 Vorführungen zunächst abbrechen, also noch bevor jemand hinter den Trick kommt. Was der Trick ist? Nun, bitte erst einmal selber nachdenken.
0 Lösungen
Konvexe Hüllkurve um Punktwolke
Fortgeschrittener - PHP von hollst - 04.05.2017 um 10:36 Uhr
In der X-Y-Ebene seinen N Punkte zufällig verteilt (Bild 1). Man schreibe ein Programm, das die konvexe Hüllkurve um diese Punktwolke zeichnet (Bild 2).

Zum Verständnid, was die konvexe Hüllkurve um eine Punktwolke ist, stelle man sich die Punkte als fixierte Push-Pins oder Nägel auf einem Pinbord (möglichst nicht aus Kork) oder Holzbrett vor. Jetzt nehme man einen Gummiring (z. B. vom Einweckglas) und spanne diesen so um die Pins, dass sich alle im „Inneren“ des Gummiringes befinden (eine „360-Grad-Umwicklung“ eines Pins ist nicht erlaibt). Der so verformte Gummiring ergibt aus physikalischen Gründen einen geschlossenen Linienzug. Dieser Linienzug wird konvexe Hüllkurve um die Punktwolke genannt.
0 Lösungen
Validierung der abc-Vermutung
Anfänger - PHP von hollst - 01.05.2017 um 16:44 Uhr
Die sogenannte abc-Vermutung sorgte in den letzten Jahren zu ungewöhnlich viel
Wirbel, Stress und Zank bei Zahlentheoretikern mit vielleicht sogar etwas skandalösem Touch.

Gelänge ein Beweis, dann könnte ein solcher in die Top-Charts der jüngeren Mathematikgeschichte
aufsteigen. Die abc-Vermutung wurde erst vor Kurzem aufgestellt (etwa 1985, also vor gut 30 Jahren,
was in der Mathematikgeschichte quasi nichts ist). Verblüffend für mich ist, dass man bei einem Beweis
damit die berühmte Große Fermatsche Vermutung von 1635, bewiesen erst 1993 auf mehreren hundert DIN-A4-Seiten
(wobei zuvor bereits mehr als 5.000 fehlgeschlagene Beweisversuche bekannt sind), auf einer einzigen
DIN-A4-Seite aufschreiben könnte und dass selbst ein Laie (wie ich) den Beweis verstehen würde.

Kommen wir (kurz) zum skandalösem Touch: 2012 reichte ein Japaner auf über 500 DIN-A4-Seiten einen (angeblichen)
Beweis der abc-Vermutung ein. Es stellte sich schnell heraus, dass er dabei (bewiesenes) Nebenwissen anwandte,
dass jedoch kaum bekannt war und in der Beweisführung hätte etwas mehr Platz und Erörterung finden sollen. Dies korrigierte
der Japaner dann wohl auch, womit sich sein Beweis auf über 1.000 Seiten aufblähte. Verständlich, dass sich damit kaum jemand
beschäftigte.

Darüber frustiert, beschimpfte der Japner zunächst die mathematische Welt als einen Haufen talentloser
Idioten (also nicht wörtlich, so etwas macht ein Japaner nicht, sondern sinnbildlich) und lud 2015 eine Reihe von Mathematikern,
die er selbst aussuchte und für ev. für fähig hielt, zu mehrtägigen Workshops ein. In ellenlangen Vorträgen erläuterte er
diesen Experten seinen Beweis der abc-Vermutung.

Jedenfalls sollen sich nach den Workshops einige der ausgesuchten Experten in die Richtung geäußert haben,
dass sie einen Ansatz zum Verständnis und zur Prüfung des Beweises sehen und sich an die Arbeit machen wollen.
Man hat abgeschätzt, dass, wenn man sich täglich etwa fünf Stunden damit beschäftigen würde, etwa in einem halben Jahr
durchsein könnte.

Nun gut, bis heute ist keiner durch, allerdings hat sich auch noch niemand geäußert, einen Fehler gefunden zu haben.
Somit ist alles noch in der Schwebe. Dass die jetzt beweissuchenden Experten zuvor vom Japaner gebrieft worden sind, stellt
allerdings das eigentlich Zweifelhafte und nicht Akzeptierbare dar, der Geruch von Bestechlichkeit ist nicht wegzuwischen.

Soweit die kleine Vorgeschichte. Natürlich wollen auch wir nicht die abc-Vermutung beweisen, soldern lediglich etwa überprüfen.
Würden wir bei der Überprüfung auch nur ein einziges Gegenbeispiel finden, so hätte es sich mit dem Beweis ja sowieso erledigt.
Aber keine zu große Vorfreude, ich denke weder ihr noch ich werden wahrscheinlich ein Gegenbeispiel finden.


Die ABC-Vermutung: Gegeben seien zwei positive Ganzzahlen a und b mit 0 < a < b und die außerdem teilerfremd (ggT(a, b) = 1) sind.
Diesen zwei Zahlen a und b sind zwei Eigenschaften zugeordnet, genannt "Summe" (c) und "Radikal" (rad).

Die Eigenschaft "Summe" ist weiter nichts als die ordinäre Summe von a und b, also c = a + b. Interessanter ist das "Radikal",
es ist eine spezielle Multiplikationsvorschrift für a, b und c. Würde man das ordinäre Produkt a * b * c bilden, so würde immer
gelten

a * b * c > c (es sei den a = b = 1, was aber wegen a < b untersagt ist).

Beim Radikal rad(a * b * c) werden jedoch nur alle unterschiedlichen Primzahlen, in die a * b * c zerlegt werden kann,
miteinander multipliziert.

Z. B. rad(100) = rad (2 * 2 * 5 * 5) = 2 * 5 = 10;

Bei einer so definierten Multiplikation ist es dann in der Tat möglich, dass sich für bestimmte positiv ganzzahlige
Tripel (a, b, c) wahre Ungleichungen bzw. Gleichungen der Form rad(a * b * c) <= c ergeben. Man nennt derartige Tripel abc-Treffer.

Allerdings gibt es "reativ wenige" solcher abc-Treffer. Es kann jedoch bewiesen werden, dass es immer noch unendlich viele sind
(deshalb machen Beschreibungen wie "reativ wenige" keinen Sinn in der Mathematik). So, bis jetzt ist alles noch "relativ" unspannend.

Spannend wird es, wenn man rad(a * b * c) potenziert, also (rad(a * b * c))^(1 + epsilon). Mit epsilon = 0 haben wir wieder den
Fall unendlich vieler mögliche abc-Treffer. Ist jedoch epsilon auch nur ein "My" größer als Null gibt es nur noch endlich viele abc-Treffer
(so die abc-Vermutung).

Wäre dies tatsächlich so (also bewiesen), zöge das einen ganz gewaltigen Schwanz an neuen mathematischen Erkenntnissen u. a. in der
Zahlentheorie nach sich (worauf wir hier natürlich nicht eingehen wollen, wer dbzgl. mehr wissen möchte, kann zunächst am Besten bei
Wikipedia einsteigen).


Die Programmieraufgabe lautet:

1.) Zähle alle abc-Treffer mit epsilon = 0 für die c < c_max (z. B. c_max = 10.000) ist.

2.) Führe das Gleiche durch mit wachsendem epsilon, z. B. epsilon = {0.1, 0.2 ... 0.9, 1.0} (interessant wäre zu erkunden, ob bei
steigendem epsilon die Anzahl der abc-Treffer linear abnimmt).


Viel Erfolg!
0 Lösungen
Crowdfunding für Fibonacci-Uhr
Fortgeschrittener - PHP von hollst - 24.04.2017 um 12:22 Uhr
Erneut FIBONACCI, jedoch diesmal in einem ganz anderen Zusammenhang.

Im Zuge von Crowdfunding ist in Kanada die sogenannte Fibonacci-Clock (Bild 1)
entwickelt und in die Produktion überführt worden.

(https://www.kickstarter.com/projects/basbrun/fibonacci-clock-an-open-source-clock-for-nerds-wit)

Es sollten für dieses Projekt innerhalb eines Monates (05 - 06/2015) 5.000 CAD
gesammelt werden (ca. 3.500 €), zusammengekommen sind aber sage und schreibe
(über) unglaubliche 125.000 €. Man lernt daraus, dass man mit einer guten (verrückten)
Idee manchmal auch einiges an Geld aquirieren kann.

Dabei ist an der Fibonacci-Clock nichts Kompliziertes dran. Im Grunde besteht sie
lediglich aus einem Display, das in fünf Quadrate mit unterschiedlicher
(variabler) Farbe und (fixer) Kantenlänge aufgeteilt ist.

Die Kantenlängen der Quadrate sind 1, 1, 2, 3 und 5, entsprechen also dem Beginn der
Fibonacci-Sequenz. Es lassen sich damit die Dezimalzahlen 0 ... 12 codieren.

Das Interessante an dem Display ist, dass man damit gleichzeitig
die Stunden und (teilweise) die Minuten darstellen kann. Dies geschieht mittels
wechselnder Farbcodierung der Quadrate und Aufaddition der den Quadraten zugeordnete
Fibonaccizahl. Die Farbe Rot steht für die Stunden, die Farbe Grün für die Minuten.
Wird ein Quadrat sowohl für die Stunden- als auch für die Minutensummation benötigt,
wird dies durch die Farbe Blau angezeigt (Bild 2). Weiß steht für "Nichtnutzung" des
Quadrates. Die Minutenzahl erhält man durch Multiplikation der Minutenzahlsumme mit 5,
somit ist die Genauigkeit der erfindungsgemäßen Uhr auf +- 2.5 Minuten begrenzt,
Vor- und Nachmittagszeiten sind identisch.

Mit den fünf Fibonaccizahlen lassen sich wie gesagt alle Werte von 0 bis 12 darstellen,
d. h. die Minutenanzeige "springt" lediglich alle fünf Minuten. Dies bedeutet allerdings nicht,
dass die Anzeige nicht schneller wechseln darf, denn es gibt mit den Ausnahmen für die
Null und die Zwölf für jede Zahl mehrere Möglichkeiten der Fibonacci-Codierung, die der
kanadische Erfinder auch in kurzen Intervallen und zufällig wechseln läßt.


Die Programmieraufgabe besteht darin, die Fibonacci-Clock mit einer Grafik-Applikation zu
simulieren. Der Minutenwechsel soll allerdings nicht im 5-Minuten-Takt, sondern sogar minütlich
erfolgen. Damit könnte man die Uhr vielleicht als Tester für Schnelldenker einsetzen.

Neben den vier Grundfarben des Erfinders (Weiß, Rot, Grün und Blau (Bild 3))werden also
vier weitere Farben zur Kodierung der fehlenden Additivzahlen 1, 2, 3 und 4 für den Minutenzähler
benötigt. Im Beispiel (Bild 4) sind es die Farben

Yellow (steht für Überlagerung mit Weiß),
Pink (steht für Überlagerung mit Rot),
Purple (steht für Überlagerung mit Grün) und
SkyBlue (steht für Überlagerung mit Blau)

Viel Erfolg!

0 Lösungen
Wieder (vielleicht) Erstaunliches vom Fibonacci
Anfänger - PHP von hollst - 19.04.2017 um 15:47 Uhr
Gegeben sei eine Folge von N Strings der Längen 1, 2, 3 ... N. Jedes Char eines Strings beinhaltet lediglich entweder eine '0' oder eine '1',
jedoch dürfen zwei benachbarte Chars nicht beide eine '1' beinhalten.

Man zeige für N bis 25, dass die Anzahl möglicher (unterschiedlicher) Strings einer Längenklasse der Fibonacci-Reihe ab der 2 folgen
(2, 3, 5, 8 ...).

Also:

Länge = 1, zwei Möglichkeiten ("0", "1")
Länge = 2, drei Möglichkeiten ("00", "01", "10")
Länge = 3, fünf Möglichkeiten ("000", "001", "010", "100", "101")
...

Wieviele unterschiedliche Strings der oben genannten Art gibt es mit einer Stringlänge von 999?