parent
850d181bdc
commit
6fa37294de
@ -0,0 +1,103 @@
|
||||
# typed: ignore
|
||||
|
||||
require "stringio"
|
||||
|
||||
require_relative "computer"
|
||||
|
||||
class Game
|
||||
def initialize
|
||||
@output = Hash.new(0)
|
||||
@min_x, @max_x, @min_y, @max_y = 0, 0, 0, 0
|
||||
end
|
||||
|
||||
def []=(x, y, value)
|
||||
@output[[x, y]] = value
|
||||
|
||||
@min_x = [@min_x, x].min
|
||||
@max_x = [@max_x, x].max
|
||||
@min_y = [@min_y, y].min
|
||||
@max_y = [@max_y, y].max
|
||||
end
|
||||
|
||||
def ball_pos
|
||||
@output.key(4)
|
||||
end
|
||||
|
||||
def paddle_pos
|
||||
@output.key(3)
|
||||
end
|
||||
|
||||
def score
|
||||
@output[[-1, 0]]
|
||||
end
|
||||
|
||||
def to_s
|
||||
min_x = [0, @min_x].max
|
||||
|
||||
screen = (@min_y..@max_y).map {|y|
|
||||
(min_x..@max_x).map {|x|
|
||||
tile(@output[[x, y]])
|
||||
}.join
|
||||
}.join("\n")
|
||||
|
||||
score = @output[[-1, 0]] || 0
|
||||
|
||||
"#{screen}\n#{score}"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def tile(id)
|
||||
case id
|
||||
when 0 then " "
|
||||
when 1 then ?█
|
||||
when 2 then ?▒
|
||||
when 3 then ?▄
|
||||
when 4 then ?@
|
||||
else fail "unexpected tile id: #{id}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class FollowBall
|
||||
def initialize(game)
|
||||
@game = game
|
||||
@last_ball = nil
|
||||
end
|
||||
|
||||
def gets
|
||||
ball, paddle = nil, nil
|
||||
until [ball, paddle].none?(&:nil?) && ball != @last_ball
|
||||
ball = @game.ball_pos
|
||||
paddle = @game.paddle_pos
|
||||
end
|
||||
@last_ball = ball
|
||||
|
||||
# puts @game
|
||||
|
||||
# STDIN.gets
|
||||
ball[0] <=> paddle[0]
|
||||
end
|
||||
end
|
||||
|
||||
game = Game.new
|
||||
follow_ball = FollowBall.new(game)
|
||||
output, output_writer = IO.pipe
|
||||
|
||||
Thread.new do
|
||||
loop do
|
||||
x, y, tile_id = 3.times.map { output.gets.to_i }
|
||||
game[x, y] = tile_id
|
||||
end
|
||||
end
|
||||
|
||||
Thread.new do
|
||||
program = File.read("day_13.txt").split(?,).map(&:to_i)
|
||||
program[0] = 2
|
||||
|
||||
Computer.new(program).run(follow_ball, output_writer)
|
||||
|
||||
sleep 1
|
||||
|
||||
puts game.score
|
||||
end.join
|
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue