-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Loops: while and for #75
base: master
Are you sure you want to change the base?
Changes from 10 commits
04ea0ba
1adcfac
b6729e7
aa4c2fe
13c4805
b04d24e
039f50e
f8e70d6
3139b59
0614e86
0b880d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,30 +1,30 @@ | ||
The task demonstrates how postfix/prefix forms can lead to different results when used in comparisons. | ||
Zadanie pokazuje, w jaki sposób formy postfix/prefix mogą prowadzić do różnych wyników w przypadku ich wykorzystania w porównaniach. | ||
|
||
1. **From 1 to 4** | ||
1. **Od 1 do 4** | ||
|
||
```js run | ||
let i = 0; | ||
while (++i < 5) alert( i ); | ||
``` | ||
|
||
The first value is `i = 1`, because `++i` first increments `i` and then returns the new value. So the first comparison is `1 < 5` and the `alert` shows `1`. | ||
Pierwszą wartością jest `i = 1`, ponieważ `++i` najpierw powiększy `i`, a następnie zwraca nową wartość. Tak więc pierwsze porównanie jest `1 < 5`, a `alert` pokazuje `1`. | ||
|
||
Then follow `2, 3, 4…` -- the values show up one after another. The comparison always uses the incremented value, because `++` is before the variable. | ||
Następnie podążając `2, 3, 4...` -- wartości pojawiają się jedna po drugiej. Porównanie zawsze używa zwiększonej wartości, ponieważ `++` jest przed zmienną. | ||
|
||
Finally, `i = 4` is incremented to `5`, the comparison `while(5 < 5)` fails, and the loop stops. So `5` is not shown. | ||
2. **From 1 to 5** | ||
W końcu, `i = 4` jest zwiększone do `5`, porównanie `while(5 < 5)` zawodzi, a pętla się zatrzymuje. Tak więc `5` nie jest pokazane. | ||
2. **Od 1 do 5** | ||
|
||
```js run | ||
let i = 0; | ||
while (i++ < 5) alert( i ); | ||
``` | ||
|
||
The first value is again `i = 1`. The postfix form of `i++` increments `i` and then returns the *old* value, so the comparison `i++ < 5` will use `i = 0` (contrary to `++i < 5`). | ||
Pierwszą wartością jest ponownie `i = 1`. Przyrostkowa forma `i++` zwiększa `i`, a następnie zwraca *starą* wartość, więc porównanie `i++ < 5` użyje `i = 0` (w przeciwieństwie do `++i < 5`). | ||
|
||
But the `alert` call is separate. It's another statement which executes after the increment and the comparison. So it gets the current `i = 1`. | ||
Ale zawołanie `alert` jest osobne. Jest to kolejna stwierdzenie, która wykonuje się po inkrementacji i porównaniu. Więc dostaje bieżący `i = 1`. | ||
|
||
Then follow `2, 3, 4…` | ||
Potem kolejno `2, 3, 4…` | ||
|
||
Let's stop on `i = 4`. The prefix form `++i` would increment it and use `5` in the comparison. But here we have the postfix form `i++`. So it increments `i` to `5`, but returns the old value. Hence the comparison is actually `while(4 < 5)` -- true, and the control goes on to `alert`. | ||
Zatrzymajmy się na `i = 4`. Forma prefiksu `++i` zwiększyłaby go i użyła `5` w porównaniu. Ale tutaj mamy formę przyrostkową `i++`. Zwiększa więc `i` do `5`, ale zwraca starą wartość. Stąd porównanie `while(4 < 5)` jest prawdziwe, a kontrola przechodzi do `alert`. | ||
|
||
The value `i = 5` is the last one, because on the next step `while(5 < 5)` is false. | ||
Wartość `i = 5` jest ostatnią, ponieważ w następnym kroku `while(5 < 5)` jest fałszywe. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,20 @@ | ||
importance: 4 | ||
ważność: 4 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Which values does the while loop show? | ||
# Jakie wartości pokazuje pętla while? | ||
|
||
For every loop iteration, write down which value it outputs and then compare it with the solution. | ||
Dla każdej iteracji pętli zapisz, jaką wartość ona generuje, a następnie porównaj ją z rozwiązaniem. | ||
|
||
Both loops `alert` the same values, or not? | ||
Obie pętle ogłoszą (`alert`) te same wartości, czy nie? | ||
|
||
1. The prefix form `++i`: | ||
1. Forma prefiksowa `++i`: | ||
|
||
```js | ||
let i = 0; | ||
while (++i < 5) alert( i ); | ||
``` | ||
2. The postfix form `i++` | ||
2. Forma przyrostkowa (postfix) `i++` | ||
|
||
```js | ||
let i = 0; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,16 @@ | ||
**The answer: from `0` to `4` in both cases.** | ||
**Odpowiedź: od `0` do `4` w obu przypadkach.** | ||
|
||
```js run | ||
for (let i = 0; i < 5; ++i) alert( i ); | ||
|
||
for (let i = 0; i < 5; i++) alert( i ); | ||
``` | ||
|
||
That can be easily deducted from the algorithm of `for`: | ||
Można to łatwo odczytać z algorytmu `for`: | ||
|
||
1. Execute once `i = 0` before everything (begin). | ||
2. Check the condition `i < 5` | ||
3. If `true` -- execute the loop body `alert(i)`, and then `i++` | ||
1. Wykonać raz `i = 0` przed wszystkim (początek). | ||
2. Sprawdzić warunek `i < 5` | ||
3. jeśli `true` -- wykonaj ciało pętli `alert(i)`, a potem `i++` | ||
|
||
The increment `i++` is separated from the condition check (2). That's just another statement. | ||
|
||
The value returned by the increment is not used here, so there's no difference between `i++` and `++i`. | ||
Przyrost `i++` jest oddzielony od sprawdzenia warunku (2). To tylko kolejne stwierdzenie. | ||
Wartość zwracana przez przyrost nie jest tutaj używana, więc nie ma różnicy między `i++` a `++i`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a blank line between line 15 and 16 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,19 @@ | ||
importance: 4 | ||
ważność: 4 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Which values get shown by the "for" loop? | ||
# Jakie wartości pokazuje pętla "for"? | ||
|
||
For each loop write down which values it is going to show. Then compare with the answer. | ||
Dla każdej pętli zapisz, jakie wartości ma ona pokazywać. Następnie porównaj z odpowiedzią. | ||
|
||
Both loops `alert` same values or not? | ||
Obie pętle ogłaszają (`alert`) te same wartości, czy nie? | ||
|
||
1. The postfix form: | ||
1. Forma przyrostkowa: | ||
|
||
```js | ||
for (let i = 0; i < 5; i++) alert( i ); | ||
``` | ||
2. The prefix form: | ||
2. Forma prefixowa: | ||
|
||
```js | ||
for (let i = 0; i < 5; ++i) alert( i ); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,9 @@ | ||
importance: 5 | ||
ważność: 5 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Output even numbers in the loop | ||
# Zwróć numery parzyste w pętli | ||
|
||
Use the `for` loop to output even numbers from `2` to `10`. | ||
Użyj pętli `for` do wyprowadzenia parzystych liczb od `2` do `10`. | ||
|
||
[demo] |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ | |
```js run | ||
let i = 0; | ||
while (i < 3) { | ||
alert( `number ${i}!` ); | ||
alert( `liczba ${i}!` ); | ||
i++; | ||
} | ||
``` | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,14 @@ | ||
importance: 5 | ||
ważność: 5 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Replace "for" with "while" | ||
# Zastąp "for" pętlą "while" | ||
|
||
Rewrite the code changing the `for` loop to `while` without altering its behavior (the output should stay same). | ||
Przepisz ponownie kod zmieniając pętlę `for` na `while` bez zmiany jej zachowania (wyjście powinno pozostać takie samo). | ||
|
||
```js run | ||
for (let i = 0; i < 3; i++) { | ||
alert( `number ${i}!` ); | ||
alert( `liczba ${i}!` ); | ||
} | ||
``` | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,13 @@ | ||
importance: 5 | ||
ważność: 5 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Repeat until the input is correct | ||
# Powtarzaj do momentu, aż wejście będzie prawidłowe | ||
|
||
Write a loop which prompts for a number greater than `100`. If the visitor enters another number -- ask them to input again. | ||
Napisz pętlę, która pyta o liczbę większą niż `100`. Jeśli odwiedzający wprowadzi inną liczbę - poproś go o jej ponowne wprowadzenie. | ||
|
||
The loop must ask for a number until either the visitor enters a number greater than `100` or cancels the input/enters an empty line. | ||
Pętla musi pytać o liczbę, dopóki użytkownik nie wprowadzi liczby większej niż `100` lub nie anuluje wejścia/wprowadzi pustą linię. | ||
|
||
Here we can assume that the visitor only inputs numbers. There's no need to implement a special handling for a non-numeric input in this task. | ||
Tutaj możemy założyć, że odwiedzający wprowadza tylko numery. Nie ma potrzeby implementowania specjalnej obsługi dla nie-numerycznych danych wejściowych w tym zadaniu. | ||
|
||
[demo] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,29 @@ | ||
There are many algorithms for this task. | ||
Istnieje wiele algorytmów dla tego zadania. | ||
|
||
Let's use a nested loop: | ||
Użyjmy pętli zagnieżdżonej: | ||
|
||
```js | ||
For each i in the interval { | ||
check if i has a divisor from 1..i | ||
if yes => the value is not a prime | ||
if no => the value is a prime, show it | ||
Dla każdego i w przedziale { | ||
sprawdź jeśli i ma dzielnik od 1..i | ||
jeśli tak => wartość nie jest liczbą pierwszą | ||
jeśli nie => wartość jest liczbą pierwszą, pokaż ją | ||
} | ||
``` | ||
|
||
The code using a label: | ||
Kod używając etykiety: | ||
|
||
```js run | ||
let n = 10; | ||
|
||
nextPrime: | ||
for (let i = 2; i <= n; i++) { // for each i... | ||
for (let i = 2; i <= n; i++) { // dla każdego i... | ||
|
||
for (let j = 2; j < i; j++) { // look for a divisor.. | ||
if (i % j == 0) continue nextPrime; // not a prime, go next i | ||
for (let j = 2; j < i; j++) { // szukaj dziewlnika.. | ||
if (i % j == 0) continue nextPrime; // nie liczba pierwsza idź do następnego i | ||
} | ||
|
||
alert( i ); // a prime | ||
alert( i ); // liczba pierwsza | ||
} | ||
``` | ||
|
||
There's a lot of space to optimize it. For instance, we could look for the divisors from `2` to square root of `i`. But anyway, if we want to be really efficient for large intervals, we need to change the approach and rely on advanced maths and complex algorithms like [Quadratic sieve](https://en.wikipedia.org/wiki/Quadratic_sieve), [General number field sieve](https://en.wikipedia.org/wiki/General_number_field_sieve) etc. | ||
Jest dużo miejsca na optymalizację. Na przykład, możemy szukać dzielników od `2` do pierwiastka kwadratowego `i`. Ale tak czy inaczej, jeśli chcemy być naprawdę wydajni w dużych odstępach czasu, musimy zmienić podejście i polegać na zaawansowanych matematykach i złożonych algorytmach, takich jak [Sito kwadratowe](https://pl.wikipedia.org/wiki/Sito_kwadratowe), [Ogólne sito ciała liczbowego](https://pl.wikipedia.org/wiki/GNFS) itd. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,17 @@ | ||
importance: 3 | ||
ważność: 3 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please do not translate YAML metadata |
||
|
||
--- | ||
|
||
# Output prime numbers | ||
# Zwróć liczby pierwsze | ||
|
||
An integer number greater than `1` is called a [prime](https://en.wikipedia.org/wiki/Prime_number) if it cannot be divided without a remainder by anything except `1` and itself. | ||
Liczba całkowita większa od `1` nazywana jest [liczbą pierwszą](https://pl.wikipedia.org/wiki/Liczba_pierwsza), jeśli nie może być podzielona bez reszty przez nic poza `1` i samą siebie. | ||
|
||
In other words, `n > 1` is a prime if it can't be evenly divided by anything except `1` and `n`. | ||
Innymi słowy, `n > 1` jest liczbą pierwszą, jeśli nie można jej równo podzielić przez nic poza `1` i `n`. | ||
|
||
For example, `5` is a prime, because it cannot be divided without a remainder by `2`, `3` and `4`. | ||
Na przykład, `5` jest liczbą pierwszą, ponieważ nie można jej podzielić bez reszty przez `2`, `3` i `4`. | ||
|
||
**Write the code which outputs prime numbers in the interval from `2` to `n`.** | ||
**Napisz kod, który wyprowadza liczby pierwsze w przedziale od `2` do `n`.** | ||
|
||
For `n = 10` the result will be `2,3,5,7`. | ||
Dla `n = 10` wynik będzie `2,3,5,7`. | ||
|
||
P.S. The code should work for any `n`, not be hard-tuned for any fixed value. | ||
P.S. Kod powinien działać dla każdego `n`, nie powinien być dostosowany na stałe do żadnej wartości. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please do not translate YAML metadata