Hier ein Rätsel aus der amerikanischen Radiosendung Car Talk:

"I was driving on the highway the other day recently and I happened to notice my odometer.
Like most odometers nowadays, it shows six digits, in whole miles only -- no tenths of a mile. So, if my car had 300,000 miles, for example, I'd see 3-0-0-0-0-0. And that's all. Until I drove another mile, at which point it would read 3-0-0-0-0-1.

"Now, what I saw that day was very interesting. I noticed that the last 4 digits were palindromic, that is they read the same forwards as backwards.
For example, "5-4-4-5" is a palindrome. So, my odometer could have read 3-1-5-4-4-5, with those last four digits, starting with the units, then the tens, then the hundreds, and finally the thousands, being the palindrome.

"One mile later, the last 5 numbers were palindromic. For example, it could have read 3-6-5-4-5-6.

"One mile after that, the middle 4 out of 6 numbers were palindromic. So, the first and last numbers weren't involved in the palindrome, but the middle 4 were palindromic.

"And you ready for this? One mile later, all 6 were palindromic!
For example, 2-1-3-3-1-2. "

Pretty good, huh? I thought so. So, here again are the conditions as stated by Terry. "I noticed that the last 4 digits were palindromic. I drove a mile, and the last 5 were palindromic. I drove another mile and the middle 4 were palindromic, and the ends were not involved. And then one mile later, all 6 digits were palindromic."

The question is, what did Terry see on the odometer when he first looked?

Rätselquelle

Fassen wir nochmal zusammen:

  • es kommen nur Zahlen infrage mit 6 Ziffern
  • das erste Palindrom besteht aus den letzten 4 Ziffern
  • das zweite Palindrom (eine Meile weiter) besteht aus den letzten 5 Ziffern
  • das dritte Palindrom (eine weitere Meile später) besteht aus den mittleren 4 Ziffern
  • das letzte Palindrom (noch eine Meile weiter) besteht aus allen 6 Ziffern

Diese Palindromfunktion können wir hier nur für den letzten Fall verwenden, da sie immer den gesamten Aufrufparameter überprüft.

Wir müssen uns also eine Funktion schreiben, die den String/Zahl, die Länge und den Startindex entgegennimmt.

Diese Funktion könnte in etwa so aussehen:

Da wir diese Funktion sehr oft aufrufen, ist es eventuell sinnvoll sie ein wenig zu optimieren um Ressourcen zu sparen:

Um einen Teilstring zu erhalten verwende ich substr. Die Doku hierfür kann man Hier finden.

Als nächtes schreiben wir eine Funktion die sich mit der aktuell Problematik ausseinandersetzt. Sie kennt die Palindrombedinungen und wertet sie je Ziffer aus:

Jetzt nur noch eine Funktion (optional) die sich mit dem Aufruf je Zahl beschäftigt. Wir verwenden hier eine einfache for-Schleife.

Das ist alles. Jetzt noch alles zusammenbauen und den Aufruf hinzuschreiben:

Unsere Code gibt folgendes aus:

Die folgenden Zahlen kommen als Kilometerstand infrage:
198888
199999
Copyright © Tomatenstau.de 2016