Problem:
ぐるぐる模様

「ぐるぐる模様」を表示するプログラムを作成することにしました。「ぐるぐる模様」は以下のようなものとします。

1 辺の長さが n の場合、n 行 n 列の文字列として表示する。

左下隅を基点とし，時計回りに回転する渦状の模様とする。

線のある部分は #（半角シャープ）、空白部分は " "（半角空白）で表現する。

線と線の間は空白を置く。

整数 n を入力とし，1 辺の長さが n の「ぐるぐる模様」を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

d
n1
n2
:
nd

１行目にデータセットの数 d (d ≤ 20)、続く d 行に i 個目のぐるぐる模様の辺の長さ ni (1 ≤ ni ≤ 100) がそれぞれ１行に与えられます。

Output

データセットごとに、ぐるぐる模様を出力してください。データセットの間に１行の空行を入れてください。

Sample Input

2
5
6

Output for the Sample Input

#####
# #
# # #
# # #
# ###

######
# #
# ## #
# # #
# # #
# ####

Solution in Scala (judge verdict: Wrong Answer)


object Main extends App {
  import scala.io.StdIn.{readLine}
  for (_ ← 0 until readLine().toInt){
    val field = FillSpiral(readLine().toInt)
    print((0 until field.size).map{y ⇒ (0 until field.size).map{x ⇒ field(x, y)}.mkString}.mkString("\n"))
  }
  case class Coordinate(x:Int, y:Int){
    def +(other:Coordinate):Coordinate = Coordinate(x + other.x, y + other.y)
  }
  class Field(val size:Int){
    private val mArray = Array.tabulate(size){_ ⇒ Array.tabulate(size){_ ⇒ ' '}}
    def apply(x:Int, y:Int):Char = mArray(x)(y)
    def apply(coordinate: Coordinate):Char = mArray(coordinate.x)(coordinate.y)
    def update(x:Int, y:Int, value:Char):Unit = mArray(x)(y) = value
    def update(coordinate: Coordinate, value:Char):Unit = mArray(coordinate.x)(coordinate.y) = value
  }
  object Field{
    def apply(size:Int):Field = new Field(size)
  }
  def FillSpiral(size:Int):Field = {
    val field = Field(size)
    var leftTop = Coordinate(0, 0)
    var rightBottom = Coordinate(size - 1, size - 1)
    while (leftTop.x <= rightBottom.x){
      for (x ← leftTop.x to rightBottom.x){
        field(x, leftTop.y) = '#'
      }
      for (y ← leftTop.y to rightBottom.y){
        field(leftTop.x, y) = '#'
      }
      if (leftTop.y + 1 < rightBottom.y) for (x ← (leftTop.x + 2) to rightBottom.x){
        field(x, rightBottom.y) = '#'
      }
      if (leftTop.x + 1 < rightBottom.x) for (y ← leftTop.y to rightBottom.y){
        field(rightBottom.x, y) = '#'
      }
      if (leftTop.y + 3 <= rightBottom.y && leftTop.x + 4 <= rightBottom.x) field(leftTop.x + 2, rightBottom.y - 1) = '#'
      leftTop = Coordinate(2, 2) + leftTop
      rightBottom = Coordinate(-2, -2) + rightBottom
    }
    field
  }
}