Think Twice
IT技術メモ | プログラミングお題のメモ
Created: 2023-08-03 / Updated: 2023-08-04

[お題] 縦書き俳句ビルダー


みなさまもお好きな言語で解いてみてくださいね。

目次


お題

Copy
3つの文字列入力に対して、縦書きの俳句文字列にして出力してください。

入力
Copy
["アプリログ", "よく見てみると", "時間だけ"]
出力
Copy
時 よ ア
間 く プ
だ 見 リ
け て ロ
  み グ
  る
  と

参考:(𝕏) fumokmm

解いてみた

Groovyで解いてみた

ワンライナーでできた。

haiku.groovy
Copy
args*.padRight(args*.size().max(), ' ')*.toList().transpose()*.reverse()*.join(' ').each(this.&println)

出力結果

解説

まず、引数で受け取った文字列リストの文字列数を全角スペースで揃えます。その際、引数で受け取った文字列リストの最大文字列に合わせます。

Copy
args*.padRight(args*.size().max(), ' ')*.toList().transpose()*.reverse()*.join(' ').each(this.&println)

次に、文字列を縦横入れ替え(transpose)したいため、1文字ずつのリストに変換してから、transposeします。
縦横入れ替えられた文字列配列は、左から右へ並ぶようになっているため、逆転(reverse)させてから、全角スペースでくっつけます(join)。

Copy
args*.padRight(args*.size().max(), ' ')*.toList().transpose()*.reverse()*.join(' ').each(this.&println)

最後に、各行を出力させていきます。
this.&printlnはメソッドクロージャとしてprintlnを取り出す構文で、eachに渡すことで各行が出力されます。

Copy
args*.padRight(args*.size().max(), ' ')*.toList().transpose()*.reverse()*.join(' ').each(this.&println)

関連投稿:𝕏 fumokmm