Mars Rover Kata

Mars Rover Kata

Coding Dojo: Mars Rover Kata, Treffen #18 der Softwerkskammer Rhein-Main, 28. Mai 2013

1296edcd40a8fb8af4086e1544fcc2a9?s=128

Matthias Kadenbach

May 28, 2013
Tweet

Transcript

  1. 1.

    ܕ Coding Dojo: Mars Rover Kata Treffen #18 der Softwerkskammer

    Rhein-Main, 28. Mai 2013 MRM, Großer Hasenpfad 44, 60598 Frankfurt http://www.softwerkskammer.de/item/431114
  2. 2.

    Matthias Kadenbach Ich studiere Leadership in the Creative Industries (M.A.),

    bin Gründer der Jungpark GmbH und ich glaube an gute Software. matthiaskadenbach.de @mkadenbach
  3. 3.

    “Everybody in this country should learn how to program a

    computer… because it teaches you how to think.” – Steve Jobs http://youtu.be/nKIu9yen5nc
  4. 4.

    Kata? Eine Code-Kata ist eine vorgegebene Programmieraufgabe mit überschaubarem Umfang,

    die viele Male hintereinander gelöst wird. Dabei soll bei jedem Durchlauf ein besserer Weg gefunden werden. Der Weg, die Wiederholungen sind das Ziel, nicht die perfekte Lösung eines Problems. Lernen durch Üben. Test Driven Development (TDD): Skills verbessern, Refactoring, besserer, getesteter Code. Algorithmen unterschiedlicher Art und deren Effizienz ausprobieren. Neues lernen, z.B. eine neue Sprache. http://talks.sperrobjekt.de/codekata/#slide-3
  5. 5.

    Coding Dojo? Ein periodisches Treffen, bei dem Katas gelöst werden.

    Leute sollen ermutigt werden mitzumachen und ihre Programmierfähigkeiten, beim Lösen der Kata, einem Publikum zu präsentieren. Randori? In diesem Format lösen alle Teilnehmer das Problem gemeinsam mit TDD und Pair Programming. Nach 5-7 Minuten wird rotiert, Anmerkungen aus dem Publikum sind nur eingeschränkt erlaubt. Koan? Koans sind im Zen-Buddhismus Fragen, auf die es keine absolute Antwort gibt. Koans sind fertige Tests, zu denen als "Antwort" die zu testende Klasse geschrieben werden soll. http://talks.sperrobjekt.de/codekata/#slide-4
  6. 7.

    0,3 2,2 N -3,0 0,0 3,0 0,-3 x,y x y

    North East West South API, die Rover auf Raster bewegt. Rover hat Startpunkt (x,y) mit Richtung (N, S, E, W). Rover erhält Befehle über Zeichenkette. Rover-Befehle sind: f für vorwärts/ forward b für rückwärts/ backward l für links/ left r für rechts/ right Mars-Rover-Kata
  7. 8.

    0,-3 0,3 -3,0 0,0 3,0 0,-3 -3,0 0,3 0,3 2,3

    2,2 N -3,0 0,0 3,0 0,-3 x,y ! Planeten sind Kugeln: Daher springt der Rover von einer Grenze | zur anderen. Trifft ein Rover auf ein Hindernis (x,y), bleibt er stehen und gibt Rückmeldung. Mars-Rover-Kata
  8. 9.

    0,3 2,3 -3,0 0,0 N 3,0 0,-3 x,y x y

    North East West South Beispiel: Rover Startpunkt: x0, y0, Richtung Norden Beispiel Befehls-Zeichenkette: f f r f f Rover Endpunkt: x2, y2, Richtung Osten Mars-Rover-Kata 2,2 E
  9. 10.

    Idee: Kartesisches Koordinatensystem Wie gerade auf den letzten 3 Slides

    gezeigt mit x und y Koordinaten. https://de.wikipedia.org/wiki/Kartesisches_Koordinatensystem Ansatz 1: Eher „If-Else-Switch-Loop“-lastig Array mit Himmelsrichtungen (Nord, Ost, Süd, West) Ansatz 2: Verwendung von Sinus und Kosinus Funktionen Osten 0°, Norden 90°, Westen 180°, Süden 270°
  10. 11.

    Ansatz 2 etwas ausführlicher ... 0° 90° cos sin (0,0)

    P(x,y) (x,0) (0,y) Sinus = Gegenkathete / Hypotenuse Kosinus = Ankathete / Hypotenuse α α
  11. 12.

    Ansatz 2 etwas ausführlicher ... Verwendung von Sinus und Kosinus

    Funktionen Degree: Osten 0°, Norden 90°, Westen 180°, Süden 270° rad = Degree * π / 180 Xneu = Xalt + ticks * Round( Cos( rad ) ) Yneu = Yalt + ticks * Round( Sin( rad ) ) https://github.com/mattes/mars-rover-kata-golang/ blob/master/src/rover/position.go
  12. 13.

    Ansatz 2 etwas ausführlicher ... Verwendung von Sinus und Kosinus

    Funktionen Degree: Osten 0°, Norden 90°, Westen 180°, Süden 270° rad = Degree * π / 180 Xneu = Xalt + ticks * Round( Cos( rad ) ) Yneu = Yalt + ticks * Round( Sin( rad ) ) Anzahl der Schritte, die der Rover in eine Richtung fahren soll.
  13. 14.

    Ansatz 2 etwas ausführlicher ... Verwendung von Sinus und Kosinus

    Funktionen Degree: Osten 0°, Norden 90°, Westen 180°, Süden 270° rad = Degree * π / 180 Xneu = Xalt + ticks * Round( Cos( rad ) ) Yneu = Yalt + ticks * Round( Sin( rad ) ) Formel für Umrechnung von Winkelgrad (Degree) nach Bogenmaß (Radian).
  14. 15.

    Ansatz 2 etwas ausführlicher ... Verwendung von Sinus und Kosinus

    Funktionen Degree: Osten 0°, Norden 90°, Westen 180°, Süden 270° rad = Degree * π / 180 Xneu = Xalt + ticks * Round( Cos( rad ) ) Yneu = Yalt + ticks * Round( Sin( rad ) ) Berechnung von Sinus und Kosinus. Pitfall: Runden nicht vergessen!
  15. 16.

    Ansatz 2 etwas ausführlicher ... ticks = 1, Xalt =

    0, Yalt = 0 rad = Degree * π / 180 Xneu = Xalt + ticks * Round( Cos( rad ) ) Yneu = Yalt + ticks * Round( Sin( rad ) ) Degree rad Xneu, Yneu 0° Osten 0 1, 0 90° Norden 1.5707963267948966 0, 1 180° Westen 3.141592653589793 -1, 0 270° Süden 4.71238898038469 0, -1 0,1 -1,0 0,0 1,0 0,-1 x,y
  16. 17.

    Ansatz 2 etwas ausführlicher ... Bisher hatten wir die Rover

    Richtung nicht berücksichtigt … aber mit Modulo geht es ganz einfach: Degreeneu = ( Degreealt + DegreeÄnderung ) % 360 DegreeÄnderung von -90° bzw. +90° ermöglicht Richtungsänderung nach rechts bzw. links. 90° Norden 180° Westen 0,0 0° Osten 270° Süden
  17. 20.

    Implementierungen Kartesisches Koordinatensystem, Ansatz 1 von mir https://github.com/mattes/mars-rover-kata (Nodejs) Kartesisches

    Koordinatensystem, Ansatz 2 von mir https://github.com/mattes/mars-rover-kata-golang (Golang) Kartesisches Koordinatensystem, Ansatz 1 von Benjamin https://github.com/nureineide/mars-rover-kata (Python) .... deine Implementierung via @mkadenbach