ABC282(AtCoder Beginners Contest 282)
A〜C問題をPythonで解いてみました。
- コードは雑めです。ゆるしてー
- 競技プログラミングの勉強一切したこと無いので、テクニックは知らないよ。ごめんねー
A問題
k = int(input())
print("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[:k])
文字コードを1ずつ増やしながらループで出してもいいですね
B問題
n, m = map(int,input().split())
int_s = []
for s_i in range(n):
s_i = input()
int_s_i = 0
for s_i_ch in s_i:
int_s_i <<= 1
if s_i_ch == 'o':
int_s_i |= 1
# print(f"{s_i}={bin(int_s_i)} len(s_i)={len(s_i)}")
int_s.append(int_s_i)
all_bit = (1<<m)-1
pair = 0
for n1 in range(n):
for n2 in range(n1+1,n):
if (int_s[n1] | int_s[n2]) == all_bit:
pair += 1
print(pair)
制約で問題数が30までだったのでbit演算で行けると思って書きました。
'o'のところでbitを立てて、bit演算のORを取るとどちらかが1のときbitが立ちますね
あとは全bit立っているかどうかを比較するだけで全問正解できるかどうかがわかります。
C問題
n = int(input())
s = input()
kukuri_flag = False
s2 = []
for ch in s:
if ch == '"':
kukuri_flag ^= True
elif not kukuri_flag and ch == ',':
ch = '.'
s2.append(ch)
print("".join(s2))
Pythonのstringはimmutable、listはmutableなので、stringの連結は遅いだろうなぁと思いまして。
単純にstringを連結していくよりはlistをappendしていってjoinした方が速いって情報をいくつか見つけたのでそのように実装しました。
感想
アプリサイズ10Kbyte制限のアプリ作った時に、bit演算で論理演算するようなことしてサイズを縮小していたので、その時のことを思い出しました。
条件分岐はJUMP命令があるのでアドレス格納する分データがでかくなるからやっていたノウハウですが、今は使用することのない変態ノウハウですねw
16色のゲームを作った時とか、昔はbit演算はよく使ったんですけど、最近はあまり使いませんねー。
ツッコミ
- Q B問題、わざわざbit演算しなくてもいいのではって気持ちになった(余計こんがらがりそう)
- A わたしはbit演算のほうがイメージしやすいんですよ。ちょっと変なのかもしれない