CodeIQ 挑戦

CodeIQ の星 4 個の問題に挑戦してみた。(この問題。回答期限が過ぎたらリンク切れになるかも)

ちなみに、CodeIQ は Recruit の運用しているプログラムの問題を出してくれるサイト。答えを提出すると Unit Test を動かして自動採点してくれる。誰がどの程度正解したかをヘッドハンターや企業の採用担当の人が閲覧出来るようになっており、それを元にしたスカウト機能が付いている。そのため、ユーザーは無料で使用可能。

初心者向けプログラム学習サイトとは異なり、「簡単すぎる問題しかない」という事もないし、かと言って競技プログラミングのような理不尽なまでの難しさもない。Paiza というよく似たサービスもあるのだが、CodeIQ は Haskell が使えるので重宝している。(只今 Haskell 勉強中)

CodeIQ の問題は難易度に応じて星 1 個 – 星 4 個で分類されている。ただ、CodeIQ は問題の検索性が悪いというか、星の数で問題をフィルタリングする事が出来ない。そのため今まで星 4 個の問題を見つけた事がなかったのだが、今回はたまたま見つけたのだ。ちなみに、該当の問題には「難問」というタグがついていた。そうか、星 4 個の問題は Ctr-f で「難問」を検索すれば見つかるのか。

何はともあれ星 4 個の問題を見つけたので挑戦してみる。挑戦にあたり、今回気になったのは以下の 3 点。

  • そもそも、俺に星 4 個の問題が解けるのか?
  • 今まで、星 1 個の問題を解いたらそのプログラムの「初級」に、星 2 個の問題を解くと「中級」に、星 3 個の問題を解いたら「上級」に認定された。星 4 個を解けたら何級?
  • 今、星 3 個を解いた状態でも時々スカウトが来る。星 4 個を解けたらどれだけスカウトが来るのだろう?(チヤホヤされるの大好き)

さて、既に心は問題を解けたつもりで何となく顔がニヤけながら問題を見てみる。

何これ、難しいじゃん。

もちろんプログラムとしても難しいんだけど、数学的にも簡単ではない。何より、「想定時間 30 分」って何だよ!30 分で出来るわけねー。

でもプログラムって不思議なもので、出来ない問題ほど楽しい。出来無いなりに手を動かし続けたら、とりあえず動くものが出来た。ここまで 2 時間以上かかっている。想定 30 分の問題に対して 2 時間以上か。なんか結果が出る前に負けた気がする。ここで既に最初のウキウキは消え失せているわけだが、回答を提出してみる。

まさかの全問不正解

この問題では 6 セットのデータを用いてプログラムを動かして正しく動くか確認してくれるのだが、

なんと全問不正解

ただ、CodeIQ は親切な事にテストしたデータセットと提出したプログラムの実行結果を表示してくれる。これが何かおかしい。自分の開発環境で同じデータを流した時と結果が違う。

「オーバーフローか!」

Haskell コードの Int 型を全て Integer 型に変換して再挑戦。

テストが通った!

テスト 6 個のうち 1 個が失敗したけど、5 個は通った!

それにしても、「俺の環境では動きます」というダメプログラマの典型文句を自分で言うことになるとは。それに、この 1 個が通るようにするのがまた大変なんだよね。この日は他にする事があったので一旦終了。

次の日、「さて、昨日の続きをやるか」と思ってCodeIQ を開いたら驚いた。なんと、この問題に関連したスカウトがもう来ているではないか。「星 4 個ですよ、すごいですねえ」っていう歯の浮くようなスカウトだった。現在転職活動はしていないのでスカウト貰っても意味はないし、相手の立場からすればお世辞だと言うことは分かっているんだが、なんか嬉しい。

それにしても、まだ俺解いていぞ。1 個テストが通らなかったんだぞ。この差出人、どれだけ見ているんだ?

すこし気力が回復したので再度問題に挑戦。各関数に対して unit test を書いていったら原因は意外と早くわかった。浮動小数点計算における桁落ちだ。計算の順番を変更して再提出したら、めでたく全テストを通過した。良かった。

さて、最初に気になっていた結果だが、まず星 4 個の問題はなんとか解けた。でも、想定 30 分の問題に合計 3 時間以上かけてしまった。不本意だ。半年前だったら「俺、プログラマじゃないし」って言い訳できたんだが、今は仕事でもそれなりにコード書いているからなぁ。

次に CodeIQ からの認定だが、今回は特に無かった。星 4 個を解いたのに、星 3 個と同じ「上級」のまま。「超上級」みたいな認定がもらえれば嬉しかったのに。

最後にスカウトだが、あまり来なかった。お世辞で持ち上げてくれたのはあの 1 通だけ。あとはいかにもコピペチックな定型文のスカウトが 3 通きただけだった。少し残念。プロフィールあまり書いていないからかね?一応 Linked in へのリンクは貼ってあるのだが。

以上、CodeIQ への挑戦履歴でした。

重力波って何?

少し前の話なので遅きに失したという感がするが、重力波の話。

