about summary refs log tree commit diff
path: root/day13.rb
diff options
context:
space:
mode:
Diffstat (limited to 'day13.rb')
-rw-r--r--day13.rb137
1 files changed, 137 insertions, 0 deletions
diff --git a/day13.rb b/day13.rb
new file mode 100644
index 0000000..9b2003c
--- /dev/null
+++ b/day13.rb
@@ -0,0 +1,137 @@
+maze = File.readlines("day13")
+
+xmaze = <<'EOF'.lines.to_a
+/->-\        
+|   |  /----\
+| /-+--+-\  |
+| | |  | v  |
+\-+-/  \-+--/
+  \------/   
+EOF
+
+cars = []
+
+maze.each_with_index { |row, i|
+  row.chars.each_with_index { |col, j|
+    case col
+    when "^"; cars << [i,j,:n,:l]; row[j] = "|"
+    when ">"; cars << [i,j,:e,:l]; row[j] = "-"
+    when "v"; cars << [i,j,:s,:l]; row[j] = "|"
+    when "<"; cars << [i,j,:w,:l]; row[j] = "-"
+    end
+  }
+}
+
+
+cars = [
+  [65, 26, :s, :r],
+  [105, 39, :n, :l],
+  [140, 85, :e, :r]
+]
+
+puts maze
+
+crashed = []
+
+loop {
+  cars.sort! #_by! { |(i,j,d,s)| [j,i] }
+
+  p cars.size
+  p cars
+
+  m = maze.map {|l|l.dup}
+  cars.each { |(i,j,d,s)|
+    m[i][j] = case d
+              when :e; ">"
+              when :n; "^"
+              when :s; "v"
+              when :w; "<"
+              end
+  }
+#  puts m
+
+  if cars.size == 1
+    p cars
+    break
+  end
+
+  cars.each_with_index { |(i,j,d,s),n|
+    p [maze[i][j],d]
+    case [maze[i][j],d]
+    when ["-", :e]
+      cars[n][1] += 1
+    when ["-", :w]
+      cars[n][1] -= 1
+    when ["|", :s]
+      cars[n][0] += 1
+    when ["|", :n]
+      cars[n][0] -= 1
+    when ["+", :s]
+      case s
+      when :l; cars[n][1] +=1; cars[n][2] = :e; cars[n][3] = :s
+      when :s; cars[n][0] +=1; cars[n][3] = :r
+      when :r; cars[n][1] -=1; cars[n][2] = :w; cars[n][3] = :l
+      end
+    when ["+", :n]
+      case s
+      when :l; cars[n][1] -=1; cars[n][2] = :w; cars[n][3] = :s
+      when :s; cars[n][0] -=1; cars[n][3] = :r
+      when :r; cars[n][1] +=1; cars[n][2] = :e; cars[n][3] = :l
+      end
+    when ["+", :e]
+      case s
+      when :l; cars[n][0] -=1; cars[n][2] = :n; cars[n][3] = :s
+      when :s; cars[n][1] +=1; cars[n][3] = :r
+      when :r; cars[n][0] +=1; cars[n][2] = :s; cars[n][3] = :l
+      end
+    when ["+", :w]
+      case s
+      when :l; cars[n][0] +=1; cars[n][2] = :s; cars[n][3] = :s
+      when :s; cars[n][1] -=1; cars[n][3] = :r
+      when :r; cars[n][0] -=1; cars[n][2] = :n; cars[n][3] = :l
+      end
+    when ["\\", :e]
+      cars[n][2] = :s
+      cars[n][0] += 1
+    when ["/", :e]
+      cars[n][2] = :n
+      cars[n][0] -= 1
+    when ["\\", :n]
+      cars[n][2] = :w
+      cars[n][1] -= 1
+    when ["/", :n]
+      cars[n][2] = :e
+      cars[n][1] += 1
+    when ["\\", :s]
+      cars[n][2] = :e
+      cars[n][1] += 1
+    when ["/", :s]
+      cars[n][2] = :w
+      cars[n][1] -= 1
+    when ["/", :w]
+      cars[n][2] = :s
+      cars[n][0] += 1
+    when ["\\", :w]
+      cars[n][2] = :n
+      cars[n][0] -= 1
+    else
+      p [:miss, maze[i][j], d]
+    end
+
+    if cars.each.with_index.any? { |(i2,j2,_,_,m)| i == i2 && j == j2 && n != m }
+      if crashed.empty?
+        p [:crash, j, i]
+      end
+      crashed << true
+      cars.delete_at n
+      cars.delete_if { |(i2,j2,_,_,m)| i == i2 && j == j2 }
+    end
+
+  }
+}
+
+p cars
+
+# 32,8 ok
+# 38,38
+