Skip to content

Instantly share code, notes, and snippets.

@lesliev
Created December 10, 2015 04:26
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/51c75f2fb1acf5fbee19 to your computer and use it in GitHub Desktop.
Save lesliev/51c75f2fb1acf5fbee19 to your computer and use it in GitHub Desktop.
Circuits
#! /usr/bin/env ruby
class Circuit
def initialize(doc)
@doc = doc.split("\n").map(&:strip)
program = create(@doc)
eval(program.join("\n"))
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 #{out}; #{a} & #{b}; end"
elsif source =~ /OR/
a, b = source.split('OR').map(&:strip)
program << "def #{out}; #{a} | #{b}; end"
elsif source =~ /LSHIFT/
a, b = source.split('LSHIFT').map(&:strip)
program << "def #{out}; #{a} << #{b}; end"
elsif source =~ /RSHIFT/
a, b = source.split('RSHIFT').map(&:strip)
program << "def #{out}; #{a} >> #{b}; end"
elsif source =~ /NOT/
a = source.split('NOT').map(&:strip).last
program << "def #{out}; 65535-#{a}; end"
else
program << "def #{out}; #{source.strip}; end"
end
calls << 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment