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
Version imprimable
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: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:
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 :mouarf:
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:g=function h(i){return function(j){return j?i+j:h(i+'o')}}('g');
Tests :
Code:
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:
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 :mouarf:Code:
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:f=F=>F.bind.bind(F)
Code:
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 (8O), ça doit être atrocement compliqué par rapport à la « bonne » solution :aie:Code: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:f=F=>(c,...r)=>(a)=>F.apply(c,[...r, ...a])
edit:
40 tout pileCode:f=F=>(c,...r)=>(a)=>F.bind(c)(...r,...a)
Ce changement liste -> argument array m'embrouille...
39Code: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 ;)