Sprawdź czy zdałeś

Sprawdź czy zdałeś
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
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
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • 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] == ' ').


edytowany 2x, ostatnio: Patryk27
axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:2 dni
  • Lokalizacja:Warszawa
  • Postów:2251
0

Dlaczego indeksujesz od jedynki?

P1
sorry mój błąd
kacor11
  • Rejestracja:ponad 4 lata
  • Ostatnio:około godziny
  • 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
Czyli mogę wywalić tą pętlę for(let j = i + 1; j < array1.length; j++)
kacor11
Tak, wystarczy, że zrobisz jedną pętlę i porównasz array1[i] i array2[i] i w zależności od tego czy to poprawna odpowiedź czy nie odejmiesz/dodasz odpowiednią wartość.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
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.

axelbest
Zobacz jeszcze jak działa składnia "switch" :)
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

bo nigdzie nie zwiekszasz score

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • 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.


edytowany 3x, ostatnio: Patryk27
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
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
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


edytowany 1x, ostatnio: Patryk27
Zobacz pozostały 1 komentarz
Patryk27
A gdzie modyfikujesz score? (w którym momencie dodajesz / odejmujesz punkty?)
Patryk27
Mógłbyś pokazać która dokładnie instrukcja, według Ciebie, np. zwiększa wynik o cztery?
P1
js if(array2[i] == array1[i]){ array2[i] = score + 4; }
Patryk27
Ta instrukcja liczy wartość wyrażenia score+4, po czym tę wartość zapisuje do tablicy array2. Zmienna score nie jest tutaj modyfikowana. Może chodziło Ci o score+=4?
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
0

No już prawie @Patryk27

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


Zobacz pozostałe 3 komentarze
Patryk27
Nieprawda - co znajduje się tam po lewej stronie operatora =? score czy array2?
Patryk27
No właśnie - a skoro znajduje się tam array2, to dlaczego uważasz, że modyfikowany byłby score? Zresztą cała ta instrukcja jest zbędna - dodawanie zero nie zmienia wyniku, zatem nie potrzeba żadnego score += 0;.
P1
Tylko teraz jest problem tego typu że dla 0 wyświetla mi -4 a dla 7 6. Cały czas próbuje modyfikować ten kod na różne sposoby ale bez efektu
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
0

Tutaj jest załącznik jak to wygląda

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


CH
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • 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 :)

edytowany 1x, ostatnio: chomikowski
Zobacz pozostały 1 komentarz
Patryk27
@piotrek1998: treść zadania wprost mówi: If the score < 0, return 0. :-) Można by to też umieścić w pętli (lub np. dodać sprawdzenie przy score -= 1;), lecz imho na końcu jest czytelniejsze.
CH
w petli nie mozesz bo by ci wyszlo przy pierwszym sprawdzaniu warunku. to ma zwrocic na koncu funkcji,a nie w petli zadnej. to ze chwilowo jest mniej niz 0 nie znaczy ze za 10 pytan wartosc sie nie zwiekszy.
P1
@chomikowski: jasne rozumiem i dzięki
Patryk27
@chomikowski: oczywiście, że można w pętli: if (score < 0) { score = 0; } lub score = Math.max(score, 0);.
CH
@Patryk27: nie programuj lepiej
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
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;
}

CH
Wyzej wkleilem ci rozwiazanie
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:25 dni
  • Postów:639
0

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

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:6 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.


edytowany 4x, ostatnio: ŁF
Patryk27
[...] and +0 for each blank answer (https://www.codewars.com/kata/5a3dd29055519e23ec000074/train/javascript); plus jak już się popisywać, to niech będzie już choć to a.reduce() :-)
CH
@ŁF ten kod nadaje się do śmieci nie przejdzie przynajmniej dwóch warunków :) gdzie niby na dzien dorby zwracasz 0 jesli wynik ujemny ? i czemu odejmujesz wynik jak masz pusta odpowiedz i powinienes nie robic nic czyli dodac lub odjac 0 ? buahahah wy moderatorzy nie powinniscie porogramowac. zdecydowanie
ŁF
Toż żaden z nas nie potrafi w ogóle programować ;-)

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.