$output_array[1], 'sector_id' => $output_array[2], 'checksum' => $output_array[3] ); } return false; } function generateChecksum($room_name) { // calculate char occurrences $char_count_array = count_chars(str_replace('-', '', $room_name), 1); // sort by occurrence count arsort($char_count_array); // group chars into occurrence count $dedupe = array(); foreach($char_count_array as $char => $occurrence) { $dedupe[$occurrence][] = $char; } // cross my fingers and hope this actually works $checksum = ''; foreach($dedupe as $occurrence => $chars) { sort($chars); for($i = 0; $i < count($chars); $i++) { $checksum .= chr($chars[$i]); } } // cut off the excess and return return substr($checksum, 0, 5); } function decryptRoomName($name, $sector_id) { $key = $sector_id % 26; // this should work right? $a_start = ord('a'); $output = ''; for($i = 0; $i < strlen($name); $i++) { $a = ord(substr($name, $i, 1)); if($a == ord('-')) $output .= ' '; else $output .= chr($a_start + ((($a - $a_start) + $key) % 26)); } return $output; } $input = file('day4_input.txt'); //$input = array("aaaaa-bbb-z-y-x-123[abxyz]", "a-b-c-d-e-f-g-h-987[abcde]", "not-a-real-room-404[oarel]"); // Part 1 $valid_room_sum = 0; $valid_rooms = array(); foreach($input as $line) { $room_info = extractRoomInfo($line); $generated_checksum = generateChecksum($room_info['room_name']); if($generated_checksum == $room_info['checksum']) { $valid_rooms[] = $room_info; $valid_room_sum += (int)$room_info['sector_id']; } } echo "valid room sum: $valid_room_sum
\n"; // Part 2 foreach($valid_rooms as $room) { $decrypted_name = decryptRoomName($room['room_name'], (int)$room['sector_id']); echo "room name: $decrypted_name, sector: {$room['sector_id']}
\n"; }