Skip to content

Commit 2bb9f11

Browse files
committed
L10n fr for exercises on trampoline, async loop and recursion.
1 parent 44a700a commit 2bb9f11

File tree

7 files changed

+191
-7
lines changed

7 files changed

+191
-7
lines changed

exercises/async_loops/exercise.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ module.exports = runner.custom(function(f) {
4242
console.log(submittedUsers)
4343

4444
if (!deepEqual(submittedUsers, users)) {
45-
self.emit('fail', 'expected: \n' + inspect(users) + '\n but got: \n'+ inspect(submittedUsers))
45+
self.emit('fail', self.__('bad_result', inspect(users), inspect(submittedUsers)))
4646
return callback(null, false)
4747
}
4848

49-
console.log('All %d users loaded!', submittedUsers.length)
49+
console.log(self.__('all_loaded', submittedUsers.length))
5050
callback(null, true)
5151
}
5252

5353
fx.call(fx, ids, load, done)
5454
var tooLong = setTimeout(function() {
55-
self.emit('fail', 'Took too long!')
55+
self.emit('fail', self.__('took_too_long'))
5656
callback(null, false)
5757
}, 1000)
5858
}).quiet(users)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
Le code ci-dessous est cassé !
2+
3+
Un développeur Java a ajouté le code atroce ci-dessous à notre projet et ne l’a pas testé !
4+
5+
```js
6+
function loadUsers(userIds, load, done) {
7+
var users = []
8+
for (var i = 0; i < userIds.length; i++) {
9+
users.push(load(userIds[i]))
10+
}
11+
return users
12+
}
13+
14+
module.exports = loadUsers
15+
```
16+
17+
## Défi
18+
19+
Corrigez ce code ! La fonction de rappel `done()` devrait être appelée une fois que tous les utilisateurs ont été chargés. L’ordre des utilisateurs devrait correspondre à celui des IDs reçus. Vu que cette fonction est asynchrone, on se fiche de sa valeur de retour.
20+
21+
## Arguments
22+
23+
* `userIds` : un tableau d’IDs numériques d’utilisateurs.
24+
* `load` : une fonction asynchrone de chargement d’un objet utilisateur. Reçoit un ID et une fonction de rappel. Celle-ci sera appelée avec le résultat du chargement pour l’utilisateur avec l’ID indiqué (soit un objet utilisateur, soit `null`).
25+
* `done` : une fonction de rappel finale, qui attend comme argument un tableau des objets utilisateurs chargés.
26+
27+
## Conditions
28+
29+
* N’utilisez pas de boucles `for`/`while` (mais `Array#forEach()` reste autorisé).
30+
* L’ordre des utilisateurs dans le tableau passé à `done()` doit correspondre à celui des IDs dans le tableau `userIds` que vous aurez reçu.
31+
* Les utilisateurs doivent être chargés en parallèle, donc la séquence entière ne devrait pas dépasser une seconde.
32+
* Ne créez aucune fonction superflue
33+
34+
## Conseils
35+
36+
* Vous n’avez pas besoin d’un tri pour maintenir l’ordre du résultat.
37+
* Si vous utilisez `console.log()`, ça va impacter notre vérification. Ne vous en servez que pendant votre phase de mise au point avec `{appname} run`.
38+
39+
## Base de travail
40+
41+
```js
42+
function loadUsers(userIds, load, done) {
43+
var users = []
44+
for (var i = 0; i < userIds.length; i++) {
45+
users.push(load(userIds[i]))
46+
}
47+
return users
48+
}
49+
50+
module.exports = loadUsers
51+
```

exercises/recursion/problem.fr.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## Défi
2+
3+
Écrivez une fonction récursive qui renvoie toutes les dépendances (et sous-dépendances) unique d’un module, triées alphabétiquement. Elles doivent être affichées au format *dependance@version*, par ex. `inflection@1.2.6`.
4+
5+
On autorise des versions multiples d’un même module, mais les doublons (versions identiques) doivent être retirés.
6+
7+
## Arguments
8+
9+
* `tree` : Une arborescence de dépendances. Voir ci-dessous pour sa structure.
10+
11+
## Exemple
12+
13+
```js
14+
var loremIpsum = {
15+
"name": "lorem-ipsum",
16+
"version": "0.1.1",
17+
"dependencies": {
18+
"optimist": {
19+
"version": "0.3.7",
20+
"dependencies": {
21+
"wordwrap": {
22+
"version": "0.0.2"
23+
}
24+
}
25+
},
26+
"inflection": {
27+
"version": "1.2.6"
28+
}
29+
}
30+
}
31+
32+
getDependencies(loremIpsum) // => [ 'inflection@1.2.6', 'optimist@0.3.7', 'wordwrap@0.0.2' ]
33+
34+
```
35+
36+
## Conditions
37+
38+
* N’utilisez pas de boucle `for`/`while`.
39+
40+
## Base de travail
41+
42+
```js
43+
function getDependencies(tree) {
44+
// VOTRE SOLUTION ICI
45+
// Note : n’hésitez pas à ajouter des arguments dont vous auriez besoin dans
46+
// vos appels récursifs. Mais ça n’a rien d’obligatoire ! Il y a bien des
47+
// manières de faire de la récursivité.
48+
}
49+
50+
module.exports = getDependencies
51+
```
52+
53+
## Ressources
54+
55+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/keys

exercises/trampoline/exercise.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
var runner = require('../runner')
44

5-
module.exports = runner.custom(function(repeat) {
6-
console.log('repeating 100000 times')
5+
var exercise = module.exports = runner.custom(function(repeat) {
6+
var COUNT = 100000
7+
console.log(exercise.__('intro', COUNT))
78
var count = 0
89
repeat(function() {
910
count++
10-
}, 100000)
11-
console.log('Sucessfully executed %d times.', count)
11+
}, COUNT)
12+
console.log(exercise.__('result', count))
1213
}).quiet()

exercises/trampoline/problem.fr.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
La base de travail fournie plus bas contient une définition de `repeat()`. Celle-ci recevra une opération sous forme de `Function`, et un nombre `num`, pour invoquer la fonction `num` fois :
2+
3+
```js
4+
var count = 0
5+
repeat(function() {
6+
count++
7+
}, 100)
8+
9+
console.log('exécuté %d fois.', count)
10+
// => exécuté 100 fois.
11+
```
12+
13+
MAIS vous remarquerez qu’exécuter `repeat()` avec un nombre trop grand de répétitions causera un débordement de pile (*stack overflow*) :
14+
15+
```
16+
var count = 0
17+
repeat(function() {
18+
count++
19+
}, 100000)
20+
21+
console.log('exécuté %d fois', count)
22+
// => RangeError: Maximum call stack size exceeded
23+
```
24+
25+
# Défi
26+
27+
Modifiez la base de travail ci-dessous pour qu’elle utilise un trampoline afin que la fonction s’appelle elle-même continuellement.
28+
29+
Vous pouvez supposer que l’opération qui vous sera fournie ne prend aucun argument (ou qu’ils sont déjà pré-remplis), et que sa valeur de retour est sans importance.
30+
31+
## Conditions
32+
33+
Vos modifications de l’implémentation de `repeat()` ne doivent pas utiliser de boucles ou d’itérateurs (ex. `forEach()`).
34+
35+
## Conseils
36+
37+
- Modifiez `repeat()` pour qu’elle envoie la « prochaine étape », s’il y en a une.
38+
- Un trampoline continue à exécuter les étapes en obtenant à chaque tour la suivante, jusqu’à ce qu’il n’y en ait plus. Pour le coup, vous pouvez utiliser une boucle dans votre fonction de trampoline !
39+
- Si votre programme prend trop de temps à s’exécuter, vous avez probablement un souci. Utilisez Ctrl+C pour arrêter le processus Node.
40+
41+
## Base de travail
42+
43+
```js
44+
function repeat(operation, num) {
45+
// Modifiez ce code pour qu’il ne cause pas de débordement de pile !
46+
if (num <= 0) return
47+
operation()
48+
return repeat(operation, --num)
49+
}
50+
51+
function trampoline(fn) {
52+
// Voilà où implémenter votre trampoline ; une boucle est autorisée ici.
53+
}
54+
55+
module.exports = function(operation, num) {
56+
// Et voilà où vous voudrez sans doute plutôt appeler votre trampoline !
57+
return repeat(operation, num)
58+
}
59+
```

i18n/en.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@
3232
"incorrect_return": "Check your function's return value!",
3333
"incorrect_this": "Check the function's this! Hint: Function#apply",
3434
"not_all_args": "Check you are passing ALL the arguments! Hint: Function#apply"
35+
},
36+
"Trampoline": {
37+
"intro": "repeating %d times",
38+
"result": "Successfully executed %d times."
39+
},
40+
"Async Loops": {
41+
"all_loaded": "All %d users loaded!",
42+
"bad_result": "expected: \n%s\n but got:\n%s",
43+
"took_too_long": "Took too long!"
3544
}
3645
}
3746
}

i18n/fr.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@
5252
"incorrect_return": "Vérifiez la valeur de retour de votre fonction !",
5353
"incorrect_this": "Vérifiez le `this` de votre fonction ! Conseil : `Function#apply()`.",
5454
"not_all_args": "Vérifiez que vous transmettez bien TOUS les arguments ! Conseil : `Function#apply()`."
55+
},
56+
"Trampoline": {
57+
"intro": "Répétition de la fonction %d fois",
58+
"result": "Ai pu exécuter la fonction avec succès %d fois."
59+
},
60+
"Async Loops": {
61+
"all_loaded": "L’ensemble des %d utilisateurs a été chargé !",
62+
"bad_result": "j’attendais : \n%s\n mais j’ai reçu :\n%s",
63+
"took_too_long": "Ça a pris trop longtemps !"
5564
}
5665
}
5766
}

0 commit comments

Comments
 (0)