最近プログラミングを始めたのですが、「AtCoder」という競技プログラミングのコンテストにはまっています。
AtCoderの特徴としては以下が挙げられます。
- 毎週末オンライン開催
- A〜Fまで、全6問
- 使用言語の選択肢が非常に多い
- レートに応じた「色」が与えられる
今回、3回目の挑戦で初めてA・Bの2問でAC(正解)を出せたので、記念にエントリを書きます。
前提
- プログラミング学習2ヶ月目
- 使用言語:Python
- 167はタイムシフト参加。自分で1.5時間はかった。
A - Registration
一部が違う文字列2つが与えられて、その比較をする問題。
文字列を1文字ずつリストに格納していく方法、配列の最後を指定する方法が分からなかったので、ググりながら進めました。
答えが分からなくても、答えを探す方法を知っていれば道が拓けることが、プログラミングやってて楽しいところです。
# coding: utf-8 # Your code here! # 標準入力から2つの文字列を受け取る bad_id = input() co_id = input() # 文字列を1文字づつ配列に入れる bad_id_array = [bad_id[i: i+1] for i in range(0, len(bad_id), 1)] co_id_array = [co_id[i: i+1] for i in range(0, len(co_id), 1)] # co_id_arrayから最後の1文字を削除 co_id_array.pop(-1) # bad_id_array と co_id_arrayを比較して、出力する if bad_id_array == co_id_array: print("Yes") else: print("No")
https://atcoder.jp/contests/abc167/submissions/13097605
B - Easy Linear Programming
参加したABCのB問題の中では、今までで一番かんたんな問題に思えました。
標準入力で受け取った4つの数字をそれぞれ変数として処理していく問題。
一度、コピペミス・コードチェック不足でWAを食らってしまいましたが、すぐに修正できました。
# coding: utf-8 #標準入力で受け取り配列に入れる num_line = input().split() #配列から変数を取り出す num_one = int(num_line[0]) num_zero = int(num_line[1]) num_mini = int(num_line[2]) num_amount = int(num_line[3]) #num_oneから順に取っていく if num_one >= num_amount: print(num_amount) elif num_one + num_zero >= num_amount: print(num_one) else: #マイナスの数を計算して保存 minus_count = num_amount - (num_one + num_zero) print(num_one - minus_count)
https://atcoder.jp/contests/abc167/submissions/13100164
リスト内包表記はすごい
バイト先のエンジニアの方が、B問題をサクッとコードレビューしてくださいました。
#標準入力で受け取り配列に入れる num_line = input().split() #配列から変数を取り出す num_one = int(num_line[0]) num_zero = int(num_line[1]) num_mini = int(num_line[2]) num_amount = int(num_line[3])
この部分。
「リスト内包表記」を使うと楽に書けるよ、と教えてもらいました。
num_one,num_zero,num_mini,num_amount = [int(i) for i in input().split()]
5行のコードが1行にまとまってしまった。
これは競技プログラミングやるにあたって、必須の知識だなあ。
ただリスト内包表記は可読性が悪いので、誰かと協働してコードを書く時には向かない、と。
今後の課題
今回ABまで解ききれたのは、
- タイムシフト参加で緊張しなかった
- たまたま分かる問題が出た
とラッキーな要素も多かった。
今月はABが安定して解け、Cにも挑戦できることを目標にします。
for文・while文・配列の扱いを、手を動かしつつもっと慣れていきたいです。