Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- def display
- STICKS.each do |stick|
- print "|"
- stick.each do |ring|
- print ring.to_s + " "
- end
- puts
- end
- end
- def valid_move?(from, to)
- range = 0..(STICKS.size-1)
- return [false, "no-op"] if from == to
- return [false, "from should be 0..2"] unless range.cover?(from)
- return [false, "to should be 0..2"] unless range.cover?(to)
- return [false, "no ring on stick #{from}"] if STICKS[from].size == 0
- ring = STICKS[from][-1]
- # Avoid a nil check
- return true if STICKS[to].empty?
- return [false, "invalid move"] if ring > STICKS[to][-1]
- true
- end
- print "Number of sticks: "
- STICKS = gets.to_i.times.map { [] }
- puts
- print "Height of tower: "
- STICKS[0] = (1..(gets.to_i)).to_a.reverse
- puts
- loop do
- display
- if STICKS[0].empty? && STICKS[1].empty?
- puts "you win!"
- exit 0
- end
- print "move: "
- from, to = gets.split(" ", 2)
- from = from.to_i
- to = to.to_i
- puts "Move rightmost ring from stick #{from.to_i} to stick #{to.to_i}"
- valid, error = valid_move?(from, to)
- if !valid
- puts "Invalid move! #{error}"
- next
- end
- STICKS[to].push(STICKS[from].pop)
- end
Add Comment
Please, Sign In to add comment