Ein Schweizer-Arme-Messer für die Anzahl von benutzerdefinierten Ziffernsystemen.
Evgueni Antonov 2023.
Dieses Modul wurde erstellt und auf Python 3.10.6, PIP 23.1.2 getestet.
Erstmals im Mai 2023 veröffentlicht.
pip3 install custom-numbers
# or
python3 -m pip install custom-numbers
Weitere Informationen zum Verwenden finden Sie im Nutzungsabschnitt unten.
from custom_numbers import custom_numbers as cn
my_custom_numeral_system = cn.CustomNumeralSystem("paf")
my_number = cn.CustomNumber(my_custom_numeral_system, "a")
# Now if you type in REPL:
# help(cn)
# You will get the help for the module and the classes.
Dieses Paket enthält ein Modul mit wenigen Klassen, mit denen Sie ein benutzerdefiniertes Ziffernsystem deklarieren können, das aus benutzerdefinierten Symbolen mit einer benutzerdefinierten Basis besteht. Da dies seltsam klingen mag, sieht es so aus, wie es aussieht:
Hinweis: Subsysteme werden nicht unterstützt und ich plane nicht, diese Funktion zu implementieren.
Hinweis: Dieses Modul unterstützt nur benutzerdefinierte Ganzzahlnummern. Benutzerdefinierte schwimmende Punktzahlen werden nicht unterstützt und werden es nie sein.
Beginnen wir mit etwas, das Sie bereits kennen - einer Binärzahl. Diese bestehen nur aus Nullen und denen und daher ist die Basis 2.
Beispiel: 1100101
Und das ist eigentlich der Titel eines wirklich coolen Songs aus den 90ern. Auch 1100101 Binär, umgewandelt in Dezimaler ist 101 (hunderteinhalb), genau wie (binär) 10 2 == 2 10 (Dezimal).
Nun - eine Hexadezimalzahl - diese bestehen aus den Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 und die Buchstaben A, B, C, D, E, F und haben eine Basis von 16.
Eine Hexadezimalzahl sieht also so aus:
F 16 == 15 10 , 10 16 == 16 10 , f0 16 == 240 10
Das andere bekannte Zifferungssystem ist das Oktalsystem, das aus nur Ziffern von Null bis sieben und Basis 8 besteht, aber wir werden diese jetzt überspringen.
Und schließlich das Dezimalsystem, das wir alle seit der Kindheit kennen, haben eine Basis von 10 und besteht aus den Ziffern von null bis neun.
Okay, bisher sind Sie mit den am häufigsten verwendeten Ziffernsystemen vertraut - dem Binärer, dem Oktal, dem Dezimal und dem Hexadezimal.
Beginnen wir zunächst das Binärsystem neu definieren. Es gibt also eine Basis von 2 und wir werden das nicht ändern. Wie wäre es jedoch, anstatt 0 und 1 zu verwenden, um P und A stattdessen zu verwenden? P wäre also unsere neue Null und A wäre unser neuer. Deshalb würde wir, wie wir normalerweise 1100101 schreiben würden, jetzt als Aappapa geschrieben. Verwirrend, richtig? Aber was - es ist immer noch ein binäres System, wir haben nur die Symbole geändert.
Aber jetzt wie wäre es mit etwas Verrücktem - einem Ziffernystem mit einer Basis von 3, die die Symbole p, a, f als Ziffern verwendet, so dass F 2 Dezimales wäre, P wäre 0 Dezimal. Daher:
Aa 3 == 4 10 , af 3 == 5 10 , FP 3 == 6 10
Lassen Sie uns dies nun in Aktion sehen:
from custom_numbers import custom_numbers as cn
sys3 = cn.CustomNumeralSystem("paf")
num3 = cn.CustomNumber(sys3, "aa")
num10 = num3.to_decimal()
print(num10) # Prints "4"
Der beste Test, um zu testen, ob die Klassen wie erwartet funktionieren, besteht darin, Ziffernsysteme mit den Symbolen zu deklarieren, die wir alle kennen:
from custom_numbers import custom_numbers as cn
sys2 = cn.CustomNumeralSystem("01")
num2 = cn.CustomNumber(sys2, "1100101")
num10 = num2.to_decimal()
print(num10) # Prints "101"
sys16 = cn.CustomNumeralSystem("0123456789abcdef")
num16 = cn.CustomNumber(sys16, "f0")
num10 = num16.to_decimal()
print(num10) # Prints "240"
So weit, ist es gut. Lassen Sie uns nun total verrückt werden und ein System mit einer Basis -Basis als 16 und einem völlig seltsamen Symbole für Ziffern deklarieren. Und wir können das tatsächlich und noch mehr verrücktes Zeug:
sysN = cn.CustomNumeralSystem("kje5nCs21Q9vW0KMqc")
Hinweis: Die benutzerdefinierten Nummern sind fallsempfindlich !! Also n! = N !!
Hinweis: Es gibt verbotene Zeichen, die nicht in einem Zifferungssystem verwendet werden können und nicht in einer Nummer verwendet werden können. Sie können sie immer als Zeichenfolge erhalten, indem Sie die Eigenschaft besbidden_characters der CustomNumeralsystem -Klasse verwenden.
In CustomNumeralsystem -Klasse wurden die Bedürfnisse der grundlegenden Validierung, die Gleichstellung und die Iequality -Python -Operatoren implementiert, sodass Sie zwei Objekte vergleichen konnten.
Der Vergleich würde jedoch nach der Liste (grundsätzlich die Zeichenfolge) der Zeichen, die die Ziffern darstellen, und nicht nach Standard -Python -Objekt (Referenz) vergleichbar.
sys1 = cn.CustomNumeralSystem("paf")
sys2 = cn.CustomNumeralSystem("paf")
# The two objects are different, despite being initialized with
# the same value
id(sys1) == id(sys2) # False
# However the set of characters (the digits) is the same, the
# base is the same, so I accept they are the same numeral systems
sys1 == sys2 # True
# And you could also test for inequality
sys1 = cn.CustomNumeralSystem("paf")
sys2 = cn.CustomNumeralSystem("paz")
sys1 != sys2 # True
Signierte benutzerdefinierte Nummern werden ebenfalls unterstützt.
sysN = cn.CustomNumeralSystem("paf")
numN1 = cn.CustomNumber(sysN, "-a") # A negative number
numN2 = cn.CustomNumber(sysN, "a") # A positive number
numN3 = cn.CustomNumber(sysN, "+a") # A positive number
Grundlegende mathematische Operationen werden von Python -Operatoren von Python unterstützt.
sysN = cn.CustomNumeralSystem("paf")
numN1 = cn.CustomNumber(sysN, "-a")
numN2 = cn.CustomNumber(sysN, "a")
numN3 = cn.CustomNumber(sysN, "+a")
# Comparisson
numN1 == numN2
numN1 != numN2
numN1 > numN2
numN1 < numN2
numN1 >= numN2
numN1 <= numN2
# Basic mathematical operations
numN1 + numN2 # Addition
numN1 += numN2 # Augmented addition
numN1 - numN2 # Subtraction
numN1 -= numN2 # Augmented subtraction
numN1 // numN2 # Floor division
numN1 / numN2 # NOTE: This will perform floor division as well!
# as floating point numbers are not supported by this class and will
# never be.
numN1 * numN2 # Multiplication
numN1 ** numN2 # Power
numN1 % numN2 # Modulo division
abs(numN) # Absolute value
Verwenden des Iterators:
sysN = cn.CustomNumeralSystem("paf")
it = cn.GearIterator(sysN, 0, 2)
next(it) # "p" # "p" assumes to be the analog of the zero
next(it) # "a"
next(it) # "f"
next(it) # "ap"
next(it) # "aa"
# and so on. You get the idea.
# The iterator could also be initialized with an init_value which is
# de-facto a custom number from the chosen CustomNumeralSystem,
# but for convenience I left the number to be a string, as you may
# wish or not to initialize at all:
it = cn.GearIterator(sysN, 0, 2, "af")
HINWEIS: Wenn der Iterator initialisiert wurde, wird die führende "Nullen" (sozusagen) aus dem gegebenen Init_Value entzogen.
Definiert und deklariert ein benutzerdefiniertes Ziffernsystem.
CustomNumeralSystem(digits: str)
Args:
digits: The symbols to be used as digits. The string length defines
the numeral system base.
EIGENSCHAFTEN:
forbidden_characters -> str
base -> int
Methoden:
valid_number(number: str) -> bool
Tests if the given "number" is valid for the current numeral system.
Should not contain forbidden characters.
Should contain only characters defined in the numeral system.
Definiert und deklariert eine Zahl aus einem benutzerdefinierten Ziffernsystem.
CustomNumber(numeral_system: CustomNumeralSystem, value: str)
Args:
numeral_system: A previously defined custom numeral system.
value: The value (the number itself).
EIGENSCHAFTEN:
init_value -> str
Returns the initial value the class was initialized with.
Methoden:
digit_to_int(digit: str) -> int
Converts the given digit from the custom numeral system to a
decimal integer.
to_decimal() -> int
Converts the current number value to a decimal integer.
Iteriert über die Zahlen eines benutzerdefinierten numerischen Systems Eiter, beginnend mit der ersten Zahl (der Nulläquivalent) oder von einem gegebenen Init_Value.
Simuliert kurz alte Zahnradzähler, wie der Kilometerzähler der alten Autos.
GearIterator(numeral_system: CustomNumeralSystem, min_length: int = 0, max_length: int = 0, init_value: str = "")
Args:
numeral_system: Custom numeral system. Mind the order of symbols!
min_length: Minimum length, default is zero.
max_length: Maximum length, default is zero - means no limit.
init_value: Value to initialize with.
EIGENSCHAFTEN:
combinations -> int
Returns the number of possible combinations (iterations).
Die Klasse implementiert das Python Context Management -Protokoll.