Skip to content

Commit 89c4fe7

Browse files
committed
L10n fr for the remainder of 'basics' exercises
1 parent 4201fc4 commit 89c4fe7

File tree

6 files changed

+192
-7
lines changed

6 files changed

+192
-7
lines changed

exercises/basic_call/exercise.js

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

33
var random = require('../randomizer')
44
var runner = require('../runner')
5-
var util = require('util')
65

76
var input = random.arrayOfInts(20, 0, 10)
87

9-
module.exports = runner.custom(function(fx, numbers) {
8+
var exercise = module.exports = runner.custom(function(fx, numbers) {
109
var valid = 1
1110
var objects = [{quack: true}].concat(numbers.map(function(num) {
1211
switch(num) {
@@ -54,5 +53,5 @@ module.exports = runner.custom(function(fx, numbers) {
5453
}
5554
}))
5655

57-
return util.format('Matched %d of %d valid objects from %d total.', fx.apply(null, objects), valid, objects.length)
58-
})(input)
56+
return exercise.__('matched_objects', fx.apply(null, objects), valid, objects.length)
57+
}).hideInput(input)

exercises/basic_call/problem.fr.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
JavaScript implémente le « duck typing ». On désigne ainsi un style de typage dynamique dans lequel ce sont les méthodes et propriétés d’un objet qui déterminent sa sémantique, plutôt que de se baser sur l’héritage d’une classe particulière ou l’implémentation d’une interface donnée. Le nom de ce concept vient du « test du canard », attribué à James Whitcomb Riley, qu’on peut formuler ainsi :
2+
3+
> « Quand je vois un volatile qui marche comme un canard, nage comme un canard, et cancane comme un canard, alors j’appelle ce volatile un canard. »
4+
5+
En JavaScript, pour écrire des programmes robustes, nous avons parfois besoin de vérifier qu’un objet est conforme au type dont nous avons besoin.
6+
7+
Nous pouvons utiliser `Object#hasOwnProperty()` pour détecter qu’un objet « a » une propriété définie sur lui-même, ce qu’on appelle une *propriété propre* (par opposition à une propriété hérité du prototype) :
8+
9+
```js
10+
var duck = {
11+
quack: function() {
12+
console.log('quack')
13+
}
14+
}
15+
16+
duck.hasOwnProperty('quack') // => true
17+
```
18+
19+
Nous n’avons toutefois pas équipé `duck` d’une méthode `hasOwnProperty()`, alors d’où vient-elle ?
20+
21+
`duck` a été créé avec la syntaxe littérale `{…}`, qui définit un objet, de sorte qu’il hérite automatiquement de `Object.prototype` :
22+
23+
```js
24+
var object = {quack: true}
25+
26+
Object.getPrototypeOf(object) === Object.prototype // => true
27+
object.hasOwnProperty('quack') // => true
28+
```
29+
30+
Mais qu’en serait-il pour un objet qui n’hérite pas de `Object.prototype` ?
31+
32+
```js
33+
// Créons un objet avec un prototype `null`
34+
var object = Object.create(null)
35+
object.quack = function() {
36+
console.log('quack')
37+
}
38+
39+
Object.getPrototypeOf(object) === Object.prototype // => false
40+
Object.getPrototypeOf(object) === null // => true
41+
42+
object.hasOwnProperty('quack')
43+
// => TypeError: Object object has no method 'hasOwnProperty'
44+
```
45+
46+
Nous pouvons toujours appeler la `hasOwnProperty()` de `Object.prototype`, ceci dit, du moment que nous l’appelons avec un `this` qui « ressemble à un objet ». `Function#call` nous permet d’appeler n’importe quelle fonction avec un `this` que nous contrôlons.
47+
48+
```js
49+
// Le premier argument de `call` sera le `this`
50+
// Le reste des arguments est passé à la fonction
51+
52+
Object.prototype.hasOwnProperty.call(object, 'quack') // => true
53+
```
54+
55+
# Défi
56+
57+
Écrivez une fonction `duckCount()` qui inspecte les arguments qu’on lui passe et renvoie le nombre de ceux qui ont une propriété propre `quack` définie. Ignorez les propriétés hérités des prototypes.
58+
59+
Exemple :
60+
61+
```js
62+
var notDuck = Object.create({quack: true})
63+
var duck = {quack: true}
64+
duckCount(duck, notDuck) // 1
65+
```
66+
## Arguments
67+
68+
Vous recevrez un nombre variable d’arguments, d’un appel à l’autre. Chaque argument pourra être d’un type quelconque, avec des propriétés quelconques. Certains arguments auront une propriété `quack`, parfois héritée du prototype. Certains pourrons ne pas être équipés de `hasOwnProperty()`.
69+
70+
## Conditions
71+
72+
* N’utilisez ni boucle (`for`, `while`…) ni `Array.prototype.forEach`
73+
* Ne maintenez pas de variable pour le compteur / l’accumulateur.
74+
* Ne créez aucune fonction superflue
75+
76+
## Conseil
77+
78+
La variable automatique `arguments`, disponible dans toute fonction, est un *objet* qui ressemble à un tableau sans en être vraiment un :
79+
80+
```js
81+
{
82+
0: 'argument0',
83+
1: 'argument1', // etc.
84+
length: 2
85+
}
86+
```
87+
88+
## Ressources
89+
90+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/call
91+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/hasOwnProperty
92+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Op%C3%A9rateurs/L_op%C3%A9rateur_in
93+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/slice#Array-like
94+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Fonctions/arguments
95+
96+
## Base de travail
97+
98+
```js
99+
function duckCount() {
100+
// VOTRE SOLUTION ICI
101+
}
102+
103+
module.exports = duckCount
104+
```
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
La récursivité est un concept fondamental de programmation qui peut apporter des solutions élégantes et efficaces à des problèmes algorithmiques. En fait, la récursivité est si puissante que tous les comportements itératifs peuvent être définis sous forme de fonctions récursives. Vous la trouverez particulièrement indispensable lorsque vous parcourrez des structures de données imbriquées.
2+
3+
Une fonction récursive est une fonction qui s’appelle elle-même. Par exemple, la fonction récursive ci-dessous reçoit un tableau de mots et renvoie un tableau de ces mêmes mots en majuscules.
4+
5+
```js
6+
function toUpperArray(items) {
7+
if (!items.length) return [] // condition de fin
8+
var head = items[0] // élément sur lequel travailler
9+
head = head.toUpperCase() // exécution du travail
10+
var tail = items.slice(1) // passage à l’étape suivante
11+
return [head].concat(toUpperArray(tail)) // récursion terminale
12+
}
13+
14+
toUpperArray(['bonjour', 'monde']) // => ['BONJOUR', 'MONDE']
15+
```
16+
17+
Cet exercice vise à vous faire découvrir la récursivité en implémentant une fonction familière à l’aide d’une fonction récursive.
18+
19+
# Défi
20+
21+
Implémentez `Array#reduce()` de façon récursive.
22+
23+
Pour vérifier que votre récursivité fonctionne correctement, nous utiliserons votre implémentation de `reduce()` avec notre solution pour l’exercice précédent, « Les bases : Reduce ». Votre fonction recevra donc un tableau de mots et une fonction, ainsi qu’une valeur initiale, et devrait donc renvoyer à terme un objet contenant les comptages pour chaque mot. Naturellement, votre implémentation de `reduce()` ne fait pas tout ça : c’est la fonction que nous vous passerons en argument qui s’en chargera.
24+
25+
Par souci de simplicité, votre implémentation de `reduce()` **n’a pas besoin de gérer le cas où l’argument de valeur initiale est manquant**. Vous pouvez supposer qu’il sera toujours fourni.
26+
27+
## Arguments
28+
29+
* `arr` : Un tableau sur lequel appliquer la réduction
30+
* `fn` : La fonction à utiliser comme étape de réduction. Tout comme pour le `Array#reduce()` standard, cette fonction recevra comme arguments `previousValue`, `currentValue`, `index` et le tableau sur lequel on est en train d’itérer.
31+
* `init` : Valeur initiale de la réduction. Contrairement à `Array#reduce()`, cet argument est ici obligatoire (vous pouvez supposer qu’il sera toujours fourni).
32+
33+
## Exemple
34+
35+
```js
36+
// Votre fonction `reduce()` devrait se comporter comme la méthode
37+
// standard `Array#reduce()`, à ceci près qu’elle recevra le tableau
38+
// à traiter en premier argument :
39+
40+
reduce([1,2,3], function(prev, curr, index, arr) {
41+
return prev + curr
42+
}, 0)
43+
// => 6
44+
```
45+
46+
## Conditions
47+
48+
* N’utilisez pas de boucle (`for`, `while`…)
49+
* N’utilisez aucune méthode de `Array`, du genre `Array#map()` ou `Array#reduce()`
50+
* Ne créez aucune fonction superflue
51+
52+
## Ressources
53+
54+
* https://fr.wikipedia.org/wiki/R%C3%A9cursivit%C3%A9
55+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/reduce
56+
57+
## Base de travail
58+
59+
```js
60+
function reduce(arr, fn, initial) {
61+
// VOTRE SOLUTION ICI
62+
}
63+
64+
module.exports = reduce
65+
```
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function reduce(arr, fn, initial) {
2+
return (function reduceOne(index, value) {
3+
// condition de fin
4+
if (index > arr.length - 1) return value
5+
6+
// calculer les valeurs et les passer à l’étape suivante
7+
return reduceOne(index + 1, fn(value, arr[index], index, arr))
8+
})(0, initial) // IIFE. Démarrer la récursion avec les valeurs de départ
9+
}
10+
11+
module.exports = reduce

i18n/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
"Basic: Every Some": {
2222
"found_good_lists": "found %d good lists!"
2323
},
24+
"Basic: Call": {
25+
"matched_objects": "Matched %d of %d valid objects from %d total."
26+
},
2427
"Higher Order Functions": {
2528
"call_log": "Called function %d times."
2629
}

i18n/fr.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"title": "JAVASCRIPT FONCTIONNEL C’EST LE BIEN",
2+
"title": "LE JAVASCRIPT FONCTIONNEL C’EST LE BIEN",
33
"subtitle" : "\u001b[23mSélectionnez un exercice et tapez \u001b[3mEnter\u001b[23m pour démarrer",
44
"common": {
55
"exercise": {
@@ -20,7 +20,7 @@
2020
"Basic: Filter": "Les bases : Filter",
2121
"Basic: Every Some": "Les bases : Every, Some",
2222
"Basic: Reduce": "Les bases : Reduce",
23-
"Basic: Recursion": "Les bases : Récursion",
23+
"Basic: Recursion": "Les bases : Récursivité",
2424
"Basic: Call": "Les bases : Call",
2525
"Partial Application without Bind": "Application Partielle sans Bind",
2626
"Partial Application with Bind": "Application Partielle avec Bind",
@@ -29,7 +29,7 @@
2929
"Blocking Event Loop": "Boucle d’Événements Bloquée",
3030
"Trampoline": "Trampoline",
3131
"Async Loops": "Boucles Asynchrones",
32-
"Recursion": "Récursion",
32+
"Recursion": "Récursivité",
3333
"Currying": "Currying",
3434
"Function Call": "Appel de Fonction"
3535
},
@@ -41,6 +41,9 @@
4141
"Basic: Every Some": {
4242
"found_good_lists": "%d bonnes listes trouvées !"
4343
},
44+
"Basic: Call": {
45+
"matched_objects": "Ai détecté %d des %d objets valides, sur un total de %d."
46+
},
4447
"Higher Order Functions": {
4548
"call_log": "Fonction appelée %d fois."
4649
}

0 commit comments

Comments
 (0)