Znaleźć liczby z zadanego zakresu

0

Robię zadanie na code wars https://www.codewars.com/kata/55eca815d0d20962e1000106/train/javascript i muszę znaleźć liczby z danego zakresu z uwzględnieniem skoku. Napisałem taki kod

function generateRange(min,max,step){
	let num = [];
	for(let i = min; i <= max; i++){
		if((i + 2) % step === 0){
			num.push(i);
		}
	}
	return num;
}

i np. jak mam przy wywołaniu funkcji (2,10,2) to mi normalnie działa ta funkcja i wypisuje liczby 2,4,6,8,10 ale np. jak powinny mi się pojawić np. takie liczby 1, 5, 9 to mi się pojawia coś takiego 2, 6, 10 i już nie bardzo mam pomysł co może być źle

4

Na pewno chcesz tam i + 2?

0

No wolałbym napisać i%step===0 i mieć problemy z głowy ale to nie jest takie proste

3

Takie sugestia. Rozpisz sobie to zadanie na kartce i spróbuj stworzyć jakiś algorytm, wg którego stworzył byś taką tablicę.

Przykład:
generateRange(1,9,4)
czyli zacznij od 1, skończ na 9 i "skacz" co 4
czyli rozpisując to na kartce mamy:
1
1+4 = 5
5+4 = 9
[1,5,9]

Gdzie tutaj widzisz sprawdzanie każdej cyfry w zakresie <1,9> ?
Tak samo ten if jest bez sensu - przecież nigdzie nie jest napisane, że reszta dzielenia liczby o 2 większej od aktualnie sprawdzanej ma być równa 0. Skąd w ogóle ten pomysł?

Popatrz na ten kod i może znajdziesz w nim analogie do wyżej rozpisanego przykładu

for(let i = min; i <= max; i+=step){
   num.push(i);
}
1

Ok, spróbujmy nie orać twojego rozwiązania tylko je naprawić (to podejście nie jest delikatnie mówiąc najwydajniejsze, bo wykonujesz zawsze max - min iteracji niezależnie od wielkości kroku).

Zacznijmy od tego, że warunek:

(i + 2) % step === 0

jest bez sensu - skąd ta dwójka?

Pomijając to, trop, że

 i % step === 0

jest krokiem w dobrym kierunku jest słuszny. Działa on dla wszystkich zakresów, jeśli wartość początkowa jest równa 0. Problem zaczyna się, gdy wartość początkowa > 0 - wszystko się przesuwa. O ile się przesuwa? Ano o wartość początkową. A jakby tak zniwelować to przesunięcie w warunku? Trzeba by pewnie coś odjąć od bieżącej wartości zanim sprawdzimy resztę z dzielenia...

Można też do tego podejść w inny sposób (może nawet bardziej intuicyjny) - potraktujmy całą iterację jakby zaczynała się od zera. Jeśli pierwsza wartość w petli będzie równa 0, to ostatnia wartość nie będzie max, ale taką wartością by długość zakresu była taka sama jak od min do max. Teraz możemy sobie bezpiecznie użyć warunku i % step === 0. Pozostaje tylko jedna kwestia - trzebaby coś dodać teraz do każdej wartości pushowanej do tablicy.

Spoiler: CodePen

PS
Optymalne rozwiązanie masz post wyżej.

0

Ok dzięki wszystkim za pomoc

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