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);
							 |