Sprawdź czy zdałeś

0

Robię sobie takie oto zadanie na code wars https://www.codewars.com/kata/5a3dd29055519e23ec000074/train/javascript i mam za zadanie porównać sobie dwie tablice. Jedna to tablica z prawidłowymi odpowiedziami natomiast druga to po prostu tablica z odpowiedziami udzielonymi przez ucznia, a tutaj jest mój kod

function checkExam(array1, array2){
    let score = 0;
    for(let i = 1; i < array2.length; i++){
        for(let j = i + 1; j < array1.length; j++){
            if(array2[i] == array1[j]){
                score++
            }else if(array2[i] !== array1[j]){
                score--
            }else if(array2[j] == ' '){
                return score;
            }
        }
    }
}
checkExam(['a','a','b','b'],['a','c','b','d']);

problem w tym że zwraca mi za każdym razem undefined. Chodzi o to by porównać te dwie tablice i za każdą poprawną odpowiedź doliczyć 4 punkty za każdą złą -1 a za pustą dać po prostu 0. Czy mógłbym prosić o jakąś małą podpowiedź sugerującą co takiego zmienić w tym kodzie

1

problem w tym że zwraca mi za każdym razem undefined.

Żadna z Twoich tablic nie zawiera spacji, podczas gdy jedyne return wewnątrz checkExam() występuje po if(array2[j] == ' ').

0

Dlaczego indeksujesz od jedynki?

0

Po pierwsze w js indeks pierwszego elementu tablicy to 0 więc powinieneś zaczynać iterować od 0. Po drugie w twoim rozwiązaniu porównujesz odpowiedź z zadania x z odpowiedzią na zadanie x + 1.
Wystarczy ze zrobisz jedną pętlę i porównasz w niej elementy z tablicy1 i tablicy2.

0

Teraz z kolei napisałem sobie taki kod

function checkExam(array1, array2){
  let score = 0;
  for(let i = 0; i < array2.length; i++){
    if(array2[i] == array1[i]){
      array2[i] = score + 4;
    }else if(array2[i] !== array1[i]){
      array2[i] = score - 1;
    }else if(array2[i] == ''){
      array2[i] = score + 0;
    }
    return score;
  }
}

i zwraca mi tylko 0. Czy te warunki są dobrze napisanie. Sorry za takie trywialne pytanie. Ale jestem początkujący.

1

bo nigdzie nie zwiekszasz score

0

+ zauważ, że return score; znajduje się wewnątrz pętli - oznacza to, że pętla wykona maksymalnie jedną iterację i od razu zrobi return.

0

Teraz jest tak

function checkExam(array1, array2){
  let score;
  for(let i = 0; i < array2.length; i++){
    if(array2[i] == array1[i]){
      array2[i] = score + 4;
    }else if(array2[i] !== array1[i]){
      array2[i] = score - 1;
    }else if(array2[i] == ''){
      array2[i] = score + 0;
    }
  }
  return score;
}

i zwraca undefined

0

Hm, a co - według Ciebie - powinno zwrócić?

0

No już prawie @Patryk27

0

Co to znaczy array2[i] = score + 0?

0

Tutaj jest załącznik jak to wygląda

0

Nie wrzuciłeś całego kodu ;-)

0
function checkExam(array1, array2){
  var score = 0;
  for(let i = 0; i < array2.length; i++){
    if(array2[i] == array1[i]){
       score += 4;
    } else if(array2[i] === ""){
      score -= 0;
    } else if(array2[i] !== array1[i]){
      score -= 1;
    }
  }
  
  if (score < 0)
     return 0;
  return score;
}

masz nie zrobiles zwracania 0 jesli miales ujemny score i nie dales sprawdzania pustego warunku w srodku, bo przestawienie go nizej spowoduje blad :)

0
function checkExam(array1, array2){
  let score = 0;
  for(let i = 0; i < array2.length; i++){
    if(array2[i] == array1[i]){
      score = score + 4
    }else{
      score = score - 1;
    }
  }
  return score;
}

0

Już działa. Dzięki serdeczne wszystkim za pomoc. Najlepsze forum dla programistów.

1
let checkExam = (keys, answers) => { 
    let result = 0;
    for (let i = 0; i < keys.length; ++i)
        answers[i] ? result += keys[i] == answers[i] ? 4 : -1 : 164;
    return result;
}

to niech będzie już choć to a.reduce()

Nie wiedziałem, że w js jest taka metoda ;-) Podoba mi się poziom nieczytelności tego poniżej:

let checkExam = (keys, answers) => keys.reduce((result, key, i) => result + (answers[i] ? answers[i] == key ? 4 : -1 : 0), 0);

Oczywiście to, co tutaj robię to zabawa, w rzeczywistych warunkach użyłbym pierwszej, dłuższej wersji kodu, a punktowanie pojedyńczej odpowiedzi wyrzucił do osobnej, odpowiednio nazwanej funkcji, zaś w niej bez magii tylko grzeczne if/else.

1 użytkowników online, w tym zalogowanych: 0, gości: 1