Just do IT

思うは招く

Ruby基礎問題100本ノック#5 配列の各数字に対応する文字列をハッシュから取り出す

お題

とある配列の、後ろから1〜3番目の数字それぞれに対応する文字列を、用意されたハッシュから取り出して連結で表示せよ。

例えば、["1", "2", "3", "4", "5", "6"]といった配列があり、次のようなハッシュがあったとする。

  hash = {
    "0" => "---",
    "1" => "--x",
    "2" => "-w-",
    "3" =>  "-wx",
    "4" => "r--",
    "5" => "r-x",
    "6" => "rw-",
    "7" => "rwx"
  }

配列の後ろから1〜3番目の数字に対応する文字列をハッシュから取り出して、連結して表示せよ。

回答

def fetch_strings(ary)
  hash = {
    "0" => "---",
    "1" => "--x",
    "2" => "-w-",
    "3" =>  "-wx",
    "4" => "r--",
    "5" => "r-x",
    "6" => "rw-",
    "7" => "rwx"
  }

  strings = ""
  ary[-3..-1].each { |c| strings += hash[c] }
  puts strings
end
ary = ["1", "2", "3", "4", "5", "6"]
fetch_strings(ary)
=> r--r-xrw-

説明

ハッシュのキーに対応する値をそれぞれ抜き出していく。

まずは空文字列のstringsを用意する。

「配列の後ろから1〜3番目」は次のように表現できる。

ary[-3..-1]

−1が最後の要素で、−3は最後の要素から3番目。..でつないでいるので、「最後から3番目の要素〜最後の要素」という意味になる。つまりここでは4、5、6が該当する数字。

次にeachメソッドを使って、ブロックの中で配列の各要素をハッシュの値として取得し、stringsに代入していく。

反省

最初はなぜかこう書いていた。

ary[-3..-1].join.chars { |c| strings += hash[c] }

「配列をjoinメソッドで文字列にして、charsメソッドでそれを配列に戻す」というわけのわからない書き方をしてしまっていた。

空文字なり空配列なりを用意して代入するパターンはけっこう慣れてきた感じがある。