open System
open System.IO
type Direction = UP | DOWN | LEFT | RIGHT
let rec fillSpiral (spiral:int[,]) num square goal curX curY direction =
match num with
| x when num=goal+1 -> spiral
| _ ->
spiral.[curX,curY] <- num
let newDirection = match direction with
| UP -> match curY with
| a when curY=0 -> RIGHT
| b when spiral.[curX,(curY-1)] <> -1 -> RIGHT
| _ -> UP
| DOWN -> match curY with
| a when curY=square-1 -> LEFT
| b when spiral.[curX,(curY+1)] <> -1 -> LEFT
| _ -> DOWN
| LEFT -> match curX with
| a when curX=0 -> UP
| b when spiral.[curX-1,curY] <> -1 -> UP
| _ -> LEFT
| RIGHT -> match curX with
| a when curX=square-1 -> DOWN
| b when spiral.[curX+1,curY] <> -1 -> DOWN
| _ -> RIGHT
let nextX = match newDirection with
| LEFT -> curX-1
| RIGHT -> curX+1
| _ -> curX
let nextY = match newDirection with
| UP -> curY-1
| DOWN -> curY+1
| _ -> curY
fillSpiral spiral (num+1) square goal nextX nextY newDirection
let makeSpiral num =
let square = num*num
let matrix = Array2D.init num num (fun x y -> -1)
let spiral = fillSpiral matrix 1 num square 0 0 RIGHT
let alignment
= ((log (square
|> double))) |> int for y in [0..num-1] do
for x in [0..num-1] do
printf "%*d " alignment spiral.
[x
,y
] printfn ""
()
[<EntryPoint>]
let main argv =
makeSpiral 4
printfn ""
makeSpiral 5
0
b3BlbiBTeXN0ZW0Kb3BlbiBTeXN0ZW0uSU8KCnR5cGUgRGlyZWN0aW9uID0gVVAgfCBET1dOIHwgTEVGVCB8IFJJR0hUCgpsZXQgcmVjIGZpbGxTcGlyYWwgKHNwaXJhbDppbnRbLF0pIG51bSBzcXVhcmUgZ29hbCBjdXJYIGN1clkgZGlyZWN0aW9uID0KICAgIG1hdGNoIG51bSB3aXRoCiAgICB8IHggd2hlbiBudW09Z29hbCsxIC0+IHNwaXJhbAogICAgfCBfIC0+IAogICAgICAgICAgIHNwaXJhbC5bY3VyWCxjdXJZXSA8LSBudW0KICAgICAgICAgICBsZXQgbmV3RGlyZWN0aW9uID0gbWF0Y2ggZGlyZWN0aW9uIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVUCAtPiBtYXRjaCBjdXJZIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgd2hlbiBjdXJZPTAgLT4gUklHSFQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGIgd2hlbiBzcGlyYWwuW2N1clgsKGN1clktMSldIDw+IC0xIC0+IFJJR0hUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfIC0+IFVQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRE9XTiAtPiBtYXRjaCBjdXJZIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSB3aGVuIGN1clk9c3F1YXJlLTEgLT4gTEVGVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiIHdoZW4gc3BpcmFsLltjdXJYLChjdXJZKzEpXSA8PiAtMSAtPiBMRUZUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IF8gLT4gRE9XTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExFRlQgLT4gbWF0Y2ggY3VyWCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgd2hlbiBjdXJYPTAgLT4gVVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYiB3aGVuIHNwaXJhbC5bY3VyWC0xLGN1clldIDw+IC0xIC0+IFVQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IF8gLT4gTEVGVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJJR0hUIC0+IG1hdGNoIGN1clggd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSB3aGVuIGN1clg9c3F1YXJlLTEgLT4gRE9XTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYiB3aGVuIHNwaXJhbC5bY3VyWCsxLGN1clldIDw+IC0xIC0+IERPV04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IF8gLT4gUklHSFQKICAgICAgICAgICBsZXQgbmV4dFggPSBtYXRjaCBuZXdEaXJlY3Rpb24gd2l0aAogICAgICAgICAgICAgICAgICAgICAgIHwgTEVGVCAtPiBjdXJYLTEKICAgICAgICAgICAgICAgICAgICAgICB8IFJJR0hUIC0+IGN1clgrMQogICAgICAgICAgICAgICAgICAgICAgIHwgXyAtPiBjdXJYCiAgICAgICAgICAgbGV0IG5leHRZID0gbWF0Y2ggbmV3RGlyZWN0aW9uIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICB8IFVQIC0+IGN1clktMQogICAgICAgICAgICAgICAgICAgICAgIHwgRE9XTiAtPiBjdXJZKzEKICAgICAgICAgICAgICAgICAgICAgICB8IF8gLT4gY3VyWQogICAgICAgICAgIGZpbGxTcGlyYWwgc3BpcmFsIChudW0rMSkgc3F1YXJlIGdvYWwgbmV4dFggbmV4dFkgbmV3RGlyZWN0aW9uCgpsZXQgbWFrZVNwaXJhbCBudW0gPQogICAgbGV0IHNxdWFyZSA9IG51bSpudW0KICAgIGxldCBtYXRyaXggPSBBcnJheTJELmluaXQgbnVtIG51bSAoZnVuIHggeSAtPiAtMSkKICAgIGxldCBzcGlyYWwgPSBmaWxsU3BpcmFsIG1hdHJpeCAxIG51bSBzcXVhcmUgMCAwIFJJR0hUCiAgICBsZXQgYWxpZ25tZW50ID0gKChsb2cgKHNxdWFyZSB8PiBkb3VibGUpKSkgfD4gaW50CiAgICBmb3IgeSBpbiBbMC4ubnVtLTFdIGRvCiAgICAgICAgZm9yIHggaW4gWzAuLm51bS0xXSBkbwogICAgICAgICAgICBwcmludGYgIiUqZCAiIGFsaWdubWVudCBzcGlyYWwuW3gseV0KICAgICAgICBwcmludGZuICIiCiAgICAoKQoKWzxFbnRyeVBvaW50Pl0KbGV0IG1haW4gYXJndiA9IAogICAgbWFrZVNwaXJhbCA0CiAgICBwcmludGZuICIiCiAgICBtYWtlU3BpcmFsIDUKICAgIDA=