part2
#!/usr/bin/env php
<?php
/**
* Find the gears (any * with exactly 2 numbers adjacent to it. Numbers may be multiple characters.)
*/
//$input = file_get_contents(__DIR__.'/sample2.txt');
//$input = file_get_contents(__DIR__.'/sample2b.txt');
//$input = file_get_contents(__DIR__.'/sample2c.txt');
$input = file_get_contents(__DIR__.'/input2.txt');
$expected_output = '';
//$game_lines = explode("\n", trim($input));
$lines = explode("\n", trim($input));
$total = 0;
$completed_products = [];
foreach ($lines as $line_num => $line){
$chars = str_split($line);
$cur_num = null;
$is_cur_num_valid = false;
$nums = [];
foreach ($chars as $index=>$c){
if ($c != '*')continue;
$pos_line = $line_num;
$pos_char = $index;
$new_numbers_found = 0;
$is_number_active = false;
$number_positions = [];
$_positions = [
[$pos_line - 1, $pos_char - 1], [$pos_line - 1, $pos_char], [$pos_line - 1, $pos_char+1],
[$pos_line, $pos_char - 1], [$pos_line, $pos_char], [$pos_line, $pos_char +1],
[$pos_line+ 1, $pos_char - 1], [$pos_line+ 1, $pos_char ], [$pos_line+ 1, $pos_char +1],
];
echo "\n\nTEST POSITIONS\n";
$prev_line_num = $pos_line - 1;
foreach ($_positions as $number_search_pos){
$_pos_line = $number_search_pos[0];
$_pos_char = $number_search_pos[1];
$line = $lines[$_pos_line] ?? "";
$char = str_split($line)[$_pos_char] ?? null;
if ($prev_line_num < $_pos_line){
$is_number_active = false;
}
$prev_line_num = $_pos_line;
echo $char;
if (is_numeric($char)&&!$is_number_active){
//var_dump("NUMERIC MAKE ACTIVE");
$is_number_active = true;
$new_numbers_found++;
$number_positions[] = [$_pos_line, $_pos_char];
} else if (is_numeric($char)){
// do nothing because we didn't find a new number
} else {
$is_number_active = false;
}
}
//var_dump($number_positions);
if ($new_numbers_found == 2){
//echo "WE DID IT";
//exit;
// we found a gear
$num1_pos = $number_positions[0];
$l1 = $num1_pos[0];
$c1 = $num1_pos[1];
$line = $lines[$l1];
$start_pos = $c1;
$search_pos = $c1-1;
while ($search_pos>=0
&& is_numeric( substr($line,$search_pos,1) )
){
$start_pos = $search_pos;
$search_pos = $start_pos - 1;
}
$c1 = $start_pos;
$num1 = '';
$yoink_pos = $start_pos;
while (($char = substr($line,$yoink_pos,1)) !== false){
$yoink_pos = $yoink_pos + 1;
if (is_numeric($char)) $num1 .= $char;
else break;
}
$num2_pos = $number_positions[1];
$l2 = $num2_pos[0];
$c2 = $num2_pos[1];
$line = $lines[$l2];
$start_pos = $c2;
$search_pos = $c2-1;
while ($search_pos>=0
&& is_numeric( substr($line,$search_pos,1) )
){
$start_pos = $search_pos;
$search_pos = $start_pos - 1;
}
$c2 = $start_pos;
$num2 = '';
$yoink_pos = $start_pos;
while (($char = substr($line,$yoink_pos,1)) !== false){
$yoink_pos = $yoink_pos + 1;
if (is_numeric($char)) $num2 .= $char;
else break;
}
$num1 = (int)$num1;
$num2 = (int)$num2;
//var_dump($num1);;
//var_dump($num2);
$l3 = $l1;
$c3 = $c1;
$l4 = $l2;
$c4 = $c2;
if ($l3 > $l4 || $l3 === $l4 && $c3 > $c4){
$l3 = $l2;
$c3 = $l2;
$l4 = $l1;
$c4 = $l1;
}
//$product_name = "$l3:$c3-$l4:$c4";
$p1 = "$l1:$c1";
$p2 = "$l2:$c2";
if (isset($completed_products[$p1]) || isset($completed_products[$p2])){
//echo "ALREADY ADDED";
continue;
}
$completed_products[$p1] = "$num1 * $num2";
$completed_products[$p2] = "$num1 * $num2";
//$completed_products[$product_name] = "$num1 * $num2";
$product = $num1 * $num2;
$total += $product;
}
}
}
print_r($completed_products);
echo "\n\nSum of powers: ". $total."\n\n";