紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【競プロ】1歳児を育てながら #AtCoder の過去問を1日1問解き始めました

はじめに

1歳の息子を育てながら、AtCoderの過去問題を毎日1問解くようにしています。

私の今の状況

私は今年で37歳になります。30代後半でかつ、子育てをしながら、競技プログラミング(と言うかプログラミング)を勉強している SIer 勤務のエンジニアです。いわゆる世間で言うところの35歳定年説に引っかかる年齢です。

競技プログラミングが強い人を見ていると、大体学生時代から競技プログラミングに打ち込んできた人が多いように感じています。そのため、競技プログラミングの敷居がかなり高いなと思っていたのですが、試しにやってみたら面白かったので、少しずつ勉強することにしました。

同じような境遇の人がどれだけいるか分かりませんが、私自身の体験を記事にしたいと思います。 世の中こういう奴もいるんだなと思っていただければ幸いです。

現時点の私の実力

1回出場しただけなので灰色です。へっぽこです。 当面の目標は茶色コーダーになることです。

f:id:yokoyantech:20190213220102p:plain

最近公開された、@chokudaiさんのブログを拝見して、どこまで自分の実力を伸ばすことができるのか、試してみたいと思っています。

chokudai.hatenablog.com

ちなみに、先月初めてAtCoderのコンテストに出場しました。

www.yokoyan.net

A 問題が1問しか解けなかったという現状を踏まえて、AtCoder Problemsを使って平日に過去問を1日1問ずつ解くようにしています。

以下、過去問を解いて感じたことをまとめます。

育児をしながらでもプログラミングは勉強できる

A 問題をRubyで10問ほど解きました。Rubyだとだいたい10行以下のプログラムで解くことができます。この短さが育児に追われている私には非常に良い長さです。

私は、帰宅中の電車の中でスマホで過去問題を見て、家まで歩いている時間でロジックを考えて、息子を寝かしつけてからコードを書いています。フルタイムで働きつつ、朝は家族全員の朝食や、自分の弁当を作り、夜は息子と一緒にお風呂に入って、絵本を読み聞かせてから、息子を寝かしつけています。(息子は私にくっつかないと最近寝ないため、一晩中一緒に寝ています)妻との二人の時間も大切にしたいため、コーディングに使える時間が1日15分程度しかありません。

そのため、ロジックは外で歩きながら考えて、考えた結果を集中して一気に書き上げるようになりました。A 問題はそこまで複雑な問題ではないため、歩きながら考えるにはとても良いです。スキマ時間をうまく使えば、プログラミングは勉強できるなと思うこの頃です。

おすすめの勉強法

A 問題を10問ほど解いて、自分なりの勉強法が確立できてきたのでまとめます。とはいえ、大したことではなくて、 AtCoderの過去問を解いている人はみんなやっている勉強方法だと思います。

  • 自分でコードを書く
  • ACになるまで考える
  • 自分の答えができた後に、一番コードが短い人の回答を見て写経する

人のプログラムを読むことは非常に勉強になります。この勉強方法のメリットは、自分では全く思いつかなかった、実装方法が学べるということです。だいたい私が10行ぐらいかけて書いていることが、実は1行で実現できるということが多く、 A 問題であっても学ぶことが非常に多いなと感じています。

そういうプログラムを書く人はかなり上位のレートの人であることが多く、生産性が劇的に違います。インプット情報は同じ問題なのに、こうもアウトプットが違うのかと衝撃を受けています。

ABC 047の A 問題

atcoder.jp

この問題は私は8行使ったのですが、

# 私の解答
abc = gets.chomp.split.map(&:to_i)
ans = abc.inject(:+)

if (ans / abc.max == 2) && (ans % abc.max == 0)
    puts 'Yes'
else
    puts 'No'
end

一番短い人はなんと、1行で実現していました。

# 1番短い人のコード
a,b,c=gets.split.map(&:to_i).sort;puts a+b==c ?:Yes: :No

ABC 049の A 問題

atcoder.jp

この問題は、正規表現を使って1行で書くことができることを学びました。

# 正規表現 =~//
# /W[aeiou]rd/は、Ward,Werd,Wird,Word,Wurdのいずれかにマッチする
# https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
# 3項演算子 ?: true : false
puts gets=~/[aeiou]/?:vowel: :consonant

ABC 050のA 問題

atcoder.jp

この問題は、 eval メソッドを使って1行で書くことができることを学びました。

# eval()メソッド
# 仮引数内に渡ってきた文字列をRubyのコードとして解釈・実行する
p eval gets

競技プログラミングを学び始めた感想

面白いです。そして業務に役立ちます。出来る限り短いコードで要件を実現できないかと考えるようになりました。結果、コードをリファクタリングするようになりました。

私はSIerで10年以上エンジニアとして働いています。 SIerあるあるだと思いますが、20代半ばから30代前半まではプログラミングというよりはプロジェクト管理の仕事が多かったです。

35歳になってから再びプログラミングを学び始め、今ではRailsを使ったクラウドサービスのプログラマとして働いています。詳しい経緯は以下の記事に書きました。

www.yokoyan.net

競技プログラミングを本格的に始めたのは最近です。この年齢になって思うことは、学生時代もしくは、20代のうちに競技プログラミングと出会っていれば良かったなと思います。自分のことだけを考えて、打ち込むことができる年齢のうちにプログラムを学ぶのは非常に良いことだと思います。

とは言え、嘆いたところで時間が巻き戻るわけでもないので、今が一番若いと考えて、これから出来る範囲でコツコツとプログラムを学び続けたいと思い、できる限り自分の手を動かすようにしています。結局、自分で読み書きしたコードの量が自分の実力なのだと思います。

「もう●●歳だから」 というのは言い訳にしかなりません。このまま子育てをしながら競技プログラミングも続けて、いつか息子と一緒にAtCoderのコンテストに出場したいと思います。

今の生活での最優先事項は、妻と息子と過ごす時間です。家で育児をしながらプログラムを書くということは、家族の理解が必要不可欠です。息子が起きている場合は無理です。息子が私に向かって抱っこしてほしいと喃語で主張してくるので、膝の上に息子を乗せてキーボードを叩くことになります。そうすると、息子もキーボードを叩き出すので、結果、コードをうまく書くことができません。(息子の仕草が可愛いため、コーディングどころではありません)

育児と家族と過ごす時間を最優先にしつつ、スキマ時間をうまく使って、これからもプログラムを書き続けたいと思っています。

まとめ

ということで今回はAtCoderの過去問題を毎日1問解くということについて書きました。土日は家族と過ごす時間に充てたいため、主に平日の5日間を使って一日一問解くようにしています。レーティングがつくコンテストも月に1回は出場したいと思っているので、出来る範囲で紙一重の努力を積み重ねたいと思います。

茶色コーダー目指して頑張ります!