$instruction) { if (in_array(substr($instruction, 0, 3), ['nop', 'jmp'])) { $to_change[] = $index; } } // copy instructions $original_instructions = $instructions; while (true) { if (!array_key_exists($current_index, $instructions)) { echo $acc; exit; } if (in_array($current_index, $used_indexes, true)) { // fail, reset and change next nop or jmp $acc = 0; $used_indexes = []; $current_index = 0; $instructions = $original_instructions; $changed_instruction_index = array_shift($to_change); $instruction_to_change = $instructions[$changed_instruction_index]; [$command, $math] = explode(' ', $instruction_to_change); if ($command === 'nop') { $instructions[$changed_instruction_index] = sprintf('jmp %s', $math); } else { $instructions[$changed_instruction_index] = sprintf('nop %s', $math); } continue; } $used_indexes[] = $current_index; $current_op = $instructions[$current_index]; [$command, $value] = explode(' ', $current_op); if ($command === 'nop') { $current_index++; continue; } $math_op = $value[0]; $math_value = substr($value, 1); if ($command === 'acc') { if ($math_op === '+') { $acc += (int)$math_value; } else { $acc -= (int)$math_value; } $current_index++; continue; } if ($command === 'jmp') { if ($math_op === '+') { $current_index += (int)$math_value; } else { $current_index -= (int)$math_value; } continue; } }