JavaScriptsMathematik

Gedanken lesen

Ein mathematischer Zaubertrick: Das Script errät das Symbol, das neben eurer heimlich errechneten Zahl steht — und liegt immer richtig.

Von unserem User Christoph, alias C-Jay, kommt dieses Javascript, bei dem eure Gedanken gelesen werden. Es zeigt eine große Tabelle mit den Zahlen von 0 bis 99, neben jeder Zahl steht ein Symbol. Ihr rechnet heimlich eine Zahl aus, merkt euch das Symbol daneben — und das Script nennt euch genau dieses Symbol. Es liegt immer richtig; sollte das mal nicht der Fall sein, habt ihr euch schlicht verrechnet.

So geht ihr vor: Denkt euch eine beliebige zweistellige Zahl. Berechnet davon die Quersumme (die Summe aller Ziffern) und zieht sie von eurer gedachten Zahl ab. Ein Beispiel: gedachte Zahl 28, Quersumme 2 + 8 = 10, Ergebnis 28 − 10 = 18. Sucht das Ergebnis in der Tabelle, merkt euch das Symbol daneben und klickt auf „Gedanken lesen". Mit „Neue Runde" werden die Symbole neu gemischt, und ihr könnt den Trick sofort wiederholen — in der Urversion musste man dafür noch die ganze Seite neu laden.

Hinter dem Trick steckt keine Magie, sondern ein Stück Zahlentheorie: Zieht man von einer Zahl ihre Quersumme ab, ist das Ergebnis immer durch 9 teilbar. Bei zweistelligen Zahlen kommen also nur 0, 9, 18, 27, 36, 45, 54, 63, 72 oder 81 heraus — und genau neben diesen Zahlen platziert das Script heimlich überall dasselbe Symbol. Alle anderen Zahlen bekommen Zufallssymbole, damit es nicht auffällt.

Wir haben auch noch einen anderen Gedankenleser im Archiv, und mit dem Script Denk dir eine Zahl gibt es einen weiteren Rechentrick zum Verblüffen.

Mathematik Baujahr 2008 läuft in deinem Browser

Denkt euch eine zweistellige Zahl, zieht davon ihre Quersumme ab und merkt euch das Symbol neben dem Ergebnis. Dann klickt auf „Gedanken lesen".

Eingesandt von Christoph alias C-Jay

So funktioniert das Script

Das Script besteht aus drei Teilen: einer Symbolliste mit Zufallsfunktion, dem Aufbau der Zahlentabelle und den beiden Knöpfen zum Auflösen und Neustarten. Alles liegt in einer sofort ausgeführten Funktion, damit die Variablen nicht mit anderen Scripts kollidieren.

const symbole = ["£", "¥", "∅", "α", "æ", "φ", …];
let fixiert = 0;

function zufall(anzahl) {
  return Math.floor(Math.random() * anzahl);
}

Die Symbole stehen in einem Array, einer nummerierten Liste. Die Hilfsfunktion zufall() liefert eine zufällige ganze Zahl von 0 bis anzahl − 1: Math.random() erzeugt eine Kommazahl zwischen 0 und 1, die Multiplikation streckt sie auf den gewünschten Bereich, und Math.floor() rundet ab. In fixiert merkt sich das Script, welches Symbol in dieser Runde das „geheime" ist — es wird bei jeder neuen Runde neu ausgelost.

for (let zeile = 1; zeile <= 20; zeile++) {
  zeilen += "<tr>";
  for (let zahl = start; zahl >= 0; zahl -= 20) {
    …
  }
  zeilen += "</tr>";
  start -= 1;
}

Zwei ineinander verschachtelte Schleifen bauen die Tabelle als HTML-Text zusammen: Die äußere erzeugt 20 Zeilen, die innere füllt jede Zeile mit fünf Zahlen im Abstand von 20 (die erste Zeile z. B. 99, 79, 59, 39, 19). Weil start nach jeder Zeile um 1 sinkt, kommen so alle Zahlen von 0 bis 99 genau einmal vor. Am Ende wird der fertige Text per innerHTML in das leere <table>-Element geschrieben — die Urversion nutzte dafür noch document.write(), das moderne Browser nach dem Laden der Seite nicht mehr sauber unterstützen.

const symbol = (zahl % 9 === 0)
  ? symbole[fixiert]
  : symbole[zufall(symbole.length)];

Das ist das Herzstück des Tricks. Der Restwert-Operator % liefert den Rest einer Division; zahl % 9 === 0 ist also genau bei den Vielfachen von 9 wahr. Diese Zahlen bekommen alle das fixierte Symbol, alle übrigen ein zufälliges. Da „Zahl minus Quersumme" mathematisch immer ein Vielfaches von 9 ergibt, landet ihr garantiert auf einem Feld mit dem fixierten Symbol — welches auch immer ihr euch gedacht habt. Die Schreibweise mit ? und : ist der Bedingungsoperator, eine Kurzform für if/else in einer Zeile.

document.getElementById("gl-lesen").addEventListener("click", function () {
  document.getElementById("gl-ergebnis").textContent =
    "Dieses Symbol stand neben eurer Zahl: " + symbole[fixiert];
});

Der Auflöse-Knopf gibt einfach das fixierte Symbol in der Ergebnisfläche aus — die Urversion nutzte dafür ein alert()-Fenster. Der zweite Knopf ruft tabelleAufbauen() erneut auf: Es wird ein neues Symbol ausgelost, die Tabelle neu gewürfelt und die alte Auflösung gelöscht.

Zum Anpassen: Ihr könnt die Symbolliste beliebig austauschen oder erweitern — Emojis, Buchstaben, kleine Wörter, alles ist erlaubt, solange mindestens ein paar verschiedene Einträge drinstehen. Auch die Farbe der Symbole (color: #b00020) lässt sich leicht ändern.

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 Mathematik