海外通販の誤配送やヤマトの荷物破壊で精神をすり減らしているうちに担当日になってしまった。
試される大地・北海道で絶賛試され中のtakuma-fです。
最近ではとうとう寒さが本番を迎え、外を歩くと耳が千切れそうです。
みなさんが本格的な記事を書く中、チラシの裏のようなネタを投下するのも恥ずかしいのですが、最近競技プログラミングとCTF(Capture the flag)にハマっています。
1ヵ月ほど両者を取り組んで感じたことなどをご紹介しようと思います。
競技プログラミング
国内外にさまざまなコンテストがありますが、執筆時点で国内だと最もメジャーなAtCoderに取り組んでいます。
著者はABCコンテストのB問題は楽々解けるけどC問題になると苦戦する、程度のスキルです。
- とにかく動くコードを早く書くことが大切
- 自分のプログラミングレベルが客観的に測れる
- プログラミングに特化したものなので、基本的にはエディタがあれば戦える
問題を解くことで自分の実力を測るのもひとつですが、他者の回答を見るとバイト数や実行時間を削るためのテクニック、命題を満たせるよりシンプルなロジックなど、実務に応用できそうなヒントがたくさん得られるのも競プロの面白さです。
def main():
input_list = list(map(int,input().split()))
n = input_list[0]
a = input_list[1]
b = input_list[2]
answer = 0
for i in range(1, n+1):
digit_sum = sum(list(map(int, str(i))))
if (digit_sum >= a) and (b >= digit_sum):
answer += i
print(answer)
if __name__ == "__main__":
main()
最近は私もワンライナーやmap関数, lambda関数を多用するようになりPythonが黒魔術化しつつあります。
Pythonはそれほど高速な言語でないので、並列処理なども活用できるようになりたいですね。
n, k = list(map(int,input().split()))
h = list(map(int,input().split()))
print(sum(list(map(lambda x: 1 if x - k >= 0 else 0, h))))
学習方法
AtCoderの過去問をA, B中心に解きまくっています。
Githubにリポジトリを立てて問題ごとにファイル作成してコミット、正解したものはmaster
ブランチへ、途中(不正解)の問題はinprogress
ブランチに入れるようにしています。
Github(Git)で管理することで以下のようなメリットがあります。
- リポジトリをクローンできる環境があればどこでも学習できる
- Githubプロフィールに草を生やせるのでモチベーションに繋がる
- ブランチを分けることで正解/不正解を分けて管理できる
当方では自宅のPCのほかに自前のAWS上にCloud9環境を構築しています。
CTF
CTFはプログラミングで解く問題だけでなく、アセンブラやパケットキャプチャ、暗号文など計算機理論やネットワークへの広範な知識が必要となり、便利なツールを知っていることも重要です。
例えばパケットキャプチャではWiresharkというソフトが定番だったりします。
Linuxコマンドを使うと便利な場合も多いので、Linux環境を用意しておくとベターでしょう。
私は自宅PC(Macbook)と上記のCloud9で賄っています。
CTFもさまざまなサイトで問題が常設されており、CpawCTFや、XmasCTF、社内セキュリティコンテストの過去問に取り組んでいます。
サーバからのレスポンスの違いからパスワードを推定する、といったスーパーハカーになりきれる問題から、与えられたキーワードを基にソーシャルハックするといったネトスト問題まで幅広いです。
感想
本当はAtCoderのABCに参加して茶レベルにはなったぜイヤッホウ、くらいのことが書きたかったのですが、見事に参加をサボってしまいまだ何のレベルも付いてません。
すぐサボるのは本当に自分の悪い癖ですね。
来年には自然言語処理の前処理とかでなにかお話しができれば…。