Loading...
Peter_Andonov avatar Peter_Andonov 0 Точки

10. Game of epicness - JavaScript advanced

Здравейте,

при този код ми дава грешка при изпълнението когато сортирам генералите на победителя. И при двата нулеви теста не ми дава грешка на моя комп. Къде бъркам ?

C:\Windows\TEMP\ExecutionStrategies\5pbkwo0r.4e2\tmpD380.tmp:180
    winningKingdom.generals.sort(function(a, b){
                   ^

TypeError: Cannot read property 'generals' of undefined
    at solve (C:\Windows\TEMP\ExecutionStrategies\5pbkwo0r.4e2\tmpD380.tmp:180:20)
    at adapter (C:\Windows\TEMP\ExecutionStrategies\5pbkwo0r.4e2\tmpD380.tmp:203:12)
    at Socket.<anonymous> (C:\Windows\TEMP\ExecutionStrategies\5pbkwo0r.4e2\tmpD380.tmp:210:18)
    at Socket.emit (events.js:214:15)
    at endReadableNT (_stream_readable.js:1178:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
Тагове:
0
JavaScript Advanced
Menander avatar Menander 1 Точки

Здравей, разгледах решението ти и според мен не си избрал най-подходящата структора,  в която да пазиш кралствата и това доста е усложнило задачата, прилагам моето решение:

function solution(input) {

 

    let [fillKingdomsPart, fightGeneralsPart] = [...input];

 

    let fillCurrentKingdom = function (kingdoms = {}, kingdom, general, army) {

 

        if (!kingdoms[kingdom]) {

            kingdoms[kingdom] = {}

        }

 

        if (!kingdoms[kingdom][general]) {

            kingdoms[kingdom][general] = { army: 0, wins: 0, losses: 0 }

        }

 

        kingdoms[kingdom][general].army += army;

 

    }

 

    let fillKingdoms = function (input) {

 

        let kingdoms = {};

 

        [...input].forEach(line => {

            let [kingdom, general, army] = Object.values(line);

            army = Number(army);

            fillCurrentKingdom(kingdoms, kingdom, general, army)

        });

 

        return kingdoms;

    }

 

    let determineWinnerGeneral = function (kingdoms = {}, kingdom1, general1, kingdom2, general2) {

 

        let firstArmy = kingdoms[kingdom1][general1].army;

        let secondArmy = kingdoms[kingdom2][general2].army;

 

        if (firstArmy !== secondArmy) {

            if (firstArmy > secondArmy) {

                kingdoms[kingdom1][general1].army = Math.floor(kingdoms[kingdom1][general1].army * 1.1)

                kingdoms[kingdom2][general2].army = Math.floor(kingdoms[kingdom2][general2].army * 0.9)

                kingdoms[kingdom1][general1].wins++;

                kingdoms[kingdom2][general2].losses++;

            } else {

                kingdoms[kingdom1][general1].army = Math.floor(kingdoms[kingdom1][general1].army * 0.9)

                kingdoms[kingdom2][general2].army = Math.floor(kingdoms[kingdom2][general2].army * 1.1)

                kingdoms[kingdom1][general1].losses++;

                kingdoms[kingdom2][general2].wins++;

            }

        }

    }

 

    let fightGenerals = function (kingdoms = {}, fightGeneralsPart = []) {

 

        fightGeneralsPart.forEach(line => {

            let [kingdom1, general1, kingdom2, general2] = [...line];

 

            if (kingdom1 !== kingdom2) {

 

                if (kingdoms[kingdom1][general1] && kingdoms[kingdom2][general2]) {

                    determineWinnerGeneral(kingdoms, kingdom1, general1, kingdom2, general2);

                }

 

            }

 

        })

    }

 

    let sumTotalwins = function (kingdoms = {}, kingdom) {

        let sum = 0

 

        Object.keys(kingdoms[kingdom]).forEach(general => {

            sum += kingdoms[kingdom][general].wins;

        })

 

        return sum;

    };

 

    let sumTotalLosses = function (kingdoms = {}, kingdom) {

 

        let sum = 0

 

        Object.keys(kingdoms[kingdom]).forEach(general => {

            sum += kingdoms[kingdom][general].losses;

        })

 

        return sum;

    }

 

    let determinWinnerKigdom = function (kingdoms = {}) {

        let sortedKingdoms = Object.keys(kingdoms).sort((kingdom1, kingdom2) => {

            let result = 0;

            let kingdom1TotalWins = sumTotalwins(kingdoms, kingdom1);

            let kingdom2TotalWins = sumTotalwins(kingdoms, kingdom2);

 

            result = kingdom2TotalWins - kingdom1TotalWins;

 

            if (result === 0) {

                let kingdom1TotalLosses = sumTotalLosses(kingdoms, kingdom1);

                let kingdom2TotalLosses = sumTotalLosses(kingdoms, kingdom2);

 

                result = kingdom1TotalLosses - kingdom2TotalLosses;

            }

 

            if (result === 0) {

                result = kingdom1.localeCompare(kingdom2);

            }

 

            return result;

        });

 

        return sortedKingdoms[0];


 

    };

 

    let printKingdom = (kingdoms = {}, winnerKingdom) => {

        console.log(`Winner: ${winnerKingdom}`);

 

        Object.keys(kingdoms[winnerKingdom]).sort((general1, general2) => {

            let general1Army = kingdoms[winnerKingdom][general1].army;

            let general2Army = kingdoms[winnerKingdom][general2].army;

 

            return general2Army - general1Army

        }).forEach(general => {

            console.log(`/\\general: ${general}`)

 

            Object.keys(kingdoms[winnerKingdom][general]).forEach(attribute => {

                console.log(`---${attribute}: ${kingdoms[winnerKingdom][general][attribute]}`)

            })

        })

    }

 

    //aggregate input in the correct way

    let kingdoms = fillKingdoms(fillKingdomsPart);

 

    //fight the generals

    fightGenerals(kingdoms, fightGeneralsPart)

 

    //determineWinnerGeneral

    let winnerKingdom = determinWinnerKigdom(kingdoms)

    //output in a proper way

    printKingdom(kingdoms, winnerKingdom);

 

}

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