Der Kruskal Trick

  Ralf Hersel   Lesezeit: 6 Minuten

Mit einem Rommé-Kartenspiel und genügend Platz auf dem Tisch, könnt ihr einen schönen Zaubertrick vorführen.

der kruskal trick

In der Weihnachtszeit kommt man mit Freunden und der Familie zusammen, um die PC-Probleme der Eltern zu beheben, Unmengen an Nahrung zu verschlingen und Katzen von Christbäumen fernzuhalten. Man kann aber auch miteinander reden und Spiele spielen, oder Tricks zum Besten geben. Wenn ihr der Heiland am festlich geschmückten Weihnachtstisch sein wollt, dann ist das eurer Artikel.

Für diesen vermeintlichen Zaubertrick benötigt ihr ein Rommé-Kartenspiel mit 104 Karten ohne Joker. Darin gibt es Zahlen-Karten von 2 bis 10, die ihrem aufgedruckten Wert entsprechen. Alle Bilder (Bube, Dame, König) zählen 5 Punkte und das Ass zählt 1 Punkt. Nun legt ihr die Karten in einem 10 mal 10 Grid aus (nicht so wie im Titelbild). 10 Reihen mit je 10 Karten. Und dann geht es los.

Jetzt bittet ihr eine Mitspielerin, eine Karte aus der obersten Reihe auszuwählen. Sowohl das Auslegen, als auch die ausgelegten Karten dürft ihr nicht sehen (stellt euch in die Ecke, oder haltet euch die Augen zu). Bevor die Show losgeht, solltet ihr die Karten mischen, für euch selbst auslegen und das Ergebnis ermitteln. Danach bitte nicht neu mischen.

Dann soll sich die Mitspielerin eine beliebige Karte aus der oberen Reihe heimlich aussuchen. Nehmen wir als Beispiel die zweite Karte aus dem Titelbild, also die Sechs. Jetzt zählt die Spielerin 6 Karten weiter bis zur Fünf. Nun geht es 5 Karten weiter bis zum Buben in der zweiten Reihe. Der Bube zählt 5, somit zählen wir 5 Karten weiter bis zur 5 am Ende der zweiten Reihe. Und so weiter, und so fort. Schluss ist, wenn man in der letzten Reihe nicht mehr weiterzählen kann. Man hat die letzte Karte erreicht, die du jetzt voraussagst. Kapiert? Probiert es vorher aus.

Damit man sich das Prinzip besser vorstellen kann und hinter den Trick kommt, habe ich mal schnell ein Python-Skript hingeschludert:

#!/usr/bin/env python

def show(deck):
    print('-' * 45)
    count = 0
    for i in deck:
        if i < 0:
            i *= -1
            print("\033[7m" + f"{i:>2}", end=' ' + "\033[7m")
        else:
            print("\033[0m" + f"{i:>2}", end=' ' + "\033[0m")
        count += 1
        if not count % 10: print()
    print("\033[0m" + '-' * 45 + "\033[0m")

def main(args):
    deck = [random.randint(1,10) for i in range(100)]
    show(deck)
    while True:
        i = int(input("Position in first row (1-10) or 0 to quit: ")) - 1
        if i < 0: exit()
        while True:
            x = deck[i]
            deck[i] *= -1
            i += x
            if i >= 100: break
        show(deck)
        deck = [abs(x) for x in deck]
    return 0

if __name__ == '__main__':
    import sys, random
    sys.exit(main(sys.argv))

Speichert den Code z. B. als kruskal.py ab und führt ihn mit ./kruskal.py oder python kruskal.py aus. Dann seht ihr eine 10 mal 10 Matrix mit Zufallszahlen zwischen 1 und 10:

Dann wählst du eine Position aus der ersten Reihe aus. Irgendetwas zwischen 1 und 10. Als Beispiel wähle ich die neunte Postion mit dem Wert 5 aus. Nun zeigt euch das Skript den Pfad der Additionen an:

Die hervorgehobenen Felder stellen den Weg der Additionen dar: 5 plus 5 führt zur 1, 1 plus 1 führt zur 8, usw. Am Ende landet ihr in der letzten Reihe bei der 3. Jetzt wird es spannend, wenn ihr eine andere Startzahl auswählt, z. B. die Position 1 (Wert 7) aus der ersten Reihe. Der Pfad stellt sich folgendermassen dar:

Noch ein Beispiel, dieses Mal mit der Position 7, das ist die Vier in der ersten Zeile:

Jetzt lehnt euch bitte entspannt zurück und betrachtet die drei Screenshots mit eurem Pattern-Matching-Auge. Fällt euch etwas auf? Ja, beim 1. und 2. Beispiel schwenkt das Muster bereits in der zweiten Zeile auf denselben Additons-Pfad ein. Wenn ihr das 2. mit dem 3. Beispiel vergleicht, seht ihr eine Übereinstimmung ab der vierten Zeile. Am Ende landet ihr immer auf demselben Wert in der letzten Zeile, egal, was als Startwert in der ersten Zeile ausgewählt wurde.

Warum ist das so? Bei dem von mir gewählten Setting (100 Karten, Werte zwischen 1 und 10) ist es sehr wahrscheinlich, dass die Additionen auf denselben Pfad gelangen. Sobald das geschehen ist, ändern sich nichts mehr am Endergebnis. Wer sich für die genauen mathematischen Hintergründe interessiert, kann diese hier nachlesen. Wenn ihr den Wertebereich auf 1 bis 20 erweitert, sind die Ergebnisse nicht mehr so vorhersagbar:

deck = [random.randint(1,20) for i in range(100)]

Ich wünsche euch viel Spass beim Verzaubern eurer Weihnachtsgäste.

Quelle: https://faculty.uml.edu/rmontenegro/research/kruskal_count/kruskal.html

Tags

Zaubern, Trick, Mathematik, Spielen, Python

Es wurden noch keine Kommentare verfasst, sei der erste!