Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions 1-js/05-data-types/02-number/1-sum-interface/solution.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@


```js run demo
let a = +prompt("The first number?", "");
let b = +prompt("The second number?", "");
let a = +prompt("Det første tal?", "");
let b = +prompt("Det andet tal?", "");

alert( a + b );
```

Note the unary plus `+` before `prompt`. It immediately converts the value to a number.
Bemærk det unære plus `+` før `prompt`. Det konverterer straks værdien til et tal.

Otherwise, `a` and `b` would be string their sum would be their concatenation, that is: `"1" + "2" = "12"`.
Ellers ville `a` og `b` være strenge, og deres sum ville være deres sammenkædning, det vil sige: `"1" + "2" = "12"`.
6 changes: 3 additions & 3 deletions 1-js/05-data-types/02-number/1-sum-interface/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ importance: 5

---

# Sum numbers from the visitor
# Læg to tal sammen fra brugeren

Create a script that prompts the visitor to enter two numbers and then shows their sum.
Opret et script, der beder brugeren om at indtaste to tal og derefter viser deres sum.

[demo]

P.S. There is a gotcha with types.
P.S. Der er en lille detalje med datatyper.
18 changes: 9 additions & 9 deletions 1-js/05-data-types/02-number/2-why-rounded-down/solution.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
Internally the decimal fraction `6.35` is an endless binary. As always in such cases, it is stored with a precision loss.
Internt er decimalbrøken `6.35` en uendelig binær. Som altid i sådanne tilfælde gemmes den med et præcisionstab.

Let's see:
Lad os se:

```js run
alert( 6.35.toFixed(20) ); // 6.34999999999999964473
```

The precision loss can cause both increase and decrease of a number. In this particular case the number becomes a tiny bit less, that's why it rounded down.
Præcisionstab kan forårsage både stigning og fald i et tal. I dette særlige tilfælde bliver tallet en smule mindre, derfor blev det afrundet nedad.

And what's for `1.35`?
Og hvad med `1.35`?

```js run
alert( 1.35.toFixed(20) ); // 1.35000000000000008882
```

Here the precision loss made the number a little bit greater, so it rounded up.
Her gjorde præcisionstabet tallet en smule større, så det blev afrundet opad.

**How can we fix the problem with `6.35` if we want it to be rounded the right way?**
**Hvordan kan vi løse problemet med `6.35`, hvis vi vil have det afrundet korrekt?**

We should bring it closer to an integer prior to rounding:
Vi bør bringe det tættere på et helt tal før afrunding:

```js run
alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000
```

Note that `63.5` has no precision loss at all. That's because the decimal part `0.5` is actually `1/2`. Fractions divided by powers of `2` are exactly represented in the binary system, now we can round it:
Bemærk at `63.5` slet ikke har noget præcisionstab. Det skyldes, at decimaldelen `0.5` faktisk er `1/2`. Brøker divideret med potenser af `2` er nøjagtigt repræsenteret i det binære system, nu kan vi runde det korrekt:


```js run
alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(rounded) -> 6.4
alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(afrundet) -> 6.4
```

10 changes: 5 additions & 5 deletions 1-js/05-data-types/02-number/2-why-rounded-down/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@ importance: 4

---

# Why 6.35.toFixed(1) == 6.3?
# Hvorfor er 6.35.toFixed(1) == 6.3?

According to the documentation `Math.round` and `toFixed` both round to the nearest number: `0..4` lead down while `5..9` lead up.
Ifølge dokumentationen afrunder både `Math.round` og `toFixed` til det nærmeste tal: `0..4` runder ned, mens `5..9` runder op.

For instance:
For eksempel:

```js run
alert( 1.35.toFixed(1) ); // 1.4
```

In the similar example below, why is `6.35` rounded to `6.3`, not `6.4`?
I det lignende eksempel nedenfor, hvorfor afrundes `6.35` til `6.3` og ikke `6.4`?

```js run
alert( 6.35.toFixed(1) ); // 6.3
```

