Le [problème ABC146 B] d'AtCoder (https://atcoder.jp/contests/abc146/tasks/abc146_b) m'a donné l'opportunité de me familiariser avec Unicode.
Supposons que "décaler une chaîne de caractères alphabétiques de N caractères" signifie "convertir en un après N caractères dans l'ordre alphabétique", et après "Z", il revient à "A". La même définition s'applique au problème B ci-dessus.
ord ()
et `chr ()`
Python3 implémente les fonctions intégrées ord ()
et `chr ()`
, qui convertissent les caractères et leur code Unicode pointe l'un vers l'autre.
Référence: [document officiel Python3.8 #ord]
(https://docs.python.org/ja/3/library/functions.html#ord)
sample
>>> ord('A')
65
>>> ord('D')
68
>>> chr(65)
'A'
>>> chr(70)
'F'
Comme vous pouvez le voir, il est appelé "point de code Unicode", mais il se démarque par la reconnaissance d'un "monde où divers symboles de caractères sont représentés par une correspondance biunivoque avec des nombres". Le japonais est un monde profond, donc il a l'air bien [livre](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 & mots-clés =% E6% 96% 87% E5% AD% 97% E3% 82% B3% E3% 83% BC% E3% 83% 89 & qid = 1585548181 & sr = 8-1).
Apparemment, pour l'alphabet supérieur, «A» est le code 65, et à partir de là, c'est un numéro de série en décimal. Au fait, entre majuscules et minuscules
sample
>>> ord('Z')
90
>>> chr(91)
'['
>>> chr(92)
'\\'
>>> chr(93)
']'
>>> chr(94)
'^'
>>> chr(95)
'_'
>>> chr(96)
'`'
>>> chr(97)
'a'
Et certains symboles ont été pris en sandwich. Hmm.
Comme vous l'avez peut-être remarqué dans les arguments, «« ʻord () »« »et« «chr ()» «supposent la conversion d'un seul caractère.
Lors de la conversion de la chaîne de caractères S, convertissez-la en chaîne de caractères vide
'' , caractère par caractère avec l'instruction
pour '', puis combinez et répétez.
Et pour prendre en compte lors du retour de'Z'to'A ', ajoutez le reste ``' ', qui s'obtient en divisant l'entier obtenu en ajoutant N au point de code du caractère original par 26, au point de code de'A'. Calcule les points de code de caractères convertis avec.
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
Je vais vérifier.
test_rot
>>> rot_n('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 13)
'NOPQRSTUVWXYZABCDEFGHIJKLM'
Cliquez ici pour soumettre le problème AtCoder B ↓
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()
À propos, la fonction qui restaure la chaîne de caractères convertie S (la décale à N caractères avant) est
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
Ce sera.
test_derot
>>> derot_n('NOPQRSTUVWXYZABCDEFGHIJKLM', 13)
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
J'ai appris du problème AtCoder que j'ai écrit au début. Vous avez généralisé ROT13, qui est un simple code qui décale 13 caractères en arrière.
Recommended Posts