paizaラーニング(初心者〜中級者向けのプログラミング学習サービス)で、ハッシュを使いそうな問題を見つけたのでやってみる。
以下の記事の続き。
共通ルール
入力
- 入力値最終行の末尾に改行が1つ入ります。
- 文字列は標準入力から渡されます。
出力
- 最後は改行し、余計な文字、空行を含んではいけません。
5. 1人の占い結果 (paizaランク C 相当)
次のような占いプログラムを作成してください。
最初に「ユーザー」 U が1つ与えられます。
続いて n 人の「ユーザー」と「ユーザーに対応する血液型」が与えられます。
続いて m 種類の「血液型」と「血液型に対応する占い結果」が与えられます。
与えられたユーザー U に対応する占い結果を表示してください。
入力例の1つ目は、ユーザーの血液型についてのラッキーカラーの占いです。
「血液型」として「星座」などのさまざまな文字列を利用できるようにすることで、他の占いにも対応する必要があることに注意してください。入力される値
U
n
(ユーザー_1) (ユーザー_1の血液型)
(ユーザー_2) (ユーザー_2の血液型)
(ユーザー_3) (ユーザー_3の血液型)
...
(ユーザー_i) (ユーザー_iの血液型)
...
(ユーザー_n) (ユーザー_nの血液型)
m
(血液型_1) (血液型_1の占い結果)
(血液型_2) (血液型_2の占い結果)
(血液型_3) (血液型_3の占い結果)
...
(血液型_j) (血液型_jの占い結果)
..
(血液型_m) (血液型_mの占い結果)期待する出力
ユーザーUの血液型に対応する占い結果を出力してください。
最後は改行し、余計な文字、空行を含んではいけません。条件
・Uは、半角英数字からなる1から20文字までの文字列
・1 ≦ n ≦100
・1 ≦ m ≦100
・(ユーザー_i)は、半角英数字からなる1から20文字までの文字列
・(血液型_j)は、半角英数字からなる1から20文字までの文字列
・(血液型_jの占い結果)は、半角英数字からなる1から20文字までの文字列
・(ユーザー_iの血液型)と等しい、(血液型_j)が必ず存在
・i ≠kのとき、(ユーザー_i)と(ユーザー_k)は異なる文字列
・j ≠kのとき、(血液型_j)と(血液型_k)は異なる文字列
入力例1
Kyoko 5 Kyoko B Rio O Tsubame AB KurodaSensei A NekoSensei A 4 A red B green O blue AB yellow
出力例1
green
自分の解答
target = gets.chomp def make_hash n = gets.to_i hash = {} n.times do a, b = gets.split hash.store(a, b) end hash end users = make_hash fortunes = make_hash target_pare = users.find { |k, v| k == target } ans_pare = fortunes.find { |k, v| k == target_pare[1] } puts ans_pare[1]
感想など
チケットが足りなくなって1問しかできず…。
メソッドを作ろうと試みたけどなんか中途半端な気も。でも今はこれ以上思いつかない。
ハッシュにfind
使うと Array が返ってくるのか。
irb(main):001:0> users = {"Alice": 20, "Bob": 30} irb(main):002:0> users.find { |k, v| v == 30 } => [:Bob, 30]