J’ai décidé de faire l’édition de 2015 de l’Advent of Code en utilisant un langage différent pour chaque jour. J’essaie d’utiliser au mieux le langage (par exemple, Java est orienté objet). Vous trouverez ci-dessous un tableau résumant rapidement ce dont vous avez besoin pour lancer chaque jour et plus bas encore des notes plus précises pour les différents jours.
## TLDR
Ce tableau contient les langages pour chaque jours ainsi que le compilateur, la commande pour compiler et exécuter les différents fichiers. Si vous souhaitez plus d’informations, descendez à la bonne section.
Le langage utilisé pour ce jour là est le **C**. Simple et efficace, il vous suffit d’avoir le compilateur `gcc` d’installé pour pouvoir le compiler.
```bash
gcc jour1.c
./a.out
```
## Jour 2
Ici, le langage est le **Java** et l’approche du problème s’est fait avec des classes. La compilation varie selon votre `CLASSPATH` mais voici les commandes à entrer afin de faire marcher à coup sûr la compilation.
Pour ce jour, le **Go** a été utilisé. Un langage qui fait beaucoup pensé au C mais aussi au Python ! Bien qu’il soit possible de compiler le fichier, j’ai utilisé la partie interpréteure du langage.
Le langage le plus simple ! Juste un fichier d’une vingtaine de ligne : merci au **Python** ! J’ai décidé de faire une approche bruteforce au lieu de chercher un moyen de « casser » le MD5. Pardonnez ma fainéantise.
On retourne dans le passé ici avec le **Cobol**. J’ai utilisé le compilateur GNUCOBOL pour pouvoir compiler mon fichier. J’ai préféré utiliser l’ancienne syntaxe pour changer un peu ma façon de coder (et je trouve le symbole de la ligne 7 génial) sur la première partie.
Il reste des messages de débugging. Si vous souhaitez les voir, il suffit de rajouter l’option `-fdebugging-line` au compilateur. **Les messages ont été supprimés.**
J’ai appris à coder en COBOL très rapidement pour ce jour. Je me suis appuyé sur [le cours de Wikiversite](https://fr.wikiversity.org/wiki/COBOL) pour les bases et aussi de [la documentation officielle GNUCOBOL](https://devdocs.io/gnu_cobol/).
Avant d’écrire le script Node.JS, j’ai utilisé une REGEX pour la première partie. Il suffit d’additionner les nombres du fichier ! Ça se fait très facilement en Bash. Par contre, la REGEX de la partie 2, si elle existe, est beaucoup plus complexe. J’ai préféré réécrire ma réponse à la question 1en Node.JS, langage logique pour du JSON.
Voici la ligne bash décortiquée en script pour une meilleure compréhension :
```bash
sum=0
for i in $(grep -oE '(-)?[[:digit:]]+' input)
do
sum=$(($sum + $i))
done
echo $sum
```
Sinon, il suffit d’installer `node` et de lancer avec la commande suivante, aucune dépendance n’est requise :
La compilation se fait ensuite en 3 temps : il faut en premier faire les .o du main et de la classe `raindeer` avant de les mettre dans un seul et même fichier.
La compréhension de ce langage a été assez longue… Très peu de ressources « potables » en ligne, j’ai compris comment le langage marchait avec StackOverflow et un ou deux sites mieux foutus que les autres. Un grand merci à la documentation d’Apple qui est un bourbier sans nom même s’ils tentent de faire un bon truc. Voici une liste des différents sites qui m’ont été utiles :
* [Comment compiler l’Objective-C avec gcc](https://www.gc3.uzh.ch/blog/Compile_a_Objective-C_application_on_Ubuntu___40__Hobbes_instance__41__/)
* [Site regroupant des tutos basiques pour l’Objective-C](https://www.tutorialspoint.com/objective_c/index.htm)
* [Pleins d’exemples de code Objective-C](https://learnxinyminutes.com/docs/objective-c/)
* [Bases pour faire une classe](http://www.cocoadevcentral.com/d/learn_objectivec/)
* [Comment faire un constructeur](https://www.binpress.com/objective-c-object-initialization/)
* [Les options de *property*](https://dsrijan.medium.com/objective-c-properties-901e8a1f82ac)
* [Ancienne documentation de *property*](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html)
* [Explication de *synthesize*](https://developer.apple.com/forums/thread/69075)
* [Tutoriel sur Objective-C, page sur *property*](https://www.journaldev.com/9580/classes-objects-and-methods-in-objective-c)
* [Exemples d’utilisation de NSString](https://eezytutorials.com/ios/nsstring-by-example.php)
Liste des langages devant être utiliser mais qui ne l’ont pas été. J’essai d’apporter des explications au pourquoi.
### LOLCODE
Le LOLCODE ne permet pas la manipulation de chaines de caractères ou de manière peu flexible : [post Stackoverflow](https://stackoverflow.com/questions/29762129/lolcode-string-parsing).
### Haskell
Le Haskell est un langage de logique, son foctionnement et surtout sa structure est différente des autres programmes.