ロコガイド テックブログ

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

【RubyKaigi2019】ワークサンプルチャレンジの最優秀回答に選ばれました

こんにちわ、トクバイ技術部の岡田です。

RubyKaigi 2019でラクスルさんがコーディングチャレンジを開催していたので
回答してみたら、
なんと最優秀回答に選ばれました!

ラクスルさんありがとうございます!

コードチャレンジ内容

ページはこちら

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では、トクバイステッカーと サービス紹介とエンジニア紹介のチラシを配りましたが、 こちらはラクスルさんを使わせて頂きました!

短納期でお安く、コスパ最強だと思っています!

チラシ_ステッカー@RubyKaigi2019