Rubyの問題集に触れるということ / 解法も知識

※今回の問題に対する完成コードはこのページにありません。

 

こんばんは、NUKEDOです。

オリジナルアプリの新実装はまだひと段落ついていないため

本日も朝にやったドリルについて書いていきます。

今朝の問題は自力での解答を探した結果、

問題集は問題集で重要だという結論になりました。

 

本日のRubyドリルの問題は

「数字のみで構成された配列内から、指定された数字を特定の方法で検索しろ!」

というものでした。その特定の方法がバイナリーサーチと呼ばれるもので、

与えられた配列が数が小さい順に並んでいるので

配列の中心を見る→その数字との大小関係を見てどちら側にあるかを確認

→存在する側の中心を見て、またどちら側にあるかを確認→…

と繰り返すことでどこにあるかを確認しろというものです。

 

例を挙げると

[1,3,5,7,9,11,13]から「6」を探せ!

→真ん中は7だからそれより小さい6は左側にある! →[1,3,5]の真ん中を見る

→真ん中は3だから右側にある! →[5]の真ん中は5だから右側にある!

→もう配列がない=存在しない!

という探し方です。

 

15分ほどで解く問題ですが2時間かけても自力では解けませんでした

スクールの模範解答を載せることは規約違反になるので省略させていただきます。

自力で解こうとした結果、結局未完成のコードがこちら↓(クリックで拡大)

f:id:NUKEDO:20201120215421p:plain

f:id:NUKEDO:20201120215514p:plain


 全体的に読みにくく、特にbinary_searchメソッド内else以下の

21行目以降の部分がグチャグチャですし、

自分でも書いていてわけがわからなくなりました

これは模範解答でも結構長めのコードでしたが、そちらは読んで意味がわかるので

明らかに自分の書いたものより優れたコードです。

 

今回言いたいことはいろんな書き方を模索しようということです。

自分のやり方は決して難解な方法ではないんです。

ただ、無理に変数だけで表現してるせいで

すごく読みにくく確認しにくい書き方になってしまっているんです。

 

例えば、真ん中の数字を見た後にnew_arrayとして左側もしくは右側の該当部分を

新配列として作成して、binary_search(new_array, num)として渡す形に

直すだけで非常に見やすくなるはずです。

そして模範解答はwhile文を用いておりcenter以外に右端左端用の変数を用意しており

配列内にある場合には何番目かを、配列内にない場合には判別用の変数を-1にして返す

というものでした。

 

やり方を知れば「なんだそれでいいのか」で使えますが、

知らないといつまでも難解な書き方を繰り返すことになるかもしれません

「ドリルを解いても実力は上がらない」といったことを書いてあるサイトはありますが

知ってるか知らないかで差がつくことは間違いなくあると思います。

 

また自分は2時間かけて解けずに諦めましたが、

やり方を変えていればもっと早く解けたものだと考えます。

コードの書き方は1つではないので、あるやり方で詰まったなら別の方法を

試してみることにします。

 

そういうことを考えさせられる2時間でした。