zaach (owner)

Revisions

gist: 138518 Download_button fork
public
Public Clone URL: git://gist.github.com/138518.git
mazer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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