LoginSignup
1
1

More than 3 years have passed since last update.

Ruby で解く AtCoder Judge System Update Test Contest 202004 B

Last updated at Posted at 2020-04-15

はじめに

いつもお世話になっております AtCoder で、新しいジャッジシステムの負荷テストを兼ねたコンテストが行われました。

こちらの記事 にて既に Perl で解いたのですが、勉強として Ruby でも解いてみたいと思います。

今回のB問題
AtCoder Judge System Update Test Contest 202004 B - Picking Balls

2つの配列

赤ボール・青ボールそれぞれの配列を準備します。

array.rb
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

配列のリファレンス

配列のリファレンスを使用した解法

ref.rb
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 を行う必要があります。

convert.rb
  p[i] = [x[0].to_i, x[1]]

ハッシュのリファレンス

ハッシュのリファレンスを使用した解法

hash.rb
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

ハッシュのリファレンスを使用することにより、解読性が上がります。

diff.rb
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 のハッシュのリファレンス

hash.pl
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

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1