Ich versuche, alle möglichen Tastatursequenzen zu erzeugen (momentan nur 7-stellig). Zum Beispiel, wenn die mobile Tastatur wie folgt aussieht:
%Vor%Einige der möglichen Sequenzen können sein:
123698
147896
125698
789632
Die Anforderung besteht darin, dass jede Ziffer der Zahl der vorherigen Ziffer benachbart sein sollte.
So plane ich folgendes:
Die Informationen über den Nachbarn ändern sich von Tastatur zu Tastatur, so dass wir es wie folgt codieren müssen:
%Vor%Ich werde alle Ziffern durchlaufen und einen der möglichen Nachbarn anhängen, bis die gewünschte Länge erreicht ist.
BEARBEITEN: Aktualisierte Nachbarn, keine Diagonalen erlaubt EDIT 2: Ziffern können wiederverwendet werden
Versuchen Sie es.
%Vor% Dadurch werden alle möglichen Sequenzen erzeugt. Du hast nicht erwähnt, dass du solche mit Zyklen haben möchtest, zum Beispiel (0, 8, 9, 8)
, also habe ich sie gelassen. Wenn du sie nicht willst, dann benutze einfach
Beachten Sie, dass ich den Eintrag für 0
eine Liste mit einem Element anstelle einer Ganzzahl gemacht habe. Dies ist für die Konsistenz. Es ist sehr schön in der Lage zu sein, in das Wörterbuch zu indizieren und zu wissen, dass Sie eine Liste zurückbekommen werden.
Beachten Sie auch, dass dies nicht rekursiv ist. Rekursive Funktionen sind groß in Sprachen, die sie richtig unterstützen. In Python sollte man fast immer einen Stack verwalten, den ich hier demonstriere. Es ist genauso einfach wie eine rekursive Lösung und vermeidet Funktionsaufruf-Overhead (Python unterstützt keine Tail-Rekursion) und maximale Rekursionstiefe.
Ich konnte auch nicht anders, als zu bemerken, dass in Ihren Beispielen keine der Ziffern wiederverwendet wird. Wenn Sie das wollen, dann würden Sie die Option unique_digits = True
verwenden; Dies verhindert die Rekursion für bereits verwendete Ziffern.
+1 Was für ein lustiges Puzzle. Ich hoffe, das funktioniert für dich!
%Vor%Rekursion ist hier nicht wirklich ein Problem, weil die Sequenz relativ kurz ist, ebenso wie die Auswahl für jede Ziffer außer der ersten - so scheint es "nur" 4790 Möglichkeiten zu geben, Diagonalen nicht zuzulassen. Dies wird als Iterator geschrieben, um die Notwendigkeit zu beseitigen, einen großen Container mit allen darin erzeugten Möglichkeiten zu erstellen und zurückzugeben.
Mir ist aufgefallen, dass ein zusätzlicher Vorteil des datengesteuerten Ansatzes der Speicherung der Nachbarschaftsinformation in einer Datenstruktur (wie das OP vorgeschlagen hat) darin besteht, neben der einfachen Unterstützung verschiedener Tastaturen auch zu steuern, ob Diagonalen zulässig sind oder nicht trivial.
Ich diskutierte kurz darüber, ob ich eine Liste anstelle eines Wörterbuchs für schnellere Suchvorgänge erstellen sollte, aber mir wurde klar, dass dies die Anpassung an andere Sequenzen als Ziffern erschweren würde (und es wahrscheinlich sowieso nicht wesentlich schneller machen würde) ).
%Vor%es ist wirklich einfach ohne die Nachbarschaftsbedingung ...
%Vor%