Last active
December 5, 2016 22:00
-
-
Save gingemonster/1e9a293ae40d8c6e5aac6d030678c092 to your computer and use it in GitHub Desktop.
Adventofcode Day 5 - Challenge 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Security.Cryptography; | |
using System.Text; | |
using System.Linq; | |
using System.Diagnostics; | |
namespace ConsoleApplication | |
{ | |
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
var input = "abbhdwsy"; | |
var index = 0; | |
var password = new string[8]; | |
var startTime = Process.GetCurrentProcess().StartTime; | |
var md5Hash = MD5.Create(); | |
{ | |
while(true){ | |
var hash = GetMd5Hash(md5Hash, input + index); | |
if(startsWithFiveZeros(hash)){ | |
CalculateNextPasswordCharacter(hash, password); | |
if(password.Count(p => p!=null) == 8) break; | |
} | |
index++; | |
} | |
} | |
Console.WriteLine(String.Join("", password)); | |
Console.WriteLine(DateTime.Now - Process.GetCurrentProcess().StartTime); | |
} | |
private static void CalculateNextPasswordCharacter(string hash, string[] password){ | |
var partOfHash = hash.Substring(5,1); | |
if(!IsDigitsOnly(partOfHash)) return; | |
var passIndex = Convert.ToInt16(partOfHash); | |
if (passIndex > 7) return; | |
if(password[passIndex]==null) password[passIndex] = hash.Substring(6,1); | |
} | |
private static bool IsDigitsOnly(string str) | |
{ | |
foreach (char c in str) | |
{ | |
if (c < '0' || c > '9') | |
return false; | |
} | |
return true; | |
} | |
private static string GetMd5Hash(MD5 md5Hash, string input) | |
{ | |
// Convert the input string to a byte array and compute the hash. | |
byte[] data = md5Hash.ComputeHash(Encoding.ASCII.GetBytes(input)); | |
// Return the hexadecimal string. | |
return StringExtensions.ToHex(data); | |
} | |
private static bool startsWithFiveZeros(string input){ | |
return input.Substring(0,5) == "00000"; | |
} | |
} | |
public static class StringExtensions{ | |
/// <summary> | |
/// Hex string lookup table. | |
/// </summary> | |
private static readonly string[] HexStringTable = new string[] | |
{ | |
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", | |
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", | |
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", | |
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", | |
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", | |
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", | |
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", | |
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", | |
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", | |
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", | |
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", | |
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", | |
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", | |
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", | |
"E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", | |
"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" | |
}; | |
/// <summary> | |
/// Returns a hex string representation of an array of bytes. | |
/// </summary> | |
/// <param name="value">The array of bytes.</param> | |
/// <returns>A hex string representation of the array of bytes.</returns> | |
public static string ToHex(this byte[] value) | |
{ | |
var stringBuilder = new StringBuilder(); | |
if (value != null) | |
{ | |
foreach (var b in value) | |
{ | |
stringBuilder.Append(HexStringTable[b]); | |
} | |
} | |
return stringBuilder.ToString(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment