Oui j'ai vu ça, c'est alambiqué
comme pistes pour réduire :
enlever var t et mettre la variable t dans les paramètres de la fonction pour éviter le global leak
window devient self et la double égalité suffit
Oui j'ai vu ça, c'est alambiqué
comme pistes pour réduire :
enlever var t et mettre la variable t dans les paramètres de la fonction pour éviter le global leak
window devient self et la double égalité suffit
ah j'étais pas au courant de la règle g('al') === 'gal'
J'ai une autre idée qui m'est venue, je bosse dessus
Ma faute, j'avais pas donné le lien de la règle initiale.
Bingo ! Réutilisable à 47 caractères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part function g(a){ return a?g._?g('o'+a,--g._):'g'+a:(g._=-~g._,g) }
Ce n'est pas alambiqué, c'est juste propre et sécurisé, impossible de modifier son comportement depuis l'extérieur, ni en passant un 2ème argument.
On est carrément dans l'extra, là, mais... on a fait un beau fork ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 var ng; ng = g()()()()()(); console.log('Le tien affiche gooooooooal', ng()()('al')); console.log('puis gooal', ng()()('al')); console.log('Le mien affiche gooooooooal', ng()()('al')); console.log('puis gooooooooooal', ng()()('al'));
Ah oui mais je ne crois pas avoir vu dans les règles qu'il faille gérer les variables intermédiaires ? Si tu veux du code propre et sécurisé, tu te goures de topic
Bah, pourquoi ne pourrait-on pas faire les deux en même temps? ^^
Sinon, pour les curieux, en plus de ma version JS, j'ai posté une proposition PHP, bien qu'elle nécessite une factorisation à chaque appel :
https://github.com/Lcfvs/goal/blob/p...Lcfvs/goal.php
ouais PHP n'autorise pas (encore) cette imbrication d'exécution de fonction.
Sinon une solution qui semble répondre à toutes les règles :
63 caractères :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part g=function h(i){return function(j){return j?i+j:h(i+'o')}}('g');
Tests :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 console.log(g('al')); // gal console.log(g()()('al')); // gooal var ng; ng = g()(); console.log(ng('al')); // gooal console.log(ng()()('al')); // gooooal console.log(ng()()('al')); // gooooal
Kaamo> Sympa et court... Grimly avait aussi proposé une solution avec une new fonction à chaque appel... juste que j'trouve ça lourd lol
heu tu es sur que le nombre de o est correct ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ng = g()(); console.log(ng('al')); // gooal console.log(ng()()('al')); // gooooal console.log(ng()()('al')); // gooooal
oui je pense.
ng === g()() donc ng vaut 2 "o"
Donc,
2 "o" + 0 "o" console.log(ng('al')); // gooal.
2 "o" + 2 "o" console.log(ng()()('al')); // gooooal
Bon, cela fait trop longtemps qu'on a plus vu de défis, ici...
En voici un sympa, sans doute trop facile pour certains mais bon...
Le but étant de créer une fonction permettant de faire
Bon amusement à vous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 var substring, substringFromHello, slice, sliceDeclaredArray; substring = f(String.prototype.substring); substringFromHello = substring('hello world!'); console.log(substringFromHello([6, 11])); // 'world' // or substring = f(String.prototype.substring); substringFromHello = substring('hello world!', 6); console.log(substringFromHello([11])); // 'world' // or slice = f(Array.prototype.slice); sliceDeclaredArray = slice([1, 2, 3, 4, 5]); console.log(sliceDeclaredArray([2, 4])); // [3, 4] /* constraints : - the f function - takes 1 argument, a function (or object method) and must work with any other - returns a function which - takes one or more arguments, where the first is the value to treat with the final function and pass the rest to the final function - returns a function which - takes any number of arguments, as array or arguments object - returns the result - no global vars - no more than 40 characters - no more than 2 words, except your own var names - must be valid in current standard JS (ES6) */
J'ai ça :Mais la fonction retournée ne prend pas les paramètres en array mais en liste d'arguments, comme la première (plus logique non ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part f=F=>F.bind.bind(F)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 substring = f(String.prototype.substring);substringFromHello = substring('hello world!'); console.log(substringFromHello(6, 11)); // 'world' // or substring = f(String.prototype.substring); substringFromHello = substring('hello world!', 6); console.log(substringFromHello(11)); // 'world'
C'est une fonction curry modifiée que tu nous demande de faire en fait
J'ai un début de truc mais c'est pas encore au point. Je reviens dans un petit moment…
Alors j'ai ça qui fait 62 caractères :
Ça passe les tests. Mais vu que tu demandes de faire moins de 40 (), ça doit être atrocement compliqué par rapport à la « bonne » solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part f=m=>(o,...a)=>b=>a.reduce((g,x)=>g.bind(0,x),m.bind(o))(...b)
J'ai eu des cours de Scheme, je crois que ça m'a marqué à vie…
Max 40...
Et, non, c'est pas mal moins complexe que ta solution... ^^
C'est beaucoup moins élégant, je préfère ma première solution ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part f=F=>(c,...r)=>(a)=>F.apply(c,[...r, ...a])
edit:
40 tout pile
Code : Sélectionner tout - Visualiser dans une fenêtre à part f=F=>(c,...r)=>(a)=>F.bind(c)(...r,...a)
Ce changement liste -> argument array m'embrouille...
39
Code : Sélectionner tout - Visualiser dans une fenêtre à part f=F=>(c,...r)=>(a)=>F.call(c,...r,...a)
@SylvainPV : Peut mieux faire...
- trop long
- variables globales
EDIT : Je pense que tu trouveras la solution élégante aussi, t'inquiète
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager