2019-12-13 19:29:22 +01:00
use grid ::* ;
2019-12-13 08:24:01 +01:00
use intcode ::* ;
2019-12-13 19:29:22 +01:00
use std ::collections ::HashMap ;
mod tile ;
use std ::cmp ::Ordering ;
use tile ::Tile ;
fn int ( ord : Ordering ) -> i64 {
match ord {
Ordering ::Less = > - 1 ,
Ordering ::Equal = > 0 ,
Ordering ::Greater = > 1 ,
}
}
2019-12-13 08:24:01 +01:00
fn main ( ) {
2019-12-13 19:29:22 +01:00
let mut input = read_input ( ) ;
let part1 = IntComputer ::new ( input . clone ( ) , 0 , vec! [ ] )
2019-12-13 08:24:01 +01:00
. get_all_outputs ( )
. into_iter ( )
. skip ( 2 )
. step_by ( 3 )
. filter ( | s | s = = & 2 )
. count ( ) ;
println! ( " Part 1: {} " , part1 ) ;
2019-12-13 19:29:22 +01:00
input [ 0 ] = 2 ;
let ( mut paddle_pos , mut ball_pos ) = ( 0 , 0 ) ;
let mut ic = IntComputer ::new ( input , 0 , vec! [ ] ) ;
let mut outputs = Vec ::with_capacity ( 3 ) ;
let mut field : HashMap < Position2D , Tile > = HashMap ::new ( ) ;
let mut score = 0 ;
loop {
match ic . step ( ) {
IntComputerResult ::Output ( o ) = > outputs . push ( o ) ,
IntComputerResult ::Halt = > break ,
IntComputerResult ::Continue = > ( ) ,
} ;
if outputs . len ( ) = = 3 {
let pos : Position2D = ( outputs [ 0 ] , outputs [ 1 ] ) . into ( ) ;
if pos . x = = - 1 {
score = outputs [ 2 ] ;
outputs . clear ( ) ;
continue ;
}
let tile = outputs [ 2 ] . into ( ) ;
match tile {
Tile ::Ball = > ball_pos = pos . x ,
Tile ::Paddle = > paddle_pos = pos . x ,
_ = > ( ) ,
} ;
field . insert ( pos , tile ) ;
outputs . clear ( ) ;
ic . params = vec! [ int ( ball_pos . cmp ( & paddle_pos ) ) ] ;
//println!("{}", draw_ascii(&field, Tile::Empty));
}
}
println! ( " Part 2: {} " , score ) ;
2019-12-13 08:24:01 +01:00
}