Dyrk.org
Do You Really Know

[Javascript] Créer un code source de 2 caractères par lignes

Publié le 17 novembre 2017 par #Ro0t

Salut à tous,

 

Nouveau challenge de « la mort qui tue » sur CodeWar
Réaliser une fonction qui retourne « Hello, World! » mais avec pour seul (et pas des moindres) contrainte, de la faire avec maximum 2 caractères par lignes …
Je me suis dit qu’il serait intéressant pour vous de comprendre comment résoudre ce challenge !
Même si j’imagine que certaines personnes passeront juste pour copier coller la solution ;)

La concaténation

Tout d’abord, il va nous falloir réfléchir à comment concaténer une chaîne de caractères …
En Javascript la concaténation se fait avec le caractère « + » … sauf que :

"H"+
"e"+
"l"+
"l"+
"o"+
...

On est d’accord que là … ça nous fait 4 caractères par lignes….
L’astuce réside dans l’utilisation d’une « quote » bien spéciale … qui nous permettra de créer des chaines de caractères sur plusieurs lignes sans avoir à faire de concaténation …
Cette quote ne figurera pas ici :

  • « 

En fait c’est celle qui se trouve normalement sur la touche « 7 » de votre clavier :

Pour ceux qui ne verraient toujours par, je parle de cette quote :

  • `

Et donc ….
le résultat  est le suivant :

`H
el
lo
,
Wo
rl
d`

Petit problème avec cette quote un peu particulière, c’est que les retours à la ligne … sont pris en compte …
Ce qui donne ceci :
Hum, c’est un peu embêtant !
Pas de panique, il est possible d’échapper les sauts de ligne si l’on met un « antislash » (\) à la fin de nos lignes !

Voilà, nous sommes désormais en mesure de créer des chaines de caractères sur plusieurs lignes !

 

 

Appeler des fonctions

Inutile de vous dire qu’il n’existe aucune fonction qui fait 1 ou 2 caractère(s) ….
Comme vous le savez, en Javascript tout est « objet », du coup une simple chaîne de caractères ou bien un tableau, ou encore un nombre, … autant de choses qui contiendront chacun(e) leurs »méthodes » …
Pour par exemple, en connaitre  la taille, pour enlever les espaces, connaitre la position d’un élément, le convertir en autre chose … etc …

Souvent nous appelons ces méthodes de la manière suivante :

maVariable = "Hello, World!"
maVariable.valueOf() // retourne Hello, World!

C’est une méthode propre, lisible et que n’importe quelle personne douée dans ce que l’on pourrait qualifier de « bonnes pratiques », vous recommandera !

Il existe cependant un tout autre chemin … obscur et parsemé de crocodiles … et de crochets (et je ne parle pas du capitaine crochet ;) )

maVariable = "Hello, World!"
maVariable['valueOf']()

On constate donc ici, qu’il est possible d’appeler une méthode par leurs nom, grâce à une chaîne de caractère … Et donc … de réaliser quelque chose comme ceci :

maVariable  = "Hello, World!"
maVariable[
`\
v\
a\
l\
u\
e\
O\
f`
]
()

Roulement de tambour …

Ahah ça fonctionne !

C’est cool non ?

Créer notre fonction Hello World !

Nous savons désormais comment écrire des chaines de caractères sur 2 caractères …
Nous savons également comment appeler des fonctions !
Nous allons donc terminer en appelant une méthode un peu particulière … qui permet de forcer les paramètres d’une fonction … cette méthode c’est la méthode « bind » …
Par exemple lorsque vous souhaitez faire un alert …

alert('Hello, World!')

Avec Bind … ça deviendra ceci :

x = alert.bind(null, 'Hello World');
x()

Vous remarquez que j’ai indiqué « null« , c’est pour le cas où il y aurait d’autres paramètres avant … celui-ci permet de les écraser, et les remplacer !

Il n’est pas toujours nécessaire de mettre « null » … Mais du coup, de la même manière que je vous ai montré dans le chapitre précédent, il est possible d’appeler « bind » sous la forme d’une chaîne de caractères, et sur plusieurs lignes !

 

Solution :

x=
`\
H\
e\
l\
l\
o\
,\
\
w\
o\
r\
l\
d\
!`
f=
x[
`\
v\
a\
l\
u\
e\
O\
f`
][
`\
b\
i\
n\
d`
]
(x
)

 

C’est une solution, il y en a bien entendu d’autres ;)
Certaines sont plus optimisées …

Conclusion

Javascript avec ses spécificités, reste pour moi l’un des langages les plus malléables qui soit !
Mais surtout l’un des plus amusants surtout lorsque l’on souhaite se créer des challenges.

Vous pouvez me retrouver sur CodeWars ici :
https://www.codewars.com/users/SpiderBoy/stats