scalaでテーブル出力

リストから表を生成する - kmizuの日記より

scala-user MLに投稿されていた問題で、

入力: 1, 2, 3, 4, 5, 6, 7 のようなリスト
出力:

<table>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
  <tr>
    <td>7</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table> 

となるようなプログラムを作成せよというもの(出力はNodeSeqなので出力を整形するのは不要)。

こんな問題が出ていたので、練習がてら作ってみたお。

  def table(n: Int, list: List[Int]): NodeSeq = {
    def tr(l: List[Int]): NodeSeq = l match {
      case Nil => Nil
      case _ =>
        val (c,r) = l.splitAt(n)
        <tr>{c.map(e => <td>{e}</td>)++
               {range(c.length,n).map(_ => <td>&amp;nbsp;</td>)}}</tr> ++ tr(r)
    }
    <table>{tr(list)}</table>
  }
  println(table(3,List(1,2,3,4,5,6,7)))

Scalaはまだまだ知らんことが沢山あるので、もっと良いやり方があると思うけど。