require 'socket' @socket =IO.popen('nc pwn2.ddtek.biz 11511', 'w+') @socket.print('MAZE4J002PLAY') @socket.gets @socket.gets UP = 'n' DOWN = 's' LEFT = 'w' RIGHT = 'e' WALL = '#' START = 's' FINISH = 'f' def mazer(socket) maze = [] loop do begin mazeline = @socket.gets.chomp $stderr.puts mazeline maze << mazeline break if mazeline =~ /^\#+$/ && maze.length > 1 # fence rescue NoMethodError => e #$stderr.puts "FAIL #{e}" @socket.close break end end #mazestr = socket.read #maze = mazestr.split("\n") #puts maze || "FAIL?" i = 0 maze.map! {|l| l.split('') } @a = 0 @b = 0 @s = [] @g = [] @dirs = [] solve(maze) puts @dirs.join('') @socket.puts @dirs.join('') @socket.flush sleep 1 end def solve(maze) x = maze[0].length y = maze.length*x gg = 0 ss = nil y.times do |i| @s[i] = -1; @g[i] = -1 ch = maze[i/x][i%x] @s[i] = -2 if ch == WALL ss = i if ch == START gg = i if ch == FINISH end return unless ss @a = gg @b = gg while @a != ss do add(@a,1) add(@a,-1) add(@a,x) add(@a,-x) @a=@s[@a] end while @a !=gg do @dirs << sv(@g[@a]) @a+=@g[@a] end puts "exhausted" end def add(p,o) if @s[p+o] == -1 then @s[@b] = p+o @b=p+o @g[p+o]=-o end end def sv(o) o > 0 ? o==1 ? RIGHT : DOWN : o==-1 ? LEFT : UP end puts 'Begin' 200.times do |i| puts "NEXT: #{i}" mazer(@socket) end