見出し画像

xor(排他的論理和)、strで出力される二進数の変換、list→文字の変換法(ABC213A)

こんにちは。すごく久しぶりに書いた気がします。
最近図書館で蟻本を借りれたはいいものの、初っ端(2-1)で詰んでおります。なぜあんなreturnしかないプログラムでそんな挙動をするのかがわからない…。まだまだ茶色への道のりは遠いですね。

それはともかく、先日参加したABCでボコボコにされたのでその報告をしようと思います。Aでここまでボコボコにされたの、bitで解く問題以来な気がする。(bitで解く問題、いまだにできない)

今日の問題

一応リンク貼りましたが、これはA xor C=BとなるCを求めるだけの問題です。

自分の解答(正直長すぎる)

a,b=map(int,input().split())
#二進数に変換するためにformatを使った
A=format(a,'b')
B=format(b,'b')
C=len(A)
D=len(B)
ans=[]
#一の位をそろえるためにreversedは使わず、iに-つけて無理やり回した
for i in range(1,max(C,D)+1):
   try:
       if A[-i]==B[-i]:
           ans.append('0')
       else:
           ans.append('1')
   except IndexError:
       if C>D:
           ans.append(A[-i])
       else:
           ans.append(B[-i])
ANS=reversed(ans)
Ans=''.join(ANS)
ANs=0
for j in range(len(Ans)):
   if Ans[j]=='1':
       ANs+=2**(len(Ans)-j-1)
print(int(ANs))

この問題を解くうえで最大の敗因は、私がXORを知らなかったことですね。というか最初でググればよかった。50分も使って、さらに途中で頭こんがらがったせいでミスして(reversed入れ忘れ)WAまでとってしまった。
とはいえ、listの統合とか、binを使わない二進数の変換法とか、結構学べたのでよかった(本番中だったからよくない)

模範解答

a,b=map(int,input().split())
print(A^B)

XORは、pythonだとA^Bですぐ答えが出ます。
なぜC=A^Bなのかはまとめで後述します。

XORについてまとめ

XORは^を使ってあらわされる(AとBのXORはA^B)
XORは二回同じ数をかけると元の数になる(A^B^B=A)
A^C=BになるCはA^Bで求まる(A^C=B → A^A^C=A^B → C=A^Bなので)
計算する順序は変えられる( A^B^C=A^(B^C) である)

今日学んだこと(XORの規則除く)

# XORを求めるには
A^B

#str出力で二進数を出したいときは
B=format(10進数,'b')
#intを使って後で10進数にしたいときは
C=bin(10進数)

#listの文字を統合したいときは
A=''.join(list名)
#listの中の要素がstrじゃないとエラー吐くので注意
#''の中に任意の物を入れることによって、間に文字を入れられる

#forは文字でも参照可能


この記事が気に入ったらサポートをしてみませんか?