public function parse($instruction) { list($sources, $target) = explode(" -> ", $instruction); if (is_numeric($sources)) { return $this->circuit->sendSignal($target, $sources); } $parts = explode(" ", $sources); if (count($parts) == 1) { $value = $this->circuit->getWireValue($sources); if (is_null($value)) { return false; } return $this->circuit->sendSignal($target, $value); } if (count($parts) == 2) { list($not, $source) = $parts; $value = $this->circuit->getWireValue($source); if (is_null($value)) { return false; } return $this->circuit->sendSignal($target, ~$value); } list($source1, $type, $source2) = $parts; $source1 = is_numeric($source1) ? $source1 : $this->circuit->getWireValue($source1); $source2 = is_numeric($source2) ? $source2 : $this->circuit->getWireValue($source2); if (is_null($source1) || is_null($source2)) { return false; } switch ($type) { case "AND": $this->circuit->sendSignal($target, $source1 & $source2); break; case "OR": $this->circuit->sendSignal($target, $source1 | $source2); break; case "LSHIFT": $this->circuit->sendSignal($target, $source1 << $source2); break; case "RSHIFT": $this->circuit->sendSignal($target, $source1 >> $source2); break; } }
public function __invoke() { $circuit = new Circuit(new WiresCollection()); $parser = new InstructionsParser($circuit); $input = file_get_contents(__DIR__ . "/../../input/Day7/Puzzle1"); $instructions = explode(PHP_EOL, $input); while (true) { foreach ($instructions as $k => $instruction) { if ($parser->parse($instruction) !== false) { unset($instructions[$k]); } } if (empty($instructions)) { break; } } echo "Signal provided to wire 'a':" . $circuit->getWireValue("a"); }