require 'rexml/document' require 'gate' class Net def initialize(file1, file2) ### kontrola existence souborů raise "Soubor #{file1} neexistuje" unless File.exists?(file1) raise "Soubor #{file2} neexistuje" unless File.exists?(file2) ### načtení souboru s hradly @f1 = File.new(file1) load_gates ### zjistíme cestu, jak procházet hradla find_trace ### načtení a zpracování datového souboru @f2 = File.new(file2) process_data end def load_gates doc = REXML::Document.new(@f1) @inputs = [] doc.elements.each("*/input") { |e| @inputs << e.attributes['id'] } @gates = [] doc.elements.each("*/gate") { |gate| add_gate gate } @outputs = [] doc.elements.each("*/output") { |e| @outputs << e.attributes['id'] } end def add_gate gate g = Gate.new(gate.attributes['type']) gate.elements.each("input") { |i| g.input = i.attributes['id'] } gate.elements.each("output") { |o| g.output = o.attributes['id'] } @gates << g end def find_trace @trace = [] inputs = @inputs.clone last_inputs = nil gates = @gates until gates.empty? gates.each_index do |i| gate = gates[i] if gate.has(inputs) inputs << gate.output @trace << gates.delete_at(i) end end raise 'Byl nalezen cyklus' if inputs == last_inputs last_inputs = inputs.clone end end def process_data @results = [] until @f2.eof? line = @f2.readline vars = {} @inputs.each_index { |i| vars[@inputs[i]] = line[i]-48 } @trace.each do |gate| vars[gate.output] = gate.result(vars) end res = [] @outputs.each do |id| res << vars[id] end puts res.join end end attr_reader :inputs, :outputs, :trace end