横書きを縦書きに変換して出力。[Ruby][プログラミング]

 プログラミングの演習をやっていると、横書きで入力された文字列データを縦書きで出力(もしくはその逆)するような課題が頻繁に登場します。

 今回は、横書きを縦書きにして出力するコードについて扱います。

 まずは、入力された1行の文字列データを縦書きで出力するコードです。Rubyで書くと次のようになります。データは、Paizaの標準入力で行います。

#横書きを縦書きに変換(1行)
str = gets.chomp.gsub("ー","|")
for i in 0..str.length-1
    puts str[i,1]
end

 入力された文字列データが1行であれば、for文を使って1文字づつ取り出して、改行出力を繰り返せばOKです。なお、入力されたデータを読み込むところで、データ内の長音記号”ー”を縦棒”|”に変換しています。

 例えば、「テストデータ」が入力された場合は、

テ
ス
ト
デ
|
タ

と出力欄に表示されます。 コードの動作確認は、paiza.ioでお願いします。

 次は入力されたデータが複数行の場合です。複数行の場合は、難易度が大きく上がります。私は次のようなコードで、複数行の横書き文字列データを縦書きに変換して出力しました。

#横書きを縦書きに変換(複数行)
#文字列の読み込みと文字列の最大の長さを求める。
box_ln = Array.new
str = Array.new
i = 0

while line = gets do
    str[i] = line.chomp.gsub("ー","|")
    box_ln.push(str[i].length)
    i += 1
end

line_count = i
max_ln = box_ln.max

#スペースを追加して、文字列の長さを揃える。
shortage = 0
for i in 0..line_count-1
    shortage = max_ln - str[i].length
    if shortage > 0
        shortage.times do
            str[i] += " "
        end
    end
end

#1文字づつ読み込んで配列に格納し、逆順にしてから文字列として表示。
cov_str = Array.new
for j in 0..max_ln-1
    for i in 0..line_count-1
       cov_str.push(str[i][j,1])
    end
    puts cov_str.reverse.join(' ')
    cov_str = Array.new
end

 入力された文字列データが複数行になると、難易度が大きく上がってしまいます。

 最初に、複数行の文字列を読み込み、それぞれを配列(str)に入れます。ここで長音記号の変換とともに、最も文字数が多い行の文字数を求めて変数(max_ln)に入れます。
 
 次に、最大文字数に足りない行について、不足分だけ全角スペースを追加します。これによって文字列の長さを揃えます。全角スペースを入れて文字列の長さを揃えないと、出力の際に表示がずれてしまいます。

 文字列の長さを揃えたら、文字列のそれぞれの行のj番目の文字を配列(arr_str)に入れ、reverseメソッドで逆順にしてからjoinで文字列に変換し、それを改行表示します。区切りは半角スペースで行ってます。これを最大文字数の回数分繰り返すと、複数行の文字列データを縦書きで出力できます。

 ここで、松尾芭蕉の有名な俳句

ふるいけや
かわずとびこむ
みずのおと

を入力すると、

み か ふ
ず わ る
の ず い
お と け
と び や
  こ  
  む  

と、入力された3行がキレイに縦書きで出力されました。

 これで、文字列の横書き→縦書きについては、とりあえずの対応はできそうです。

にほんブログ村 ゲームブログへ

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする