Gibt es eine schnellere Möglichkeit, eine Nummer in einen Namen umzuwandeln?

8

Der folgende Code definiert eine Sequenz von Namen, die Nummern zugeordnet sind. Es ist so konzipiert, dass es eine Nummer nimmt und einen bestimmten Namen abruft. Die Klasse stellt sicher, dass der Name in ihrem Cache vorhanden ist, und gibt den Namen dann zurück, indem sie in ihren Cache indexiert. Die Frage dabei: Wie kann der Name basierend auf der Zahl berechnet werden, ohne einen Cache zu speichern?

Der Name kann als Basis 63 Nummer gedacht werden, mit Ausnahme der ersten Ziffer, die immer in der Basis 53 ist.

%Vor%

Die folgenden interaktiven Sitzungen zeigen einige der Werte, die erwartungsgemäß in der richtigen Reihenfolge zurückgegeben werden.

%Vor%

Leider müssen diese Zahlen genau diesen Namen zugeordnet werden (um eine umgekehrte Konvertierung zu ermöglichen).

Bitte beachten Sie: Eine variable Anzahl von Bits wird empfangen und eindeutig in eine Zahl umgewandelt. Diese Nummer sollte eindeutig in einen Python-Bezeichner-Namespace konvertiert werden. Schließlich werden gültige Python-Namen in Zahlen umgewandelt, und diese Zahlen werden in eine variable Anzahl von Bits konvertiert.

Endgültige Lösung:

%Vor%     
Noctis Skytower 15.06.2012, 14:37
quelle

4 Antworten

7

Dies ist ein lustiges kleines Problem, voll mit 1 Fehlern.

Ohne Schleifen:

%Vor%

Und die Tests:

%Vor%

Ausgabe:

%Vor%     
recursive 15.06.2012, 15:32
quelle
3

Was Sie haben, ist eine verfälschte Form der bijektiven Nummerierung (das übliche Beispiel sind Tabellenspaltennamen, die bijektive Basis-26).

Eine Möglichkeit, bijektive Nummerierung zu generieren:

%Vor%

Sie müssen nur eine andere Zifferngruppe für den Fall angeben, für den 53 >= n > 0 gilt. Sie müssen auch n um 1 erhöhen, da die bijektive 0 korrekt die leere Zeichenfolge ist, nicht "A" :

%Vor%     
ecatmur 15.06.2012 15:31
quelle
2

Getestet für die ersten 10.000 Namen:

%Vor%     
Rodrigo Queiro 15.06.2012 15:25
quelle
1

Sie können den Code in dieser Antwort auf die Frage "Base 62 Conversion in Python" (oder vielleicht eine von die anderen Antworten).

Unter Verwendung des referenzierten Codes denke ich die Antwort auf Ihre echte Frage, die war " wie kann der Name basierend auf der Nummer berechnet werden, ohne einen Cache zu speichern? " wäre um den Namen der einfachen Basis 62 Umwandlung der Zahl möglicherweise mit einem führenden Unterstrich zu machen, wenn das erste Zeichen des Namens eine Ziffer ist (die einfach ignoriert wird, wenn der Name zurück in eine Zahl umgewandelt wird).

Hier ist ein Beispielcode, der veranschaulicht, was ich vorschlage:

%Vor%

Ausgabe:

%Vor%

Wenn die Zahlen negativ sein könnten, müssen Sie den Code möglicherweise von der referenzierten Antwort abändern (und es gibt eine Diskussion darüber, wie dies zu tun ist).

    
martineau 15.06.2012 15:16
quelle

Tags und Links