Skip to content

Instantly share code, notes, and snippets.

@lesliev
Last active December 10, 2015 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lesliev/acdad2b243f2ca1a9647 to your computer and use it in GitHub Desktop.
Save lesliev/acdad2b243f2ca1a9647 to your computer and use it in GitHub Desktop.
Better circuits
#! /usr/bin/env ruby
class Circuit
def initialize(doc)
@doc = doc.split("\n").map(&:strip)
program = create(@doc)
File.open('program.rb', 'w'){|f| f.puts program}
puts
eval(program.join("\n"))
end
def wire(n)
if n =~ /^[0-9]+$/
"#{n}"
else
"wire_#{n}"
end
end
def trace(out)
"puts 'in #{out}'"
end
def create(doc)
program = []
calls = []
doc.each do |line|
source, out = line.split('->').map(&:strip)
if source =~ /AND/
a, b = source.split('AND').map(&:strip)
program << "def #{wire(out)}; #{trace(out)}; #{wire(a)} & #{wire(b)}; end"
elsif source =~ /OR/
a, b = source.split('OR').map(&:strip)
program << "def #{wire(out)}; #{trace(out)}; #{wire(a)} | #{wire(b)}; end"
elsif source =~ /LSHIFT/
a, b = source.split('LSHIFT').map(&:strip)
program << "def #{wire(out)}; #{trace(out)}; #{wire(a)} << #{wire(b)}; end"
elsif source =~ /RSHIFT/
a, b = source.split('RSHIFT').map(&:strip)
program << "def #{wire(out)}; #{trace(out)}; #{wire(a)} >> #{wire(b)}; end"
elsif source =~ /NOT/
a = source.split('NOT').map(&:strip).last
program << "def #{wire(out)}; #{trace(out)}; 65535-#{wire(a)}; end"
else
program << "def #{wire(out)}; #{trace(out)}; #{wire(source)}; end"
end
calls << wire(out)
end
calls = calls.sort.map do |c|
quoted = '#{' + c + '}'
%Q(puts "#{c}: #{quoted}")
end
program + calls
end
end
doc =<<-END
123 -> x
456 -> y
x AND y -> d
x OR y -> e
x LSHIFT 2 -> f
y RSHIFT 2 -> g
NOT x -> h
NOT y -> i
END
#Circuit.new(doc)
Circuit.new(File.read('input1.txt'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment