Another easy day for Advent of Code. The first challenge was to simply iterate over a string (take an input string, add 1 to it, and increase that number), make a hash, and check to see if the hash begins with 5 zeroes. If it does, you take the number after the 5 zeroes as a password character. You keep appending to a password until you have seven characters:


var crypto = require('crypto');


var input = 'ojvtpuvg';
generatePassword(input);

function generatePassword(s) {
    console.log('input = '+s);
    let password = '';

    let i = -1;
    while(password.length < 8) {
        i++;
        var hash = crypto.createHash('md5').update(s + i).digest('hex');
        if(hash.indexOf('00000') === 0) {
            let pchar = hash.substr(5,1);
            password += pchar;
            console.log('Generating password: '+password);
        }
    }

    console.log('Final password: '+password);
}

The only real difficult part was finding the Node Hash function and that was just one Google search. Looking over it now, having a generatePassword function seems a bit silly but I was assuming part would possibly need it. (It didn't.)

Speaking of part 2 - all it did was specify that the two characters after the five zeroes now represent a password position and password character. So the solution got a bit more complex.


var crypto = require('crypto');


let input = 'ojvtpuvg';
generatePassword(input);

function generatePassword(s) {
    console.log('input = '+s);
    let password = ['','','','','','','',''];

    let i = -1;
    while(!passwordDone(password)) {
        i++;
        var hash = crypto.createHash('md5').update(s + i).digest('hex');
        if(hash.indexOf('00000') === 0) {
            let pchar = hash.substr(6,1);
            let pos = hash.substr(5,1);
            if(pos >= 0 && pos <= 7 && password[pos] === '') {
                console.log(hash, pchar, pos);
                password[pos] = pchar;
                console.log('Generating password: '+password);
            }
        }
    }

    console.log('Final password: '+password.join(''));
}

function passwordDone(inp) {
    for(i=0;i<inp.length;i++) {
        if(inp[i] === '') return false;
    }
    return true;
}

As I said - pretty easy. But that's how Advent of Code works. It lulls you into a sense of confidence and then destroys that without mercy.

You can find my repo of solutions here: https://github.com/cfjedimaster/adventofcode