package main

	import (
		"fmt"
		"math"
	)

	func main() {
		Spiralizer(1)
		Spiralizer(2)
		Spiralizer(3)
		Spiralizer(4)
		Spiralizer(5)
		Spiralizer(6)
		Spiralizer(7)
		Spiralizer(8)
		Spiralizer(9)
		Spiralizer(10)
		Spiralizer(11)
		Spiralizer(12)
	}

	func Spiralizer(n int) {
		if n == 1 {
			fmt.Printf("1\n\n")
			return
		}

		// Create grid
		grid := make([][]int, n)

		for i := range grid {
			grid[i] = make([]int, n)
		}

		// Middle of the spiral
		middle := int(math.Ceil(float64(n-1) / 2))

		for i := range grid {
			for j := range grid {
				// For the first row, just increment each element
				if i == 0 {
					grid[i][j] = j + 1
				}

				// Populate a diagonal
				if j == i-1 && i <= middle {
					grid[i][j] = (n - i) * (4 * i)
				}

				// Populate the left column
				if i > 1 && j == 0 {
					grid[i][j] = grid[i-1][j] - 1
				}

				// Populate the bottom row
				if i == n-1 && j > 0 {
					grid[i][j] = grid[i][j-1] - 1
				}

				// Populate the right column
				if i > 0 && j == n-1 {
					grid[i][j] = grid[i-1][j] + 1
				}

				// Populate the rest of the easy rows
				if j >= i && j < n-i && j > 0 {
					grid[i][j] = grid[i][j-1] + 1
				}

				// Populate columns in the top right quadrant
				if grid[i][j] == 0 &&
					i <= n-(n-j) &&
					j > middle {
					grid[i][j] = grid[i-1][j] + 1
				}

				// Populate empty columns in the top left quadrant
				if grid[i][j] == 0 &&
					j < middle &&
					i < n-j {
					grid[i][j] = grid[i-1][j] - 1
				}

				// Populate remaining rows
				if grid[i][j] == 0 {
					grid[i][j] = grid[i][j-1] - 1
				}
			}
		}

		PrettyPrint(grid)
	}

	func PrettyPrint(a [][]int) {
		size := len(a)
		maxspaces := int(math.Log10(float64(size * size)))

		for i := range a {
			for j := range a {
				for k := 0; k < maxspaces-int(math.Log10(float64(a[i][j]))); k++ {
					fmt.Printf(" ")
				}
				fmt.Printf("%d ", a[i][j])
			}
			fmt.Printf("\n")
		}
		fmt.Printf("\n")
	}