Ruby 改行を削除するスクリプト

AtCoder の問題文をコピー & ペーストすると、下のようになる。

整数 
a
,
b
,
c
,
d
 が与えられます。 
a
≤
x
≤
b
,
c
≤
y
≤
d
 を満たす整数 
x
,
y
 について、
x
×
y
 の最大値はいくつですか。

B - Product Max

改行をいちいち削除するのが面倒なので、スクリプトを書いてみることにした。

delete_n.rb

#!/usr/bin/env ruby

puts "========================="
p ARGV

まずは、入力がどうなっているのかを確認。

$ ./delete_n.rb '整数 
> a
> ,
> b
> ,
> c
> ,
> d
>  が与えられます。 
> (中略)
> y
>  について、
> x
> ×
> y
>  の最大値はいくつですか。'
=========================
["整数 \na\n,\nb\n,\nc\n,\nd\n が与えられます。 \na\n\nx\n\nb\n,\nc\n\ny\n\nd\n を満たす整数 \nx\n,\ny\n について、\nx\n×\ny\n の最大値はいくつですか。"]

改行文字 \n が入っていることがわかったので、gsub で置き換えていく。

#!/usr/bin/env ruby

# frozen_string_literal: true

def delete_n(text)
  puts "========================="
  puts text.join.gsub("\n", " ")
end

delete_n(ARGV)
$ ./delete_n.rb '整数 
> a
> ,
> b
> (中略)
>  の最大値はいくつですか。'
=========================
整数  a , b , c , d  が与えられます。  a ≤ x ≤ b , c ≤ y ≤ d  を満たす整数  x , y  について、 x × y  の最大値はいくつですか。

スペースが2個連続しているところと、コンマ,の前にスペースが入っているところが気になる。

def delete_n(text)
  puts "========================="
  puts text.join.gsub("\n", " ").gsub("  ", " ").gsub(" ,", ",")
end

単純にこうやれば消すことはできるけど、DRY じゃない…。

gsub正規表現が使えるから、なんかいい方法ありそう。

def delete_n(text)
  p text
  puts "========================="
  puts text.join.gsub(/ ?\n ?/, " ").gsub(" ,", ",")
end

? は、直前の文字が 1 文字またはなしを表す。/ ?\n ?/ で、\n と前後の 1 文字(またはなし)のスペースを、1 文字のスペース " " に置き換えられた。コンマはこれ以上思いつかなかった。

String#gsub (Ruby 2.7.0 リファレンスマニュアル)