LoginSignup
1
1

More than 3 years have passed since last update.

Ruby と Perl と Java で解く AtCoder dwangoプログラミングコンテスト B

Last updated at Posted at 2020-04-20

はじめに

AtCoder Problems の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

今回のお題

AtCoder dwangoプログラミングコンテスト B - ニコニコ文字列
Difficulty: 832

今回のテーマは、reduce による集計

Ruby

例えば文字列1251251252525について 25 -> aに変換し文字のカウントをし易くします。=> 1a1a1aaa
連続したaの個数は、(1, 1, 3) ですので、それぞれについて組合せ数を合計します。

bit.rb
s = gets.chomp

s.gsub!(/25/, 'a')
p = []
c = 0
0.upto(s.size - 1) do |i|
  if s[i] == 'a'
    c += 1
  elsif c > 0
    p.push(c)
    c = 0
  end
  p.push(c) if i == s.size - 1 && c > 0
end
sum = 0
0.upto(p.size - 1) do |i|
  sum += (1..p[i]).reduce{|a, b| a + b}
end
puts sum
reduce.rb
  sum += (1..p[i]).reduce{|a, b| a + b}
  sum += (1..p[i]).reduce(&:+)
  sum += (1..p[i]).inject(:+)
  sum += (1..p[i]).sum

reduce の部分は、inject でも、sum (ruby 2.4以降)でもいけます。
追記
コメントよりいただいた、reduce(&:+) を追加しました。

Perl

perl.pl
use v5.18; # strict say state
use List::Util qw/reduce/;

chomp (my $s = <STDIN>);
$s =~ s/25/a/g;
my $c = 0;
my @p;
for my $i (0..length($s)-1) {
  if (substr($s, $i, 1) eq 'a') {
    $c++;
  } elsif ($c > 0) {
    push @p, $c;
    $c = 0;
  }
  if ($i == length($s)-1 && $c > 0) {
    push @p, $c;
  }
}
my $sum = 0;
for my $i (0..$#p) {
  $sum += reduce {$a + $b} 1..$p[$i];
}
say $sum;
reduce.pl
use List::Util qw/reduce sum/;

  $sum += reduce {$a + $b} 1..$p[$i];
  $sum += sum(1..$p[$i]);

reduce の部分は、sum でもいけます。

Java

java.java
import java.util.*;
import java.util.stream.IntStream;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        sc.close();
        s = s.replace("25", "a");
        List<Integer> p = new ArrayList<>();
        int c = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.substring(i, i + 1).equals("a")) {
                c++;
            } else if (c > 0) {
                p.add(c);
                c = 0;
            }
            if (i == s.length() - 1 && c > 0) {
                p.add(c);
            }
        }
        int sum = 0;
        for (int i = 0; i < p.size(); i++) {
            sum += IntStream.rangeClosed(1, p.get(i)).reduce(0, (a, b) -> a + b);
        }
        System.out.println(sum);
    }
}
reduce.java
            sum += IntStream.rangeClosed(1, p.get(i)).reduce(0, (a, b) -> a + b);
            sum += IntStream.rangeClosed(1, p.get(i)).sum();

reduce の部分は、sum でもいけます。

Ruby Perl Java
コード長 284 Byte 411 Byte 847 Byte
実行時間 34 ms 28 ms 284 ms
メモリ 4092 KB 2816 KB 33228 KB

まとめ

  • dwangoプログラミングコンテスト B を解いた
  • Ruby に詳しくなった
  • Perl に詳しくなった
  • Java に詳しくなった
  • reduce に詳しくなった

参照したサイト
Rubyで配列の要素を合計するベストな方法

1
1
5

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