Palindrom prüfen
Prüft, ob ein Wort oder Satz vorwärts wie rückwärts gleich lautet — und zeigt bei einem Fehlschlag genau die Stelle, an der es bricht.
Ein Palindrom liest sich vorwärts wie rückwärts: „Otto", „Rentner", „Reliefpfeiler". Bei ganzen Sätzen wird es kunstvoll — „Ein Neger mit Gazelle zagt im Regen nie" ist der bekannteste deutsche Satz dieser Art, wobei sein Wortlaut aus einer Zeit stammt, in der man auf die Wortwahl weniger achtete. Harmloser und ebenso klassisch: „Ein Esel lese nie" oder „O, Genie, der Herr ehre dein Ego".
Damit Sätze funktionieren, zählen dabei nur die Buchstaben — Leerzeichen, Kommas und die Groß- und Kleinschreibung werden übergangen. Genau so prüft das Script in der Voreinstellung. Wollt ihr es streng, schaltet ihr die Nachsicht ab; dann muss der Text buchstäblich Zeichen für Zeichen spiegelbildlich sein, was praktisch nur bei einzelnen Wörtern klappt.
Wenn ein Text kein Palindrom ist, sagt das Script nicht nur nein: Es zeigt die erste Stelle, an der Vorwärts- und Rückwärtslesen auseinandergehen. Das ist beim Basteln eigener Palindrome ausgesprochen nützlich, weil man dort meist nur ein oder zwei Buchstaben von der Lösung entfernt ist. Zusätzlich prüft es auf Wortebene: „Der Hund sah den Mann, Mann den sah Hund der" ist buchstabenweise kein Palindrom, wortweise aber schon.
Verwandtes in dieser Abteilung: Namen rückwärts gelesen dreht Text einfach um, ohne zu prüfen, und Text auf dem Kopf spiegelt sogar die Zeichenformen. In der Mathematik gibt es Palindrome übrigens auch — Zahlen wie 12321 heißen so; mit dem Quersummen-Rechner könnt ihr ihnen auf andere Weise zu Leibe rücken.
So funktioniert das Script
Die naheliegende Prüfung wäre, den Text umzudrehen und mit dem Original zu vergleichen. Das steht auch im Script — für die Anzeige. Für die eigentliche Prüfung wird ein anderes Verfahren benutzt, weil es zusätzlich sagt, wo es hakt.
let links = 0;
let rechts = text.length - 1;
while (links < rechts) {
if (text.charAt(links) !== text.charAt(rechts)) return links;
links++;
rechts--;
}
return -1;
Das ist die Zwei-Zeiger-Technik, ein Grundmuster der Programmierung. Zwei Marken laufen aufeinander zu — eine von vorn, eine von hinten — und vergleichen bei jedem Schritt die beiden Zeichen. Passen sie nicht zusammen, ist die Sache entschieden und die Position wird zurückgegeben. Treffen sich die Marken in der Mitte, ohne dass etwas aufgefallen wäre, ist es ein Palindrom; dann steht am Ende -1 für „keine Abweichung".
Der Vorteil gegenüber dem Umdrehen und Vergleichen: Es wird nur halb so weit gelaufen, es entsteht keine zweite Zeichenkette im Speicher, und man bekommt die Fundstelle geschenkt. Beachtet, dass die Bedingung links < rechts lautet und nicht <= — bei ungerader Zeichenzahl steht in der Mitte ein Zeichen, das mit sich selbst verglichen würde, was immer stimmt und deshalb übersprungen werden kann.
return text.toLowerCase().replace(/[^0-9a-zäöüß]/g, "");
Vor der Prüfung wird aufgeräumt: alles klein, und alles weg, was nicht Buchstabe oder Ziffer ist. Anders als bei den Verschlüsselungsskripten bleiben die Umlaute hier ausdrücklich stehen — sie sind vollwertige Buchstaben, und „Reliefpfeiler" wäre mit einer Umlautauflösung nicht mehr das, was es ist. Aus „O, Genie, der Herr ehre dein Ego" wird so ogeniederherrehredeinego.
return text.split("").reverse().join("");
Das Umdrehen einer Zeichenkette ist in JavaScript ein Dreisprung, weil es für Zeichenketten kein reverse gibt — nur für Arrays. Also erst mit split("") in ein Array einzelner Zeichen zerlegen, dieses umdrehen und mit join("") wieder zusammenkleben. Ein Hinweis am Rande: Bei Emoji und einigen exotischen Schriftzeichen geht dieser Weg schief, weil split("") dort mitten in ein Zeichen schneidet. Für Palindrome ist das ohne Belang, bei anderen Aufgaben aber eine echte Fehlerquelle.
const zeiger = " ".repeat(stelle) + "^";
Der Zeiger unter der Fundstelle entsteht aus Leerzeichen und einem Dach. repeat wiederholt eine Zeichenkette so oft wie angegeben — hier so oft, wie Zeichen davor stehen. Damit die Leerzeichen im Browser erhalten bleiben und nicht zusammenfallen, steht die Ausgabefläche auf white-space: pre-wrap.
for (let i = 0; i < Math.floor(woerter.length / 2); i++) {
if (woerter[i] !== woerter[woerter.length - 1 - i]) return false;
}
Die Prüfung auf Wortebene ist dieselbe Idee mit Wörtern statt Buchstaben, hier als Zählschleife über die halbe Länge geschrieben. woerter.length - 1 - i ist der von hinten gezählte Gegenpart zu i — eine Formel, die man sich einprägen sollte, weil sie überall vorkommt, wo etwas gespiegelt wird.
Zum Anpassen: Wollt ihr auch Palindrome finden, die innerhalb eines längeren Textes stecken, braucht ihr eine Schleife über alle Anfangs- und Endpositionen — das ist deutlich aufwendiger und unter dem Namen „längstes palindromisches Teilwort" eine bekannte Programmieraufgabe. Für Zahlenpalindrome genügt es, in der Säuberung alles außer Ziffern zu entfernen.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.
Mehr aus der Kategorie Texteffekte
-
Blindtext-Generator
-
Brailleschrift
-
Buchstabieralphabet
-
Definierbarer Countdown
-
Fantasiename erzeugen
-
Kleinschreibung / Großschreibung
-
Lauftext
-
Leetspeak-Wandler
-
Morsecode
-
Namen rückwärts gelesen
-
Schreibmaschinen-Effekt
-
Suchen und Ersetzen
-
Text auf dem Kopf
-
Text zu Binärcode
-
Umlaute umschreiben
-
Zeilen sortieren