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