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
require_relative "computer"

program = ARGF.read

p (5..9).to_a.permutation.map {|phase_settings|
  amplifiers = Array.new(5) { Computer.from(program) }

  pipes = Array.new(5) { IO.pipe }

  # input phase settings
  pipes.zip(phase_settings).each do |(_, w), ps|
    w.puts(ps)
  end

  # first 0 signal
  pipes.first.last.puts(?0)

  ios = pipes.cycle.each_cons(2).take(5).map {|(r, _), (_, w)| [r, w] }

  ts = amplifiers.zip(ios).map {|(a, (i, o))|
    Thread.new { a.run(i, o) }
  }
  ts.each(&:join)

  thrusters_input = ios.first.first
  thrusters_input.gets.to_i
}.max