お題
とある配列の、後ろから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メソッドでそれを配列に戻す」というわけのわからない書き方をしてしまっていた。
空文字なり空配列なりを用意して代入するパターンはけっこう慣れてきた感じがある。