はじめに
いつもお世話になっております AtCoder で、新しいジャッジシステムの負荷テストを兼ねたコンテストが行われました。
こちらの記事 にて既に Perl で解いたのですが、勉強として Ruby でも解いてみたいと思います。
今回のB問題
AtCoder Judge System Update Test Contest 202004 B - Picking Balls
2つの配列
赤ボール・青ボールそれぞれの配列を準備します。
n = gets.to_i
r = []
b = []
n.times do
x = gets.split.to_a
if x[1] == 'R'
r.push(x[0])
else
b.push(x[0])
end
end
r.sort! {|a, b| a.to_i <=> b.to_i}
puts r
b.sort! {|a, b| a.to_i <=> b.to_i}
puts b
配列のリファレンス
配列のリファレンスを使用した解法
n = gets.to_i
p = []
n.times do
x = gets.split.to_a
p.push([x[0].to_i, x[1]])
end
p.sort! {|a, b| (b[1] <=> a[1]).nonzero? || (a[0] <=> b[0])}
p.each do |num, color|
puts num
end
Perl では、文字のソートは cmp 、数値のソートは <=> を用います。
Ruby では、どちらも <=> でソートを行いますが、数値をソートする場合、予め整数型への変換 to_i を行う必要があります。
p[i] = [x[0].to_i, x[1]]
ハッシュのリファレンス
ハッシュのリファレンスを使用した解法
n = gets.to_i
p = {}
0.upto(n - 1) do |i|
x = gets.split.to_a
p[i] = {num: x[0].to_i, color: x[1]}
end
q = p.sort {|a, b| (b[1][:color] <=> a[1][:color]).nonzero? || (a[1][:num] <=> b[1][:num])}
q.each do |q|
puts q[1][:num]
end
ハッシュのリファレンスを使用することにより、解読性が上がります。
p.sort! {|a, b| (b[1] <=> a[1]).nonzero? || (a[0] <=> b[0])}
p.sort {|a, b| (b[1][:color] <=> a[1][:color]).nonzero? || (a[1][:num] <=> b[1][:num])}
ハッシュの破壊的ソートは無い様子。
Perl のハッシュのリファレンス
use v5.26; # strict say state biwise
use warnings;
chomp (my $n = <STDIN>);
my @p;
for my $i (0..$n-1) {
chomp (my @b = split / /, <STDIN>);
push @p, {num => $b[0], color => $b[1]};
}
my @q;
@q = sort {$b->{color} cmp $a->{color} || $a->{num} <=> $b->{num}} @p;
say $_->{num} for @q;
ハッシュの受け取り先を配列としています。
まとめ
- B - Picking Ballsを Ruby で解いた
- Ruby に詳しくなった
- Perl に詳しくなった
参照したサイト
instance method Array#sort
instance method Hash#sort
Perlのsortの基本的なやつ
Perl List::Util::pairs で解く AtCoder Judge System Update Test Contest 202004 B