54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
set_time_limit(0);
 | 
						|
 | 
						|
/*
 | 
						|
 * Advent of Code 2016
 | 
						|
 * Day 5 (part 1 and 2)
 | 
						|
 */
 | 
						|
 | 
						|
function calculateHashes($salt, $max = 8) {
 | 
						|
	$result = array();
 | 
						|
	$count = 0;
 | 
						|
	$start = 0;
 | 
						|
 | 
						|
	$cache_file = md5($salt).".cache";
 | 
						|
	if(file_exists($cache_file)) {
 | 
						|
		$result = file($cache_file);
 | 
						|
		if(count($result) >= $max)
 | 
						|
			return $result;
 | 
						|
	}
 | 
						|
 | 
						|
	for($i = 0; $i < 1000000000; $i++) {
 | 
						|
		$hash = md5($salt.$i);
 | 
						|
		if(substr($hash, 0, 5) === '00000') {
 | 
						|
			$result[$count++] = $hash;
 | 
						|
			if($count >= $max)
 | 
						|
				break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	file_put_contents($cache_file, implode("\n", $result));
 | 
						|
	return $result;
 | 
						|
}
 | 
						|
 | 
						|
$puzzle_input = 'reyedfim';
 | 
						|
$hashes = calculateHashes($puzzle_input, 30);
 | 
						|
 | 
						|
// Part 1
 | 
						|
$password = '';
 | 
						|
for($i = 0; $i < 8; $i++) {
 | 
						|
	$password .= substr($hashes[$i], 5, 1);
 | 
						|
}
 | 
						|
echo "Step 1 Password: $password\n";
 | 
						|
 | 
						|
// Part 2
 | 
						|
$password = array_fill(0, 8, '_');
 | 
						|
for($i = 0; $i < count($hashes); $i++) {
 | 
						|
	$pos = substr($hashes[$i], 5, 1);
 | 
						|
	$char = substr($hashes[$i], 6, 1);
 | 
						|
	if (is_numeric($pos) && (int)$pos < 8 && $password[(int)$pos] === '_') 
 | 
						|
		$password[(int)$pos] = $char;
 | 
						|
 | 
						|
}
 | 
						|
echo "Step 2 Password: ".implode($password); |