[PYTHON] Arithmetische Verarbeitung in der Kanji-Zahlenklasse

Ich las @ xuyun19840618s "Gegenseitige Konvertierung zwischen chinesischen und arabischen Zahlen" und schrieb meine eigene Implementierung in die Kommentare. Wäre es nicht interessant, wenn wir mit chinesischen Zahlen rechnen könnten? Ich dachte, es wäre eine Klasse. Es wird zu einer Unterklasse der Klasse int gemacht, damit sie berechnet werden kann. Die int-Instanz ist unveränderlich, daher muss der Wert in der Methode new angegeben werden. Da das Berechnungsergebnis in Kanji nur angezeigt wird, wenn es erneut zu einer Instanz von KanjiInt gemacht wurde, wird die Berechnungsmethode in KanjiInt überschrieben. Da es schwierig ist, die Methode einzeln zu definieren, überschreibt die for-Schleife die Methoden des Einzeltermoperators und des Binäroperators.

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

class KanjiInt(int):

    def __new__(cls, value=0):
        arabic = kanji_to_int(value)
        if isinstance(arabic, int):
            value = arabic
        return int.__new__(cls, value)

    def __str__(self):
        return int_to_kanji(self)

    def __repr__(self):
        return 'KanjiInt(%s)' % repr(str(self))

_unary = ('abs', 'inv', 'invert', 'neg', 'pos')
_binary = ('add', 'sub', 'mul', 'floordiv', 'mod', 'pow',
           'and', 'or', 'xor', 'lshift', 'rshift')

for method in _unary:
    exec('KanjiInt.__{0}__ = lambda self: KanjiInt(int.__{0}__(self))'.format(method))

for method in _binary:
    exec('KanjiInt.__{0}__ = lambda self, value: KanjiInt(int.__{0}__(self, value))'.format(method))


unitlong = 'Tsunekawa', 'Ein Mönch', 'Nayu und andere', 'Geheimnisvoll', 'Unendlichkeit'
unit4 = ('',) + tuple('100 Milliarden Billionen Kyoho') + unitlong
unit1 = ('',) + tuple('Zehntausend')
digits = tuple('〇 1 2 3 4 5 6 7 8 9')
arabic4 = {unit[:1]: 10000**i for i, unit in enumerate(unit4)}
arabic1 = {unit: 10**i for i, unit in enumerate(unit1)}
arabics = {digit: i for i, digit in enumerate(digits)}


def int_to_kanji(arabic):
    arabic = int(arabic)
    if arabic == 0:
        return digits[0]
    sign = '-' if arabic < 0 else ''
    arabic = abs(arabic)
    def convert():
        for column, digit in enumerate(map(int, str(arabic)[::-1])):
            if column % 4 == 0 and (arabic // (10 ** column)) % 10000 != 0:
                yield unit4[column // 4]
            if digit != 0:
                yield unit1[column % 4]
                if digit != 1 or column % 4 == 0:  #eintausend,Einhundert,Bis auf elf
                    yield digits[digit]
    return sign + ''.join(list(convert())[::-1])


def kanji_to_int(kanji):
    if not isinstance(kanji, str):
        return 'error'
    for longname in unitlong:
        kanji = kanji.replace(longname, longname[0])
    a0 = a1 = a4 = 0
    for j in kanji:
        if j in arabics:
            a0 = a0 * 10 + arabics[j]
        elif j in arabic1:
            a1 += (a0 or 1) * arabic1[j]
            a0 = 0
        elif j in arabic4:
            a4 += (a0 + a1 or 1) * arabic4[j]
            a0 = a1 = 0
        else:
            return 'error'
    return a0 + a1 + a4


if __name__ == '__main__':
    value = KanjiInt('Sechsundfünfzig')
    print("value =", value)
    print('repr(value) =', repr(value))
    print('str(value) =', str(value))
    print('int(value) =', int(value))
    print('abs(value) =', abs(value))
    print('+value =', +value)
    print('-value =', -value)
    print('~value =', ~value)
    print('value + 3 =', value + 3)
    print('3 + value =', 3 + value)
    print('value - 3 =', value - 3)
    print('value * 3 =', value * 3)
    print('value / 3 =', value / 3)
    print('value // 3 =', value // 3)
    print('value % 3 =', value % 3)
    print('value ** 3 =', value ** 3)
    print('value & 3 =', value & 3)
    print('value | 3 =', value | 3)
    print('value ^ 3 =', value ^ 3)
    print('value << 3 =', value << 3)
    print('value >> 3 =', value >> 3)

Ausführungsergebnis


value =Sechsundfünfzig
repr(value) = KanjiInt('Sechsundfünfzig')
str(value) =Sechsundfünfzig
int(value) = 56
abs(value) =Sechsundfünfzig
+value =Sechsundfünfzig
-value = -Sechsundfünfzig
~value = -Siebenundfünfzig
value + 3 =Neunundfünfzig
3 + value = 59
value - 3 =Dreiundfünfzig
value * 3 =168
value / 3 = 18.666666666666668
value // 3 =XVIII
value % 3 =zwei
value ** 3 =175.616
value & 3 = 〇
value | 3 =Neunundfünfzig
value ^ 3 =Neunundfünfzig
value << 3 =448
value >> 3 =Sieben

Recommended Posts

Arithmetische Verarbeitung in der Kanji-Zahlenklasse
Seitenverarbeitungsklasse
Bildverarbeitung mit MyHDL
Datensätze mit Pandas verarbeiten (1)
Datensätze mit Pandas verarbeiten (2)
Bildverarbeitung mit Python
Parallelverarbeitung mit Mehrfachverarbeitung
Bildverarbeitung mit PIL
Bildverarbeitung mit Python (Teil 2)
100 Sprachverarbeitungsklopfen mit Python 2015
Parallelverarbeitung mit lokalen Funktionen
"Apple-Verarbeitung" mit OpenCV3 + Python3
Parallele Verarbeitung mit Parallel von Scikit-Learn
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Datenverarbeitungstipps mit Pandas
[Python] Bildverarbeitung mit Scicit-Image
Ich habe versucht, natürliche Zahlenausdrücke und arithmetische Verarbeitung nur mit Listenverarbeitung