Python
AtCoder
競技プログラミング

Pythonで競プロに挑む日誌 vol.10 ~文字列調査~

ABC の A, B 問題をコツコツ解く日々.
油断すると A 問題に足元をすくわれる.

現在の目標

  • 今年の10月内に茶色を取得する
    • ABS の問題を全部解く (完了)
    • ABC の A, B 問題を全部解く←イマココ
  • 年内に緑色を取得する
    • ABC の C, D 問題を全部解く
  • APG4b で C++ にも手を出す

今日の問題

ABC003B - AtCoderトランプ
https://beta.atcoder.jp/contests/abc003/tasks/abc003_2

結果

answer1.py
#coding: utf-8
import sys

S = input()
T = input()
lis_str = ["a", "t", "c", "o", "d", "e", "r"]

for i in range(len(S)):
    if S[i] == T[i]:
        continue
    elif (S[i]=="@") and (T[i] in lis_str):
        continue
    elif (T[i]=="@") and (S[i] in lis_str):
        continue
    else:
        print("You will lose")
        sys.exit()
print("You can win")

# 実行時間:17 ms
# メモリ :3064 KB
# コード長:383 Byte
# 得点  :100/100

解けるには解けました. いつものようにほかの人の解答を参照したら, やはりもっとスマートな方法がありました.

answer2.py
#coding: utf-8
S = input()
T = input()
ans = 'You can win'
for a,b in zip(S,T):
    if a!=b and a+b not in ('@a@t@c@o@d@e@r@'):
        ans = 'You will lose'
        break
print(ans)

# 実行時間:19 ms
# メモリ :2940 KB
# コード長:192 Byte
# 得点  :100/100

なるほど, と思ったポイントは下記3点.

  • zip の使い方
  • 特定の条件時に ans を上書きするという発想
  • "if a!=b and a+b not in ('@a@t@c@o@d@e@r@'):"

1つ目の zip は今後も使えそうですね.

2つ目の書き方は好みの問題かもしれませんが, 条件式が減らせるかもしれないので覚えておきます.

そして最後の判定は, 思いついたら気持ちよさそうですね. S と T から一文字ずつ抜き出して, 「@ + "atcoder" のいずれかの文字」になっている, もしくは, 「"atcoder" のいずれかの文字 + @」になってるかどうかは、たしかにこれで調べられますね.

うーむ, 道のりは長い. けど, 前向きにがんばろう.

明日やること

  • ABC を解き続ける.