Loading...
gbsho avatar gbsho 9 Точки

Относно 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 9 Точки

Здравей, 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
gbsho avatar gbsho 9 Точки

Ще се радвам да видя и твоята интерпретация (решение).

Благодаря!

0
Tzigoriyn avatar Tzigoriyn 44 Точки

Ако искаш малко код виж това:

function magicMatrices(arr) {

    let sumRow = arr.map((col => col.reduce((a, b) => a + b)));

    let sumCol = arr.reduce((r, a) => r.map((b, i) => a[i] + b));

    let allEqual = array => array.every( v => v === array[0]);

    console.log(allEqual(sumRow) && sumRow.toString() === sumCol.toString());
    
}

и идеята на кода e не само кода да е малко, а да е reusable и възможно най бърз, защото се предполага че ще се рендва в browser. Имай в предвид, че колкото пъвече циклиш толкова повече бавиш! Ако погледнеш в един от коментарите съм редактирал твоя код, взимам един ред и с него проверявам всеки ред и всяка колона. Сумата от редовете и колоните изобщо не тие е нужна, просто допълнителна проверка за подсигуряване.

Относно ->

[3,        6,        3]->12
[6,        3,        6]->15
[3,        6,        3]->12

12       15        12

определено е false, по условие " Write a function that checks if a given matrix of numbers is magical. A matrix is magical if |-> the sums of the cells of every row and every column are equal |->(сумите от клетките на всеки един ред и всяка една колона трябва да са равни). "!

Ако ти харесва моя код и коментара не забравяй да удариш един палец yes.

wink

Успех!

 

П.П. Матриците са във висшата математика и има магически матрици, дори при тях са равни и диагоналите wink

                            15

[8,        1,        6]->15
[3,        5,        7]->15
[4,        9,        2]->15

15       15      15   15

1
24/09/2022 11:46:08
VladeyMoney avatar VladeyMoney 2 Точки

100/100

function magic(matrix) {

    let sum = matrix[0].reduce((sum, x) => sum + x);

    for (let row = 0; row < matrix.length; row++) {

        let rowSum = 0;

        let colSum = 0;

        for (let col = 0; col < matrix[row].length; col++) {

            if (col < matrix.length) {

                rowSum += matrix[col][row];

            }           

            colSum += matrix[row][col];

        }

        if (rowSum != sum ||

            colSum != sum) {

            return false;

        }

    }

    return true;

}

0
Tzigoriyn avatar Tzigoriyn 44 Точки

VladeyMoney Няма страшно ще се научиш, но това става с времето.

Пояснавам

sumRow

е масив от сумите на всеки ред, а

sumCol

е масив от сумите на всяка колона

allEqual(sumRow)

е проверка коята проверява дали всички суми от пададеният масив са равни.

console.log(allEqual(sumRow) && sumRow.toString() === sumCol.toString());

Ако си задаваш въпроса "Защо не проверявам и колоните за еднаквост?" -няма смисъл да циклиш още веднъж през every() и да бавиш кода допълнително, просто ако първият масив е true сравняваш два стринга, примерно - "2, 2, 2" === "2, 2, 2". Целият израз връща boolean и печатиш резултата.

Но ако трябва да ти разяснявам какво прави map(), reduce(), every() и каво означава let allEqual = array => .... и че това не е променлива, а

Function expressions

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

;)

Успех приятел!

0
25/09/2022 16:36:00
VladeyMoney avatar VladeyMoney 2 Точки

Tzigoriyn тези функции отдолу не работят с цикли и са по-оптимизирани, така ли да го разбирам?

0
Tzigoriyn avatar Tzigoriyn 44 Точки

Да точно така VladeyMoney, те се наричат Methods, погледни "Instance methods" MDN те също обхождат масива в зависимост от това което търсим от него, разбира се доста по оптимизирано. Като цяло това което наричаме цикли са само три:

  • стандартен фор цикъл - for ([initialExpression]; [conditionExpression]; [incrementExpression])
      statement
  • while(condition)
  • do
      statement
    while (condition);
    
    
    
    
    
    
     

 

0
25/09/2022 17:53:13
VladeyMoney avatar VladeyMoney 2 Точки

  Tzigoriyn аз не мисля така

https://leanylabs.com/blog/js-forEach-map-reduce-vs-for-for_of/

 

 

 

0
Tzigoriyn avatar Tzigoriyn 44 Точки

Един преподавател някога в SoftUni каза "На Вас като програмисти никой няма да Ви плаща за брой редове код, а за работещ код".

Един реторичен въпрос: Колко реда код ще трябва да напишеш ако трябва да подредиш поименно един масив от именна, защото посредством метода sort() ще го направиш буквално с един ред. Да той отдолу като цяло е цикъл, но за да разбера какво искаш да направиш при обикновен for() ще трябва да анализирам целият ти код, а при метода сорт веднага ще знам, че този код ще сортира и ще видя по къкъв критерий. А сега си представи няколко хиляди реда код и десетина човека като теб написали фор-цикълчета и на теб се пада честа да го тестваш. Ай ся кажи кой for() какво прави, сумира ли, филтрира ли, редуцира ли или пък прави нещо друго??? Също имай предвид, че този код не е на едно място, а е разпръснат в десетки файлове които се експортват и импортват на пред на зад(опа това с export май още не сте го учили?).

А иначе, за това се учат циклите, за да ръзбереш същноста на работа на МЕТОДИТЕ, които ги ползват underground. Да, те до някъде са по-бавни, но за сметка на това са и далеч по-мощни и интуитивни, но това ще го научиш с времето.

Всъщност тук имаше въпрос на който отговорих, защото колега изпитваше затруднения при разбирането на задачата и му помогнах. Моя код в никакъв случай не е критерий просто е кратък буквално е 6 реда със скобите, срещу 12 или 15, че и повече. 

Пожелавам ти успех VladeyMoney, извини ме, но не съм учител, поне не все още! Останалото ще го научиш в SoftUni, когато му дойде времето!

П.П. При въпрос на интервю за работа, циклите са тези които ти описах, другото, въпреки че изпълняват LOOP се наричат МЕТОДИ.

1
25/09/2022 22:35:25
VladeyMoney avatar VladeyMoney 2 Точки

Прав си за "за плащането на ред код" това важи и за писането по форуми според мен, но свързано с полза не заплащане.

0
Tzigoriyn avatar Tzigoriyn 44 Точки

Прав си VladeyMoney , аз отговорих на конкретното запитването на gbsho , колегата явно имаше проблем с условието на задачата, а не с решението и. Незная какво общо имаше неговият въпрос с кода който изплющя ти, при наличието, че той вече беше намерил своето решение със собствена логика, което е най важното. На теб ти отговорих от вежливост и в никакъв случай не съм се опитвал да те поучавам, ти явно си ги знаеш нещата, извини ме моля!

Благодаря Axiomatik , гоуем си wink yes.

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