こんにちわ、トクバイ技術部の岡田です。
RubyKaigi 2019でラクスルさんがコーディングチャレンジを開催していたので
回答してみたら、
なんと最優秀回答に選ばれました!
ラクスルさんありがとうございます!
出題のロジックで行われているのは二次元配列を左に90°回転する処理。その処理の本質を見抜き、Rubyで実装されているtransposeを活用して、ここまでショート・シンプルに表せた素晴らしい回答です!ということで、 @jun0kada さんおめでとうございます!
— Yusuke Izumi (@yizumi) 2019年5月21日
コードチャレンジ内容
RAKSULの技術面接で出される「ワークサンプル」から抜粋された問題をベースに、RubyKaigi2019の出席者の方にオマケのコンテンツとしてコーディングチャレンジをご用意しました。 優秀な回答者の方から抽選で1名様に、ラクスルCTOより豪華Amazon Gift 10,000円をプレゼントさせていただきます!
問題
以下のRubyコードは、n x nの2次元配列を引数として、ある処理を行う関数です。
このコードの振る舞いを変えずに、どれだけ短く記述できるかを考えてみてください。※ n x n なので行と列の数は一致していることが前提です
※ 文字カウントは、関数の宣言 def から終了の end までを含むものとします(サンプルの文字数:190)
※ 文字数にはスペース・改行コードも含みます
※ Ruby Ver. 2.6.2 で実行できることが条件です
※ 回答はお一人様一回とさせていただきます
def r(matrix) s = matrix.size t = Array.new(s) { Array.new(s) } matrix.each_with_index do |row, j| row.each_with_index do |val, k| t[s - k - 1][j] = val end end t end
今回は私がどのようなアプローチでこの問題を解いたのかを説明します!
0. 戦いは夜中から
RubyKaigi最終日が終わり、
社内メンバーでの打ち上げが終わり、
ホテルに戻り、
ふと思いました。
「眠くない!」
締めのラーメン(2杯目)を食べに行ったCTOと技術部長について行けば良かったなと後悔しつつも
ラクスルさんのコーディングチャレンジを思い出し、
挑戦することにしました!
1. ぱっと見る
お酒を飲んだこともあり、頭が全然働かず、
問題文を読んでも
サンプルコードを見ても
何をやっているのかわかりませんでした。。
2. とりあえず動かしてみる
そこで irb
を立ち上げ、
サンプルコードをコピペして、
実行してみました
r([[1, 2], [3, 4]]) => [[2, 4], [1, 3]] r([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) => [[3, 6, 9], [2, 5, 8], [1, 4, 7]]
3. ひらめいた!
「なんかnumpyのtransposeみたいなことやってるな〜」と思いました
transpose
!?!?
ひらめきました!!
私の回答はこちらです
def r(m);m.transpose.reverse;end
(文字数 32)
まとめ
動かしてみるって大事ですよね〜
ラクスルさん、楽しいコーディングチャレンジをありがとうございます!
ちなみに、 RubyKaigi2019では、トクバイステッカーと サービス紹介とエンジニア紹介のチラシを配りましたが、 こちらはラクスルさんを使わせて頂きました!
短納期でお安く、コスパ最強だと思っています!