Day 25: Code Chronicle

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • Zikeji@programming.dev
    link
    fedilink
    English
    arrow-up
    2
    ·
    2 days ago

    Javascript

    Spent 10 minutes debugging my solution until I reread and found out they wanted the number of keys that fit, not the ones that overlapped. Reading comprehension is not it tonight.

    const [locks, keys] = require('fs').readFileSync(0, 'utf-8').split(/\r?\n\r?\n/g).filter(v => v.length > 0).map(s => s.split(/\r?\n/g).filter(v => v.length > 0)).reduce((acc, s) => {
        const lock = s[0].split('').every(v => v === '#');
        const schema = s.slice(1, -1);
        let rotated = [];
        for (let i = 0; i < schema[0].length; i += 1) {
            for (let j = 0; j < schema.length; j += 1) {
                if (!rotated[i]) rotated[i] = [];
                rotated[i].push(schema[j][i]);
            }
        }
        if (!lock) {
            rotated = rotated.map(v => v.reverse());
        }
        const pinHeights = [];
        for (const row of rotated) {
            const height = row.indexOf('.');
            pinHeights.push(height !== -1 ? height : 5);
        }
        if (lock) {
            acc[0].push(pinHeights);
        } else {
            acc[1].push(pinHeights);
        }
        return acc;
    }, [[],[]]);
    
    let fits = 0;
    for (const lock of locks) {
        for (const key of keys) {
            let overlapped = false;
            for (let i = 0; i < lock.length; i += 1) {
                if ((lock[i] + key[i]) > 5) {
                    overlapped = true;
                }
            }
            if (!overlapped) {
                fits += 1;
            }
        }
    }
    
    console.log('Part One', fits);