0x0049 icon

Advent of Code | Day 7

0x0049 | PRO | 12/07/15 07:57:59 PM UTC | 0 ⭐ | 161 👁️ | Never ⏰ | []
JavaScript |

1.55 KB

|

None

|

0 👍

/

0 👎

// Reads wires into an array then calls fn().
function readFile(file, fn) {
    require('readline').createInterface({
        input: require('fs').createReadStream(file)
    })
    .on('line', function (line) {
        var pieces = line.split(' -> ');
        wires[pieces[1]] = pieces[0];
    })
    .on('close', fn);
}
 
var wires = {}, calculated = {}, mask = 65535;
 
var ops = {
    AND: function(a, b) { return a & b; },
    OR: function (a, b) { return a | b; },
    XOR: function (a, b) { return a ^ b; },
    NOT: function (a) { return ~ a; },
    LSHIFT: function (a, b) { return a << b; },
    RSHIFT: function (a, b) { return a >> b; }
};
 
// Recursively calculate the signal to this wire.
function calculate(wire) {
    if (!isNaN(wire))   return parseInt(wire);
    if (calculated[wire]) return calculated[wire];
 
    var input = wires[wire].split(' '), length = input.length; // Note: inputs must only be strings.
    if (length === 1) calculated[wire] = calculate(input[0]);
    else if (length === 2) calculated[wire] = ops.AND(ops[input[0]](calculate(input[1])), mask);
    else if (length === 3) calculated[wire] = ops.AND(ops[input[1]](calculate(input[0]), calculate(input[2])), mask);
 
    return calculated[wire];
}
 
// Accept wire and file as arguments. Can also use "all" instead of a wire.
var wire = process.argv[2] ? process.argv[2] : 'a';
var file = process.argv[3] ? process.argv[3] : 'day7_input';
readFile(file, function() {
    if (wire === 'all') {
        Object.keys(wires).map(calculate);
        console.log(calculated);
    }
    else {
        calculate(wire);
        console.log(calculated[wire])
    }
});

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