Auswertung und Lösungen des Contests #11: "Rechnen einmal anders"

Diesmal gab es erfreulich viele Einsendungen. Wahrscheinlich lag es daran, dass die Teilnehmer diesmal keine Hinweise auf die Anzahl ihrer Token geben durften. Somit konnte sich niemand sicher sein, dass er sowieso keine Chance hat.

Die eingereichten Lösungen sind sich alle recht ähnlich, bis auf die von Helmut, der wie schon beim letztem Contest eine kleine VM geschrieben und den eigentlichen Code in einen String gepackt hat, der nur ein Token benötigt. Eine gute Idee und eine tolle Umsetzung, aber damit es in Zukunft nicht bei jedem Mal so läuft, ist ein solcher Ansatz in Zukunft nicht mehr erlaubt. Ansonsten haben alle erkannt, dass man die Subtraktion mit Hilfe der Addition durchführen kann, und dass man für die Multiplikation und die Division wiederum auf die Addition und die Subtraktion zurückgreifen kann.

Die Lösungen sind in zwei Kategorien unterteilt: Normal und Dirty. Die "normalen" Lösungen berechnen das Ergebnis so, wie es eigentlich gedacht war - beispielsweise die Addition mit Bit-Operationen. Die "dreckigen" Lösungen verwenden zum Beispiel den []-Operator, um eine Summe zu berechnen, oder den Modulo-Operator bei der Division.

Einen Sonderfall stellt die Zahl -32768 dar, da es bei 16-Bit-Integern keine +32768 gibt. Negiert man -32768, kommt wiederum -32768 heraus. Das hat bei einigen Einsendungen zu Fehlern geführt, obwohl Genion freundlicherweise im Forum darauf hingewiesen hat. Seltsamerweise hat gerade seine Lösung Probleme mit der -32768 gehabt und einen Stack Overflow verursacht, obwohl ich den Stack bereits auf 16 MB gesetzt hatte. Falls noch mehr nötig sein sollte, bitte ich dich bei mir zu melden, damit ich es noch einmal testen kann.

Getestet wurde wie folgt: Zuerst wurden die Addition und die Subtraktion durch viele zufällige Tests geprüft. Dann wurde davon ausgegangen, dass diese Operationen korrekt funktionieren. In der zweiten Phase wurde jede Lösung um zwei Zeilen erweitert, die die Addition und die Subtraktion abfangen und sofort das richtige Ergebnis liefern. Da die Multiplikation und die Addition fast überall durch Aufrufe der eigenen Funktion realisiert wurden, konnten die nachfolgenden Tests der Multiplikation und der Division enorm beschleunigt werden.

Alle Einsendungen und das Testprogramm können hier heruntergeladen werden.

Ergebnisse

Normal Dirty

Korrekt

  1. Gaspode (156 Token)
  2. Stefan Seegel (167 Token)
  3. David Scherfgen (169 Token)
  4. Gotbread (187 Token)
  5. Phil_GDM (237 Token)
  6. David_pb (242 Token)

Fehlerhaft

  • Genion (164 Token): Stack overflow bei -32768 / -32768
  • unsigned long (190 Token): Endlosschleife bei -32768 / -32768
  • kaid (194 Token): Endlosschleife bei -32768 / -32768

Korrekt

  1. Helmut (67 Token)
  2. Gaspode (119 Token)
  3. kaid (169 Token)
  4. Gotbread (177 Token)

Fehlerhaft

  • David_pb (237 Token): Falsches Ergebnis bei -32768 / -32768

Congratulations!

Damit gehen die Titel an Gaspode und Helmut! Herzlichen Glückwunsch!