LoginSignup
1
1

More than 3 years have passed since last update.

Perl と Ruby で解く AtCoder ABC146 B - ROT N

Last updated at Posted at 2020-04-03

はじめに

Pocket詳解 Perl/CGI辞典をパラパラっと眺めておりましたら、pack/unpack 関数が目に留まりましたので、投稿いたします。

次の文字を取得する場合

'A' の次の文字 'B' を取得する場合、
C言語でしたら、'A' + 1 より 'B' を得られます。
しかし Perl の場合、'A' + 1 の結果は、1 となってしまいます。

pack/unpack 関数

よって、次の文字を取得する場合、一旦バイナリ値に変換し足し算を行ってから、char 値に逆変換することにより、期待する操作が行えます。

pack char値をバイナリ値に変換
unpack バイナリ値をchar値に変換

Perl Ruby Python
pack/chr pack/chr chr
unpack/ord unpack/ord ord
unpack.pl
unpack("C*", 'A'); # => 65
pack("C*", 66);    # => B
unpack.rb
"A".ord            # => 65
66.chr             # => B

Pythonpack/unpack があるかどうかは不明 適当

B - ROT N

AtCoder ABC 146 B - ROT N

perl.pl
use v5.18;
use warnings;

chomp (my $n = <STDIN>);
chomp (my $s = <STDIN>);
my @s = split '', $s;
map {$s[$_] = chr((ord($s[$_]) + $n) % ord("A") % 26 + ord("A"))} (0..@s-1);
say join('', @s);
ruby.rb
n = gets.chomp.to_i
s = gets.chomp.split('')
(0..s.size-1).each do |i|
  s[i] = ((s[i].ord + n) % "A".ord % 26 + "A".ord).chr
end
puts s.join()

むむっ、ruby のスッキリ感は凄いですね。

まとめ

  • Perl の関数 pack/unpack を覚えた
  • Ruby のメソッド chr/ord も覚えた

参照したサイト
pack テンプレート文字列
instance method String#ord
ABC146 感想

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