先日同僚と食事をしているときに、
「俺さんって重力波とかも何の事言っているか分かるんですか?」
と聞かれた。

その時にザックリと説明したら意外と理解してもらえたようなので blog にも掲載。

まず、相対性理論以前の重力の理論は全てニュートンの万有引力の法則で説明がついた。この万有引力は、2 個の物質の質量と距離だけで決まる。例えば、月と地球の間の引力は月と地球の質量と、間の距離だけで計算する事ができる。

例えば、今、月が真上にあるとしよう。この状態で体重を測ると、月の重力で上に引っ張られるため、本来の体重よりわずかに軽く測定されるはずだ。

では、月と地球の距離が少し変化した場合はどうだろう?
月は地球を中心とした完全な円軌道を回っているわけではない。月と地球の間の距離は、刻一刻と変化し続けている。その際、月と地球の間の引力はどうなるだろう?

ニュートンの万有引力の法則が絶対的に正しければ、月と地球の距離が変わるとその間の引力も瞬時に変わる。だから、月の位置が変わると体重計で測定される値はわずかだが瞬時に変わるはずだ。これは、「月の位置が変わった」という情報が光速を超えて地球に伝わったという事に他ならない。つまり、万有引力の法則は「情報が光速を超えて伝達する事は無い」という相対性理論と矛盾するのだ。

しかし、万有引力の法則に「重力波」という補正をかけると、この矛盾は解消する。こう考えてみよう。

  • 質量を持つ物質は、周囲に重力場を作る。
  • 質量を持つ物質は、他の物質が作った重力場から力を受ける。(これが引力)
  • 質量を持つ物質が移動すると、その近くの重力場が変わる。
  • 一部の重力場が変わると、その近くの重力場も少し変わる

こうして、質量を持つ物質が移動すると、その近くから順々に重力場が変わっていく。この連鎖的に重力場が変わる様子は波の性質を持っている。これが「重力波」だ。

いや、こんな事まで予言していたなんて、アインシュタインはすごいね。

俺の寝具

今日は、新居の寝具の紹介。

「必要な物以外買わない」をモットーにしている新居について、寝具は結構重要な問題だ。

まず場所をとる。無駄に立派なベッドを買うと広い部屋に引っ越さなくてはいけない。すると、固定費として毎月数千円が飛んでいく計算になる。

また、次に引っ越す場合に捨てるのも持っていくのも面倒。これは「引っ越すの面倒」という影響を心理に与える。変化に対応する能力が衰えるということだ。

そこで、今回は近くのドン・キホーテでエアマットを買った。電動ポンプがついていて、コンセントに入れてスイッチを入れればすぐに膨らやつ。お値段 4500 円。Amazon だともっと安く買えたようだが、「今夜」欲しかったので仕方ない。ネットでちょっと調べたらこの手のマットレスの評判は悪くないし、万一気に入らなければ捨てればよい。空気を抜けば捨てるのも簡単だし、この値段なら諦めもつく。ビニール製なので、汚れたらコロコロをかければよいのでシーツも不要。中々良い選択をしたと考えた。
ちなみに購入したのはこれの類似品。

数日間これを使ってみて 2 点気が付いた。まず、空気を抜いた状態でも意外とボコボコしている。そのため、コロコロをかけようにもうまく行かない。次に、マットレスたるもの上に布団を敷くのが前提なのだろうか。凸凹の上に直接横たわっても寝心地がよろしくない。

1 点目はまあ良いとして、2 点目は結構深刻な問題。できるだけ早くに解決したい。

そこで、この上に敷くべく、「低反発マットレス」とやらを買った。なんかマットレスの上にマットレスを敷いて布団が無いというのは若干違和感があるというか問題を解決していない気がしないでもないのだがまあ良い。

早速としだしてみて思ったこと。幅が狭い。長さはよい。でも、幅が狭い。

だって、シングルサイズのエアマットの半分のサイズだよ。寝返り打てないよ。少し太めの人なら、寝返りどころか普通にしていても体が収まらないのではないだろうか?でも、まあ買ってしまったからにはとりあえず使ってみる。

で、これも数日間使ってみて 2 点気が付いた。第一に、この低反発マットレスはヨガマットのように使える。これを床に敷いてしまえば、上で柔軟体操とか腹筋とかしても痛くない。。普段は低反発マットレスをエアマットレスの上に敷いて使いながら、時々低反発マットレスを床に卸して軽い運動ができるのだ。第二に、俺の寝相は意外と良いようだ。幅が狭くて心配した低反発マットレスだが、ちゃんと朝までこの中に収まっている。

そして、先日この低反発マットレスについて新しい発見をした。

低反発マットレスの上で体操をした後ウトウトして、そのまま朝まで眠ってしまったのだ。これだけで寝れる。エアマットレス不要。

よく考えてみると、低反発マットレスもマットレスだよね。見た目の薄さに惑わされて、これ 1 個じゃ使い物にならないと思い込んでいた。ってなわけで、エアマットレスを早速片づける。空気を抜けばすぐにしまえる所が良いね。おかげで部屋も広くなったし、いつでも柔軟体操ができるようになった。

快適、快適。