Snippets

orbitzN Hanoi

Created by orbitzN
let rec solve = function
  | (l::ls, [], []) as t -> t::move_next_right (ls, [l], [])

  | ([], m::ms, r::rs) as t when r < m -> t::move_next_right ([r], m::ms, rs)
  | ([], m::ms, r::rs) as t when m < r -> t::move_next_right ([], ms, m::r::rs)

  | (l::ls, [], r::rs) as t when l < r -> t::move_next_right (ls, [l], r::rs)
  | (l::ls, [], r::rs) as t when r < l -> t::move_next_right (r::l::ls, [], rs)

  | (l::ls, m::ms, []) as t when l < m -> t::move_next_right (ls, l::m::ms, [])
  | (l::ls, m::ms, []) as t when m < l -> t::move_next_right (l::ls, ms, [m])

  | (l::ls, m::ms, r::rs) as t when l < m && l < r -> t::move_next_right (ls, l::m::ms, r::rs)
  | (l::ls, m::ms, r::rs) as t when m < r && m < l -> t::move_next_right (l::ls, ms, m::r::rs)
  | (l::ls, m::ms, r::rs) as t when r < l && r < m -> t::move_next_right (r::l::ls, m::ms, rs)

  | t -> [t]
and move_next_right = function
  | (l::ls, m::ms, []) as t when l > m -> t::solve (ls, m::ms, [l])
  | (l::ls, m::ms, []) as t when m > l -> t::solve (l::ls, ms, [m])

  | (l::ls, [], r::rs) as t when l > r -> t::solve (ls, [l], r::rs)
  | (l::ls, [], r::rs) as t when r > l -> t::solve (l::ls, [r], rs)

  | ([], m::ms, r::rs) as t when m > r -> t::solve ([m], ms, r::rs)
  | ([], m::ms, r::rs) as t when r > m -> t::solve ([r], m::ms, rs)

  | (l::ls, m::ms, r::rs) as t when l > m && l < r -> t::solve (ls, m::ms, l::r::rs)
  | (l::ls, m::ms, r::rs) as t when l > r && l < m -> t::solve (ls, l::m::ms, r::rs)
  | (l::ls, m::ms, r::rs) as t when m > r && m < l -> t::solve (m::l::ls, ms, r::rs)
  | (l::ls, m::ms, r::rs) as t when m > l && m < r -> t::solve (l::ls, ms, m::r::rs)
  | (l::ls, m::ms, r::rs) as t when r > l && r < m -> t::solve (l::ls, r::m::ms, rs)
  | (l::ls, m::ms, r::rs) as t when r > m && r < l -> t::solve (r::l::ls, m::ms, rs)

  | t -> [t]

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.