yuuki blog

プログラミング をアプトプットしています。

Ruby 文章のサイズを変更する

My#name#
is#haten
a#I#like
#program
ming#ver
y#much.#

を下記のように変更する方法です。

My#nam
e#is#h
atena#
I#like
#progr
amming
#very#
much.#
n,m = gets.chomp.split.map(&:to_i)
str = n.times.map{gets.chomp.split.map(&:to_s)}
s = str.flatten!.join
v = s.chars.each_slice(m).map(&:join)
puts v

まずn,m = gets.chomp.split.map(&:to_i)で、一列に複数の数値が入力値として与えられている場合で、それらを別々に取得します。

  • chomp メソッドは文字列末尾の改行文字を削除してくれるメソッドです。これがないと半角スペースによって先頭1文字しか取得できなくなります。
  • split メソッドは文字列を分割してくれるメソッドです。
  • map(&:to_i) は繰り返しメソッドで、(&:to_i) とすることで各数値をinteger型で取得できます。
  • ここではnは変更前に何行あるか、mは変更後に1行の中に、何文字あるかを記述します。

str = n.times.map{gets.chomp.split.map(&:to_s)}で、2次元の入力を行います。

  • map メソッドで {} の中をn回繰り返すという処理になります。
  • {} 内の処理は「一列で数値が複数与えられる場合」と同じものになります
  • 今の段階では[["My#name#"], ["is#haten"], ["a#I#like"], ["#program"], ["ming#ver"], ["y#much.#"]]と2次元配列になっています

s = str.flatten!.joinで2次元配列を文字列に変換しています。

*flatten!で2次元配列を1次元配列に変換しています。 * joinで1次元配列を文字列に変換しています。 "My#name#is#hatena#I#like#programming#very#much.#"

v = s.chars.each_slice(m).map(&:join)で、mの文字数ごとに1次元配列に変換します。

  • chars.で文字列の各文字を文字列の配列で返します。(.each_char)と同じ
  • each_sliceでは、m要素ずつブロックにて繰り返します。