How to round `6.35` the right way?
Hvordan kan vi runde `6.35` korrekt?

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ function readNumber() {
let num;

do {
num = prompt("Enter a number please?", 0);
num = prompt("Indtast et tal, tak", 0);
} while ( !isFinite(num) );

if (num === null || num === '') return null;
Expand Down
20 changes: 10 additions & 10 deletions 1-js/05-data-types/02-number/3-repeat-until-number/_js.view/test.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
beforeEach(function() {
beforeEach(function () {
sinon.stub(window, "prompt");
});

afterEach(function() {
afterEach(function () {
prompt.restore();
});

describe("readNumber", function() {
describe("readNumber", function () {

it("if a number, returns it", function() {
it("hvis et tal, returnerer det", function () {
prompt.returns("123");
assert.strictEqual(readNumber(), 123);
});

it("if 0, returns it", function() {
it("hvis 0, returnerer det", function () {
prompt.returns("0");
assert.strictEqual(readNumber(), 0);
});

it("continues the loop until meets a number", function() {
prompt.onCall(0).returns("not a number");
prompt.onCall(1).returns("not a number again");
it("fortsætter løkken indtil et tal indtastes", function () {
prompt.onCall(0).returns("ikke et tal");
prompt.onCall(1).returns("ikke et tal igen");
prompt.onCall(2).returns("1");
assert.strictEqual(readNumber(), 1);
});

it("if an empty line, returns null", function() {
it("hvis en tom linje, returnerer null", function () {
prompt.returns("");
assert.isNull(readNumber());
});

it("if cancel, returns null", function() {
it("hvis annuller, returnerer null", function () {
prompt.returns(null);
assert.isNull(readNumber());
});
Expand Down
10 changes: 5 additions & 5 deletions 1-js/05-data-types/02-number/3-repeat-until-number/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ function readNumber() {
let num;

do {
num = prompt("Enter a number please?", 0);
num = prompt("Indtast et tal, tak", 0);
} while ( !isFinite(num) );

if (num === null || num === '') return null;

return +num;
}

alert(`Read: ${readNumber()}`);
alert(`Indtastet: ${readNumber()}`);
```

The solution is a little bit more intricate that it could be because we need to handle `null`/empty lines.
Løsningen er lidt mere indviklet, end den kunne være, fordi vi skal håndtere `null`/tomme linjer.

So we actually accept the input until it is a "regular number". Both `null` (cancel) and empty line also fit that condition, because in numeric form they are `0`.
Så vi bliver ved med at acceptere input, indtil det er et "almindeligt tal". Både `null` (annuller) og tomme linjer passer også til den betingelse, fordi de i numerisk form er `0`.

After we stopped, we need to treat `null` and empty line specially (return `null`), because converting them to a number would return `0`.
Efter vi er stoppet, skal vi behandle `null` og tomme linjer specielt (returnere `null`), fordi konvertering til et tal ville returnere `0`.

8 changes: 4 additions & 4 deletions 1-js/05-data-types/02-number/3-repeat-until-number/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ importance: 5

---

# Repeat until the input is a number
# Gentag indtil input er et tal

Create a function `readNumber` which prompts for a number until the visitor enters a valid numeric value.
Opret en funktion `readNumber`, som beder om et tal, indtil brugeren indtaster en gyldig numerisk værdi.

The resulting value must be returned as a number.
Den resulterende værdi skal returneres som et tal.

The visitor can also stop the process by entering an empty line or pressing "CANCEL". In that case, the function should return `null`.
Brugeren kan også stoppe processen ved at indtaste en tom linje eller trykke på "ANNULLER". I så fald skal funktionen returnere `null`.

[demo]

10 changes: 5 additions & 5 deletions 1-js/05-data-types/02-number/4-endless-loop-error/solution.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
That's because `i` would never equal `10`.
Det er fordi `i` aldrig ville være præcis `10`.

Run it to see the *real* values of `i`:
Kør det for at se de *rigtige* værdier af `i`:

```js run
let i = 0;
Expand All @@ -10,8 +10,8 @@ while (i < 11) {
}
```

None of them is exactly `10`.
Ingen af dem er præcis `10`.

Such things happen because of the precision losses when adding fractions like `0.2`.
Sådanne ting sker på grund af præcisionstab, når man lægger brøker som `0.2` sammen.

Conclusion: evade equality checks when working with decimal fractions.
Konklusion: undgå lighedschecks, når du arbejder med decimale brøker.
4 changes: 2 additions & 2 deletions 1-js/05-data-types/02-number/4-endless-loop-error/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 4

---

# An occasional infinite loop
# En lejlighedsvist uendeligt løkke

This loop is infinite. It never ends. Why?
Denne løkke er uendelig. Den slutter aldrig. Hvorfor?

```js
let i = 0;
Expand Down
10 changes: 5 additions & 5 deletions 1-js/05-data-types/02-number/8-random-min-max/solution.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
We need to "map" all values from the interval 0..1 into values from `min` to `max`.
Vi skal "mappe" alle værdier fra intervallet 0..1 til værdier fra `min` til `max`.

That can be done in two stages:
Det kan gøres i to trin:

1. If we multiply a random number from 0..1 by `max-min`, then the interval of possible values increases `0..1` to `0..max-min`.
2. Now if we add `min`, the possible interval becomes from `min` to `max`.
1. Hvis vi ganger et tilfældigt tal fra 0..1 med `max-min`, så øges intervallet af mulige værdier fra `0..1` til `0..max-min`.
2. Nu, hvis vi lægger `min` til, bliver det mulige interval fra `min` til `max`.

The function:
Funktionen:

```js run
function random(min, max) {
Expand Down
8 changes: 4 additions & 4 deletions 1-js/05-data-types/02-number/8-random-min-max/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ importance: 2

---

# A random number from min to max
# Et tilfældigt tal fra min til max

The built-in function `Math.random()` creates a random value from `0` to `1` (not including `1`).
Den indbyggede funktion `Math.random()` skaber en tilfældig værdi fra `0` til `1` (inklusive `0`, men ikke `1`).

Write the function `random(min, max)` to generate a random floating-point number from `min` to `max` (not including `max`).
Skriv funktionen `random(min, max)` for at generere et tilfældigt flydende tal fra `min` til `max` (inklusive `min`, men ikke `max`).

Examples of its work:
Eksempler på hvordan den skal virke:

```js
alert( random(1, 5) ); // 1.2345623452
Expand Down
26 changes: 13 additions & 13 deletions 1-js/05-data-types/02-number/9-random-int-min-max/solution.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# The simple but wrong solution
# Den simple, men forkerte løsning

The simplest, but wrong solution would be to generate a value from `min` to `max` and round it:
Den simpleste, men forkerte løsning ville være at generere en værdi fra `min` til `max` og runde den:

```js run
function randomInteger(min, max) {
Expand All @@ -11,28 +11,28 @@ function randomInteger(min, max) {
alert( randomInteger(1, 3) );
```

The function works, but it is incorrect. The probability to get edge values `min` and `max` is two times less than any other.
Funktionen virker, men den er forkert. Sandsynligheden for at få kantværdierne `min` og `max` er to gange mindre end for alle andre.

If you run the example above many times, you would easily see that `2` appears the most often.
Hvis du kører eksemplet ovenfor mange gange, vil du nemt se, at `2` optræder oftest.

That happens because `Math.round()` gets random numbers from the interval `1..3` and rounds them as follows:
Det sker, fordi `Math.round()` får tilfældige tal fra intervallet `1..3` og runder dem som følger:

```js no-beautify
values from 1 ... to 1.4999999999 become 1
values from 1.5 ... to 2.4999999999 become 2
values from 2.5 ... to 2.9999999999 become 3
```

Now we can clearly see that `1` gets twice less values than `2`. And the same with `3`.
Nu kan vi tydeligt se, at `1` får halvt så mange værdier som `2`. Det samme gælder for `3`.

# The correct solution
# Den korrekte løsning

There are many correct solutions to the task. One of them is to adjust interval borders. To ensure the same intervals, we can generate values from `0.5 to 3.5`, thus adding the required probabilities to the edges:
Der er mange korrekte løsninger på opgaven. En af dem er at justere intervalgrænserne. For at sikre de samme intervaller kan vi generere værdier fra `0.5 til 3.5`, og dermed tilføje de nødvendige sandsynligheder til kanterne:

```js run
*!*
function randomInteger(min, max) {
// now rand is from (min-0.5) to (max+0.5)
// Nu er rand fra (min-0.5) til (max+0.5)
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
Expand All @@ -41,12 +41,12 @@ function randomInteger(min, max) {
alert( randomInteger(1, 3) );
```

An alternative way could be to use `Math.floor` for a random number from `min` to `max+1`:
En alternativ måde kunne være at bruge `Math.floor` for et tilfældigt tal fra `min` til `max+1`:

```js run
*!*
function randomInteger(min, max) {
// here rand is from min to (max+1)
// her er rand fra min til (max+1)
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
Expand All @@ -55,12 +55,12 @@ function randomInteger(min, max) {
alert( randomInteger(1, 3) );
```

Now all intervals are mapped this way:
Nu er alle intervaller mappet på denne måde:

```js no-beautify
values from 1 ... to 1.9999999999 become 1
values from 2 ... to 2.9999999999 become 2
values from 3 ... to 3.9999999999 become 3
```

All intervals have the same length, making the final distribution uniform.
Alle intervaller har samme længde, hvilket gør den endelige fordeling ensartet.
10 changes: 5 additions & 5 deletions 1-js/05-data-types/02-number/9-random-int-min-max/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ importance: 2

---

# A random integer from min to max
# Et tilfældigt heltal fra min til max

Create a function `randomInteger(min, max)` that generates a random *integer* number from `min` to `max` including both `min` and `max` as possible values.
Skriv en funktion `randomInteger(min, max)` der genererer et tilfældigt *heltal* fra `min` til `max` inklusive både `min` og `max` som mulige værdier.

Any number from the interval `min..max` must appear with the same probability.
Enhver værdi fra intervallet `min..max` skal have samme sandsynlighed.


Examples of its work:
Eksempler på hvordan den skal virke:

```js
alert( randomInteger(1, 5) ); // 1
alert( randomInteger(1, 5) ); // 3
alert( randomInteger(1, 5) ); // 5
```

You can use the solution of the [previous task](info:task/random-min-max) as the base.
Du kan bruge løsningen fra [forrige opgave](info:task/random-min-max) som base.
Loading