part2.bak2
#!/usr/bin/env php
<?php
/**
* Find numbers on the left that are also on the right. For each match, gain one copy of the next X cards. (If there are four matches, get one copy of each of the next four cards). Process all the cards. Output the total number of cards you processed.
*/
//$input = file_get_contents(__DIR__.'/sample2.txt');
$input = file_get_contents(__DIR__.'/sample2b.txt');
//$input = file_get_contents(__DIR__.'/input2.txt');
$expected_output = 13;
//$game_lines = explode("\n", trim($input));
$lines = explode("\n", trim($input));
$total = 0;
function get_num_matches(string $game): int {
$parts = explode(":",$game);
$games = trim($parts[1]);
$left = explode("|",$games)[0];
$right = explode("|",$games)[1];
$left_nums = array_map('trim',explode(" ", $left));
$left_nums = array_combine($left_nums, $left_nums);
$right_nums = array_map('trim',explode(" ", $right));
$right_nums = array_combine($right_nums, $right_nums);
$card_value = 0;
//echo "\n\n\nLeft Nums:\n";
//print_r($left_nums);
//echo "\n\n\nRight Nums:\n";
//print_r($right_nums);
$num_matches = 0;
foreach ($left_nums as $num){
if (!is_numeric($num))continue;
if (isset($right_nums[$num])){
//echo "\n Match $num";
//if ($card_value == 0) $card_value = 1;
//else $card_value = $card_value * 2;
$num_matches++;
}
}
//echo "\n Card Value: $card_value";
//echo "\n Num Matches: $num_matches";
return $num_matches;
}
function get_subsequent_cards_total($current_card_index, $num_cards_to_get, $pool_of_cards, $solved_cards){
$subsequent_index = $current_card_index+1;
$subsequent_cards = [];
while (
$subsequent_index < count($pool_of_cards)
&& $subsequent_index <= ($current_card_index + $num_cards_to_get)
) {
$subsequent_cards[] = $pool_of_cards[$subsequent_index];
$subsequent_index++;
}
}
$cards_list = $lines;
//var_dump($cards_list);
//exit;
$stack = $lines;
$card_count = 0;
$loop_count = 0;
$match_counts = [];
foreach ($cards_list as $index => $card){
$match_counts[$index] = get_num_matches($card);
}
foreach ($match_counts as $index => $num_matches){
$next_x = $num_matches;
$start_pos = $index+1;
$end_pos = $index+$num_matches;
while ($end_pos > count($cards_list)){
$end_pos--;
}
while ($start_pos<=$end_pos){
$cur_pos = $start_pos;
$num_matches = $match_counts[$cur_pos];
$start_pos++;
}
}
//foreach ($lines as $index => $l){
while (count($stack) > 0){
$card_count++;
$loop_count++;
if (($loop_count%1000) === 0){
echo "\n\n\nLoop $loop_count\n\n\n\n";
}
$l = array_shift($stack);
//echo "\n\nProcess $l\n";
$game_text = trim(explode(":",$l)[0]);
//var_dump($game_text);
//exit;
$gn_parts = explode(" ",$game_text);
$game_num = (int)array_pop($gn_parts);
if ($game_num == 0)continue;
$game = $l;
$num_matches = get_num_matches($game);
$first_card = $game_num;
$last_card = $game_num + $num_matches;
$current_card = $first_card;
//echo "\n GameNum:$game_num";
//echo "\n NumMatches:$num_matches";
$new_cards = [];
while ($current_card < $last_card
&&isset($cards_list[$current_card])
){
if ($current_card == $game_num - 1){
$current_card++;
continue;
}
//echo "\n Add Card ".($current_card+1);
//echo "\n Stacksize:".count($stack);
//echo "\n Card: ".$cards_list[$current_card];
$new_cards[] = $cards_list[$current_card];
$current_card++;
}
$stack = array_merge($stack, array_reverse($new_cards));
//print_r($stack);
//exit;
//$total += $card_value;
//if ($loop_count > 10)exit;
}
echo "\nCard Count: $card_count";