Sprawdź czy zdałeś

Sprawdź czy zdałeś
P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
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

Kopiuj
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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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] == ' ').

axelbest
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2255
0

Dlaczego indeksujesz od jedynki?

kacor11
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
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.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Teraz z kolei napisałem sobie taki kod

Kopiuj
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.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
1

bo nigdzie nie zwiekszasz score

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Teraz jest tak

Kopiuj
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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

No już prawie @Patryk27

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Tutaj jest załącznik jak to wygląda

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

CH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 449
0
Kopiuj
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 :)

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0
Kopiuj
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;
}

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

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

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.