Loading...
AleksandarRadev avatar AleksandarRadev 2 Точки

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 2472 Точки
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
ThomasMore avatar ThomasMore -19 Точки

Regardless of whether you like to stroll around the trees or close to the little bistros along curious side lanes, I recommend that you go on strolls and look at your proposition. You may find that the qualification in the scene, the expansion in a clamouring framework, or the reviving calm of a preoccupation network way is only the assistance you need.
 

By: https://articleoftheweek.com/

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.