Ruby paizaレベルアップ問題集(文字と整数の組のソート2-2)

paizaラーニング(初心者〜中級者向けのプログラミング学習サービス)の問題集をやってみる。

paiza.jp

共通ルール

入力

  • 入力値最終行の末尾に改行が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_byitselfを渡せるの知らなかった。

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