RSS-Feed  

09

Aug

Anfängerübungen

Ich habe in letzter Zeit mal wieder versucht jemandem programmieren beizubringen. Unabhängig davon ob ich erfolgreich war, habe ich mich im Rahmen dessen mal wieder mit ein paar einfachen Anfängeraufgaben beschäftigt. Man mag es Langeweile nennen, aber irgendwie fand ich die normalen Musterlösungen etwas langweilig und habe beschlossen sie etwas interessanter zu gestalten. Dabei ging es nur um eine Sache: In der Kürze liegt die Würze! Das heißt weder Performance noch Lesbarkeit spielen eine Rolle sondern es geht darum die Aufgabe in so wenig Zeichen wir möglich zu lösen.

Begonnen haben wir dabei mit der berühmten Fibonacci-Folge. Dabei werden immer die letzten beiden Zahlen der folge addiert und bilden die nächste Zahl der Folge. In diesem Beispiel haben wir einfach mal exemplarisch die ersten 40 Zahlen der Folge errechnet. Dabei gibt es verschiedene Ansätze. Der erste Ansatz ist sehr klassisch und wurde von einem Kollegen von mir beigesteuert:

<?php $b=1;while($i++<40){echo$s=$a+$b,'<br>';$a=$b;$b=$s;}

Diese erste Lösung hat ein Kollege von mir beigesteuert. Sie spiegelt die klassische Lösung wieder, bei der an Syntax und vor allem an Variabelnamen gespart wurde. So wird in der Ausgabe eine Zuweisung vorgenommen und bei der Schleife anstatt einer For-Schleife eine sehr kompakte While-Schleife eingesetzt. Ähnlich kompakt ist auch der folgende Ansatz:

<?php $f[]=1;while($i<40)echo$f[]=$f[$i]+$f[$i++-1],'<br>';

Hier wird sich die Array-Mechanik in PHP zu nutze gemacht. So kommt man mit einer einzigen Anweisung innerhalb der Schleife aus. Die Schleife funktioniert ähnlich dem oberen Beispiel nur wird hier erst später inkrementiert.

So kryptisch und kompakt kann man die Fibbonacci-Folge berechnen. Selbst übertroffen haben wir uns allerdings bei der Berechnung von Primzahlen. Das folgende Beispiel berechnet alle Primzahlen, die kleiner als 10000 sind:

<?php while(1e4>$j=++$i){while(--$j>1)$i%$j||$j=1;$j&&print"$i<br>";}

Hier haben wir ganz tief in die dreckige Trickkiste gegriffen. Allein die Bedingung der ersten Schleife sollte unerfahrenen Programmieren ein Rätsel sein. Hier wurde auf Exponentialschreibweise zurückgegriffen, die mit dem Ergebnis einer Zuweisung verglichen wird. Hierbei wird einer zweiten Variable der Wert der inkrementierten Schleifen-Variabel zugewiesen. Noch schmutziger wird es innerhalb der Schleifen, hier wurden die logischen Operatoren missbraucht um auf IF-Bedingungen zu verzichten. So wird bei einem logischen Oder der zweite Teil der Bedingung nur geprüft, falls der erste nicht erfüllt ist. Bei einem logischen Und wird der zweite Teil nur ausgeführt sofern der erste erfüllt ist. Wer die Funktionsweise dieses Code-Fetzens immer noch nicht durchblickt hat, kann sich das Ganze ja nochmal in Ruhe zu Gemüt führen. Ich hoffe ich konnte euch mit diesen Programmierspielchen wenigstens ein bisschen unterhalten.