Софтуерно Инженерство
Loading...
AleksandarRadev avatar AleksandarRadev 1 Точки

9.2 Passion days - задачи за шампиони, Javascript

Здравейте, 

От 2 дни опитвам да реша задача 01. Passion days от учебника по Javascript. Получавам 90/100 в judge. Не мога да разбера каква може да е грешката, тъй като кода си работи, пробвах каквото се сетих за вход. 

Следния код ми дава 90/100:

function asd(args) {
    let money = Number(args[0]);
    let purchases = 0;
    let i = 1;
    let n1;
    
    for (; i < args.length; i++) {
        if (args[i] === `mall.Enter`) break;
    }
    
    for (let a1 = i + 1; a1 < args.length; a1++) {
        
        if (args[a1] == `mall.Exit`) break;
    
        for (let a2 = 0; a2 < args[a1].length; a2++) {
            n1 = args[a1].charCodeAt(a2);
            
            if (n1 >= 65 && n1 <= 90) {
                if(money >= n1*0.5) {
                    money -= n1*0.5;
                    purchases++;
                }
                
            } else if (n1 >= 97 && n1 <= 122) {
                if(money >= n1*0.3) {
                    money -= n1*0.3;
                    purchases++;
                }
                
            } else if (n1 === 37) {
                if(money > 0) {
                    money /= 2;
                    purchases++;
                }
                
            } else if (n1 === 42) {
                    money += 10;
                    
            }    else {
                if (money >= n1) {
                money -= n1;
                purchases++;
                }
            }
        }
    }
    if (purchases == 0) {console.log(`No purchases. Money left: ${money.toFixed(2)} lv.`);}
    else {console.log(`${purchases} purchases. Money left: ${money.toFixed(2)} lv.`);}
}

Гледах решение на C# със 100/100, но не успявам да открия съществени различия. 

Тагове:
1
JavaScript Fundamentals
willystyle avatar willystyle 1585 Точки
Best Answer

Съществената разлика е, че в C# i Java решенията ползват обикновено decimal, за по-големи числа (повече от 15 знака, до 31 май). В JS няма BigDecimal, има BigInt, може би трябва да се мине с * 100 за цели големи числа.

Ако пускаш пробно решение:

function solve(args) {
    if (args[0].length > 28) throw new Error();
}

ще се увериш, че грешката във въпросния 7-ми тест идва от това, че при него args[0] т.т money е с 29 знака, всички останали входове са под 16 знака.

Ето го въпросното решение с BigInt:

function asd(args) {
    // if (args[0].length > 28) throw new Error();
    let money = BigInt(args[0]) * 100n;
    let purchases = 0;
    let i = 1;
    let n1;

    for (; i < args.length; i++) {
        if (args[i] === `mall.Enter`) break;
    }

    for (let a1 = i + 1; a1 < args.length; a1++) {
        if (args[a1] === `mall.Exit`) break;

        for (let a2 = 0; a2 < args[a1].length; a2++) {
            n1 = args[a1].charCodeAt(a2);

            if (n1 >= 65 && n1 <= 90) {
                if (money >= BigInt(n1 * 50)) {
                    money = money - BigInt(n1 * 50);
                    purchases++;
                }
            } else if (n1 >= 97 && n1 <= 122) {
                if (money >= BigInt(n1 * 30)) {
                    money = money - BigInt(n1 * 30);
                    purchases++;
                }
            } else if (n1 === 37) {
                if (money > 0n) {
                    if (money % 2n == 0) {
                        money = money / 2n;
                    } else {
                        money = money / 2n + 1n;
                    }
                    purchases++;
                }
            } else if (n1 === 42) {
                money = money + 1000n;
            } else {
                if (money >= BigInt(n1 * 100)) {
                    money = money - BigInt(n1 * 100);
                    purchases++;
                }
            }
        }
    }
    if (purchases === 0) {
        console.log(`No purchases. Money left: ${toFixed2(money)} lv.`);
    } else {
        console.log(`${purchases} purchases. Money left: ${toFixed2(money)} lv.`);
    }

    function toFixed2(bigInt) {
        let bigIntStr = bigInt.toString();
        if (bigIntStr.length > 2) {
            return bigIntStr.slice(0, -2) + '.' + bigIntStr.slice(-2);
        } else if (bigIntStr.length === 2) {
            return '0.' + bigIntStr;
        } else if (bigIntStr.length === 1) {
            return '0.0' + bigIntStr;
        }
    }
}

 

0
22/12/2019 12:32:03