paizaラーニング(初心者〜中級者向けのプログラミング学習サービス)の問題集をやってみる。
共通ルール
入力
- 入力値最終行の末尾に改行が1つ入ります。
- 文字列は標準入力から渡されます。
出力
- 最後は改行し、余計な文字、空行を含んではいけません。
3. 配列(リスト)の重複カウント (paizaランク D 相当)
指定された配列(リスト)の定義の中で、同じ要素の数をカウントして、その数を出力してください。
入力される値
なし"HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"
を要素に持つ配列(リスト)をプログラムで定義し、使用すること。
ただし、2つ以上同じ要素が出現するのは、1種類の文字列についてだけです。期待する出力
同じ要素の数をカウントして、その数を出力してください。
自分の解答
ary = ["HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"] def find_plural(array) plural = array.group_by(&:itself).map do | k, v | [k, v.size] end.to_h.select do | k, v | v > 1 end plural.values end puts find_plural(ary) #=> 5
group_by
にitself
を渡せるの知らなかった。
irb(main):001:0> ary = ["HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"] irb(main):002:0> ary.group_by(&:itself) #=> {"HND"=>["HND"], "NRT"=>["NRT"], "KIX"=>["KIX"], "NGO"=>["NGO", "NGO", "NGO", "NGO", "NGO"]}
group_by
にブロックを渡すとハッシュが返ってくる。それを map
で処理すると、今度は Array(配列)が返ってくるので、to_h
でハッシュに変換。
irb(main):003:0> ary.group_by(&:itself).map { |k, v| [k, v.size] }.to_h #=> {"HND"=>1, "NRT"=>1, "KIX"=>1, "NGO"=>5}
結構難しかった。 もっとハッシュに強くなりたい〜
Enumerable#group_by (Ruby 2.7.0 リファレンスマニュアル)
4. 配列のソート (paizaランク D 相当)
指定した配列を定義し、配列の要素を昇順に並び替えて、全て出力してください。
入力される値
なし1, 3, 5, 6, 3, 2, 5, 23, 2
を要素に持つ配列をプログラムで定義し、使用すること。期待する出力
昇順に並び替えて、1要素ごとに改行して出力してください。
自分の解答
ary = [1, 3, 5, 6, 3, 2, 5, 23, 2] puts ary.sort