const f = factorial;

const log = (...msg) => {
    console.log(msg.join(" "));
}

const flog = (feladat) => {
    log(`=================== task ${feladat} ===`);
}

const feladat = (n, f) => {
    flog(n);
    f();
}


feladat(2, () => {
    const vals = [13, 11, 13, 23, 33, 33, 31, 23, 33, 21]
    
    const px = {};
    const py = {};
    const pxy = {};
    
    for (const v of vals) {
        const x = `${v}`[0];
        const y = `${v}`[1];
        
        if (px[`${x}`]) px[`${x}`]++;
        else px[`${x}`] = 1;
        
        if (py[`${y}`]) py[`${y}`]++;
        else py[`${y}`] = 1;
        
        if (pxy[`${x}${y}`]) pxy[`${x}${y}`]++;
        else pxy[`${x}${y}`] = 1;
    }
    
    const ex = Object.entries(px).map(kv => parseInt(kv[0]) * (kv[1]/vals.length)).reduce((a,v) => a+v)
    const ey = Object.entries(py).map(kv => parseInt(kv[0]) * (kv[1]/vals.length)).reduce((a,v) => a+v)
    const exy = Object.entries(pxy).map(kv => (parseInt(kv[0][0]) * parseInt(kv[0][1])) * (kv[1]/vals.length)).reduce((a,v) => a+v)
    
    log(exy - (ex * ey))
})

feladat(5, () => {
    log("harom sornyi osszeadas")
})

feladat(6, () => {
    log("uveges feladat")
})

feladat(7, () => {
    log("dobokocka lol")
})

feladat(8, () => {
    log("odusszeusz")
    const road_a = 1/3;
    const road_s = 1/3;
    const road_m = 1/3;
    
    const true_a = 1/5;
    const true_s = 1/3;
    const true_m = 1/4;
    
    const false_a = 1 - true_a;
    const false_s = 1 - true_s;
    const false_m = 1 - true_m;
    
    const total_false = false_a * road_a + false_s * road_s + false_m * road_m;
    
    log((false_m * road_m) / total_false)
    log(45/133)
})

feladat(9, () => {
    log("the thing with money")
    const initial = 80;
    const dev = [4.0, -4.0, -3.0].map(v => 1 + (v / 100));
    let days = 4;
    
    function calculateRecursive(value, year) {
        if (year === 0) return value;
        
        let result = 0.0;
        for (const factor of dev) {
            result += parseFloat(calculateRecursive(value * factor, year - 1));
        }
        return result;
    }
    
    const s4 = calculateRecursive(initial, days);
    
    const modifier = Math.pow(1/dev.length, days);
    const expected = modifier * s4;
    log(expected);
    
    function expectedDaysToDrop(initial, dropPercent, rates) {
        const target = initial * (1 - dropPercent / 100);
        const expectedMultiplier = rates.reduce((sum, r) => sum + r, 0) / rates.length;
    
        let n = Math.log(target / initial) / Math.log(expectedMultiplier);
        return Math.ceil(n);
    }
    
    const left = expectedDaysToDrop(initial, 30, dev);
    log(`${left}`);

})

feladat(9.2, () => {
    log("the thing with money p2")
    const initial = 100;
    const dev = [5, 4.0, -6].map(v => 1 + (v / 100));
    const days = 4;
    
    
    function rec(value, days) {
        if (days === 0) return value;
        
        let result = 0.0;
        for (const factor of dev) {
            result += parseFloat(rec(value * factor, days - 1));
        }
        
        return result;
    }
    
    const s4 = rec(initial, days)
    
    const modifier = Math.pow(1 / dev.length, days);
    const expected = modifier * s4;
    log(expected);
    
    function expectedD(initial, perc, rates) {
        const target = initial * (1 - perc / 100);
        const expected = rates.reduce((a, v) => a+v, 0) / rates.length;
        
        const n = Math.log(target / initial) / Math.log(expected);
        return Math.ceil(n);
    }
    
    const dropDay = expectedD(initial, 30, dev)
    log(dropDay);
});


feladat(3, () => {
    const a = 3;
    const b = 6;
    
    const l1 = 21/16;
    const l2 = 17/4;
    
    const F = l => (l < a) ? 0 : (l - a) / (b - a);
    
    const p = F(l2) - F(l1);
    const e = (a + b) / 2;
    
    log(`p = ${p}`);
    log(`e = ${e}`);
});

feladat(3.5, () => {
    const a = 5;
    const b = 10;
    
    const l1 = 123/16;
    const l2 = 63/8;
    
    const F = l => (l < a) ? 0 : (l - a) / (b - a);
    
    const P = F(l2) - F(l1);
    const E = (a + b) / 2;
    
    log(`p = ${P}`)
    log(`e = ${E}`)
})






"";
