Port 53

明日のための技術メモ

AtCoder ABC146

AtCoder ABC146解いた分だけまとめ。
今回はABの2完。 最近のC問題難しくなってきてない...?
CTFで散々使うASCII変換をうまく使えなかったの、猛反省...

目次

A. Can't Wait for Holiday

問題文

f:id:saturn-glave:20191130111829p:plain

おやすみっていいよね。
曜日のリストと、日曜から見て次の日曜があと何日か計算済みのリストを作り、
for文で入力と照合しておしまい。

#coding:utf-8
s = input()
day = ['SUN','MON','TUE','WED','THU','FRI','SAT']
num = [7, 6, 5, 4, 3, 2, 1,]

for i in range(0, 7):
    if s == day[i]:
        print(num[i])

B. ROT N

問題文

f:id:saturn-glave:20191130112229p:plain

CTFでおなじみ、N=13ならROT13,もといシーザー暗号のやつ。
ここでお目にかかるとは...と言いつつ題材にしやすいよねこれ。

提出したコードがこちら。終わったあとで効率悪すぎて自分を殴りたくなる。
リストの入力がイケてないのと、アルファベットの変換、なぜascii変換使わなかった...
ACしたけど51msだった。

いや、前やってたでしょ...

port53.hatenablog.com

#coding:utf-8
n = int(input())
s = input()

string = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
letter = []
ans = []

for i in s:
    letter.append(i)

for i in letter:
    for j in range(0, 26):
        if  i == string[j]:
            tmp = j + n
            #print(tmp)
            if tmp > 25:
                tmp = tmp % 26
            ans.append(string[tmp])

#print(ans)
print(''.join(ans))

ASCII変換を使って書き直したのがこちら。ACして21msになった。 ord('A')でASCIIコード変換、chr('65')でASCIIから文字へ変換される。
先に元の文字をASCIIコード変換し、n字ずらした分のmod26を計算しておく。
AのASCIIコードは65なので、それを利用する。

#coding:utf-8
n = int(input())
s = list(input())
#print(s)
ans = []

# AをASCII変換すると65なので、元の字をASCII変換してから計算する
for i in s:
    tmp = ((ord(i) - 65 + n) % 26) + 65
    ans.append(chr(tmp))

print(''.join(ans))