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要素ずつブロックにて繰り返します。