Loading...
+ Нов въпрос
MartinBG avatar MartinBG 4436 Точки
Best Answer

Проблемът с това решение е, че очаква матриците винаги да са "квадратни" (броя на редовете да е равен на броя на колоните) и ще гръмне, ако му се подаде например:

[[1, 0, 0],
 [0, 1, 0]]

Проблемът е в тази трансформация:

let colToRow = input.map((row, i, arr) => arr[i].map((col, y) => arr[y][i]));

 

1
19/01/2021 06:11:33
gbsho avatar gbsho 5 Точки

Относно 4ти тест и аз не разбирам. Мисля, че имат грешка още в заданието.

От условието: "A matrix is magical if the --->>>sums<<<--- of the cells of every row and every column are equal."

Това означава, че като събереш сумата на числата от n ред - резултата трябва да е равен на сумата от числата от n колона. Ако за всеки n red и n колона това условие е изпълнено - то трябва да върнеш true.

TAKA ЧЕ НЯМА ЛОГИКА judge да очаква резултат false за тази матрица!

Отдолу е входната матрица и проверката й.


    [3,        6,        3]  | 12 (n=1)
    [6,        3,        6]  | 15 (n=2)
    [3,        6,        3]  | 12 (n=3)
   ----------------------------
    12    |    15   |   12
   (n=1) |  (n=2) | (n=3)
  

Ако условието беше формулирано, така че сумите трябва (ред,колона) да са равни и еднакви по стойност (да са едно и също число), то може би щеше да има повече логика.

Отолу е моето решение 83 / 100 (тест 4 не ми минава)

 

function magicMtrx(mtrx) {
  
    let [row,col,step,count] =[0,0,0,0];

    for (let step=0; step<mtrx.length; step++){
        mtrx[step].forEach(el=>row+=el);
        mtrx.forEach(el=>col+=el[step]);
        if (row===col){count++}
    }

    count === mtrx.length ? console.log("true") : console.log("false")
}

1
Tzigoriyn avatar Tzigoriyn 44 Точки

Привет gbsho,

първо в твоя код  let [row,col,step,count] =[0,0,0,0]; "step" в деструктурирането ти е излишно, никъде не го ползваш. В цикъла "step" е друга различна променлива.

Също имаш излишен код count === mtrx.length ? console.log("true") : console.log("false"),това просто можеш да го изпишеш като

console.log(count === mtrx.length) - това е boolean стойност.

Като цяло идеята ти е добра, но пробвай с критичен вход [[]], празен масив. Получаваш отговор, а би трябвало да ти гръмне грешка. А и [[1, 0, 1],[0, 1, 0],[1, 0, 1]] при този вход имаш отговор "true", а както би видял не е варно. Ти проверяваш сбора на всеки ред и колона което е row при index[0] ->1+0+1 = 2 и col = 1+0+1 row=2=col=2, при вторият цикъл row=3 и col=3, само че на теб реда ти е = 1,(втори ред [0,1,0]=1 !== първи ред[1,0,1]=2) което не е равно row=2, но тъй като ти проверяваш обща сума, а тя е row=3 и по ред и колона col=3 изпълняваш проверката и добавяш count++;

Трябва да сравняваш ред по ред и колона по колона, а не общ сбор. Ако запишеш сбора на първи ред и сравняваш по него всеки ред и колона ще вземеш 100/100. създай два масива като единият ти и по сбора на колоните, а другият ти е по сбора на редовете, то тогава можеш да сравниш двата масива като ползваш toString(), след като си проверил дали стойностите в двата масива на всички колони и редове са равни. Тогава ще си сигурен, в крайният резултат!

Успех!

 

1
22/09/2022 19:32:25
Tzigoriyn avatar Tzigoriyn 44 Точки

А ето и твоя код 100/100 с малки поправки ;):

function magicMtrx(mtrx) {

    let [row, col, count] = [0, 0, 0];
    const equalBenchmark = mtrx[0].reduce((a, b) => {
        a += b;
        return a; 
    }, 0)

    for (let step = 0; step < mtrx.length; step++) {
        let rowCheck = 0;
        let colCheck = 0;

        mtrx[step].forEach(el => rowCheck += el);
        rowCheck === equalBenchmark ? row += rowCheck : row = null;
       
        mtrx.forEach(el => colCheck += el[step]);
        colCheck === equalBenchmark ? col += colCheck : col = null;
        
        if (row === col && row != null && col != null) { count++ };
    }

    console.log(count === mtrx.length);
}

Лично аз бих го решил доста различно, но мисля, че идеята е да ти помогна на теб с твоята логика, а ако искаш да видиш друго драсни два реда.

Успех!

0
22/09/2022 22:14:45
gbsho avatar gbsho 5 Точки

Здравей, Tzigoriyn  ! Благодаря, времето и подробните обеснения!

Да, горе няма нужда да задавам step [row,col,step,count]

Аз задачата я реших (отдолу е кода), но не исках да я правя, както по упражненията - взимат два съседни реда и две колони, които ги сравняват.

function magicMtrx(mtrx){
    
    let [row1,row2,col1,col2] =[0,0,0,0];
    
    for (let step=0; step<mtrx.length-1; step++){
        mtrx[step].forEach(el=>row1+=el);
        mtrx[step+1].forEach(el=>row2+=el);
        mtrx.forEach(el=>col1+=el[step]);
        mtrx.forEach(el=>col2+=el[step+1]);
        if(row1 === row2 && col1 === col2){return true;}
        else{return false;}
    }
}
console.log(magicMtrx([[1, 0, 1],
 [0, 1, 0],
 [1, 0, 1]]))

 

Моята идея е, че на всяка стъпка сравнявам сумите от ред/колона, увеличавам row и col - ако са равни увеличавам count.

На следващата стъпка, пак ги сравнявам и добавям в row и col - ако са равни пак увеличавам count... и т.н

Накрая ако count e колкото е matrix.lenght, значи всички суми от ред/колона са еднакви...

Целта ми беше да стане с възможно най-малко код :)

За 4ти тест, който коментирам матрицата е:

    [3,        6,        3] 
    [6,        3,        6]
    [3,        6,        3] 

( от вида които ти написа: [1, 0, 1], [0, 1, 0], [1, 0, 1] )

judge очаква да получи false, но според мен тази матрица е меджик ( true ).

Може и да бъркам нещо - както споменах - не мога да им разбера задания понягока.

Аз така или иначе не си спомням за "магически матрици" в математиката... :)

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