Das [ABC146 B-Problem] von AtCoder (https://atcoder.jp/contests/abc146/tasks/abc146_b) gab mir die Möglichkeit, mich mit Unicode vertraut zu machen.
Angenommen, "Verschieben einer alphabetischen Zeichenfolge um N Zeichen" bedeutet "Konvertieren in eine nach N Zeichen in alphabetischer Reihenfolge" und nach "Z" kehrt sie zu "A" zurück. Die gleiche Definition gilt für das obige Problem B.
`ord ()`
und `chr ()`
Python3 implementiert die integrierten Funktionen `ord ()`
und chr ()
`, die Zeichen und ihre Unicode-Codepunkte wieder ineinander konvertieren.
Referenz: [Python3.8 offizielles Dokument #ord]
(https://docs.python.org/ja/3/library/functions.html#ord)
sample
>>> ord('A')
65
>>> ord('D')
68
>>> chr(65)
'A'
>>> chr(70)
'F'
Wie Sie sehen können, heißt es "Unicode-Codepunkt", aber es bricht mit der Erkennung von "einer Welt durch, in der verschiedene Zeichensymbole durch eine Eins-zu-Eins-Entsprechung mit Zahlen dargestellt werden". Japanisch ist eine Welt mit vielen Ausdrücken, also [Bücher, die gut aussehen](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6 % 96% B0% E7% 89% 88-% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9E% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E6% 96% 87% E5% AD% 97% E3% 82% B3% E3% 83% BC% E3% 83% 89% E6% 8A% 80% E8% A1% 93% E5% 85% A5% E9% 96% 80-WEB-PRESS-plus% E3% 82% B7% E3% 83% AA% E3% 83% BC% E3% 82% BA / dp / 4297102919 / ref = sr_1_1? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & Schlüsselwörter =% E6% 96% 87% E5% AD% 97% E3% 82% B3% E3% 83% BC% E3% 83% 89 & qid = 1585548181 & sr = 8-1).
Anscheinend ist 'A' für das obere Alphabet der Code 65 und von dort eine Seriennummer in Dezimalzahl. Übrigens zwischen Groß- und Kleinschreibung
sample
>>> ord('Z')
90
>>> chr(91)
'['
>>> chr(92)
'\\'
>>> chr(93)
']'
>>> chr(94)
'^'
>>> chr(95)
'_'
>>> chr(96)
'`'
>>> chr(97)
'a'
Und einige Symbole wurden eingeklemmt. Hmm.
Wie Sie vielleicht in den Argumenten bemerkt haben, setzen sowohl `ord ()`
als auch chr ()
die Konvertierung einzelner Zeichen voraus. Wenn Sie die Zeichenfolge S konvertieren, konvertieren Sie sie zeichenweise in die leere Zeichenfolge ``
''`` mit der Anweisung ``
for```, kombinieren Sie sie und wiederholen Sie sie.
Und um zu berücksichtigen, wenn Sie von 'Z'to'A' zurückkehren, fügen Sie den Rest '' hinzu, der durch Teilen der Ganzzahl erhalten wird, die durch Hinzufügen von N zum ursprünglichen Zeichencodepunkt durch 26 zum Codepunkt von 'A' erhalten wird. Berechnen Sie den konvertierten Zeichencodepunkt mit.
rot_n.py
def rot_n(s, n):
answer = ''
for letter in s:
answer += chr(ord('A') + (ord(letter)-ord('A')+n) % 26)
return answer
Ich werde es prüfen.
test_rot
>>> rot_n('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 13)
'NOPQRSTUVWXYZABCDEFGHIJKLM'
Klicken Sie hier, um das AtCoder B-Problem einzureichen ↓
b.py
def rot_n():
n = int(input())
s = input()
answer = ''
for letter in s:
answer += chr(ord('A') + (ord(letter)-ord('A')+n) % 26)
print(answer)
if __name__ == '__main__':
rot_n()
Die Funktion, die die konvertierte Zeichenfolge S wiederherstellt (vor N Zeichen verschiebt), ist übrigens
derot_n.py
def derot_n(s, n):
answer = ''
for letter in s:
answer += chr(ord('Z') - (ord('Z')-ord(letter)+n) % 26)
return answer
Es wird sein.
test_derot
>>> derot_n('NOPQRSTUVWXYZABCDEFGHIJKLM', 13)
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Ich habe aus dem AtCoder-Problem gelernt, das ich am Anfang geschrieben habe. Sie haben ROT13 verallgemeinert. Dies ist ein einfacher Code, der 13 Zeichen zurückschiebt.
Recommended Posts