Compare commits

...

12 commits

5 changed files with 1274 additions and 120 deletions

View file

@ -1,5 +1,6 @@
# AoC 2015
Jai décidé de faire lédition de 2015 de lAdvent of Code en utilisant un langage différent pour chaque jour. Jessaie dutiliser 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
@ -68,7 +69,7 @@ python3 run.py
## Jour 5
On retourne dans le passé ici avec le **Cobol**. Jai utilisé le compilateur GNUCOBOL pour pouvoir compiler mon fichier. Jai préféré utiliser lancienne syntaxe pour changer un peu ma façon de coder (et je trouve le symbole de la ligne 7 génial).
On retourne dans le passé ici avec le **Cobol**. Jai utilisé le compilateur GNUCOBOL pour pouvoir compiler mon fichier. Jai préféré utiliser lancienne 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.
```bash
# pour installer le compilateur
@ -79,10 +80,27 @@ cobc -x jour5.cob
./jour5
```
Il reste des messages de débugging. Si vous souhaitez les voir, il suffit de rajouter loption `-fdebugging-line` au compilateur.
Il reste des messages de débugging. Si vous souhaitez les voir, il suffit de rajouter loption `-fdebugging-line` au compilateur. **Les messages ont été supprimés.**
Jai 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/).
En tant que développeur, je suis feignant. Voici un mini script bash pour générer les colonnes de lignes se trouvant dans le fichier :
```bash
nb=$(wc -l jour5.cob | cut -d\ -f1)
for i in $(seq -f "%06g" $nb)
do
sed -Ei '0,/(^\s{6}|^\s*$)/s//'$i'/' jour5.cob
done
```
Si vous souhaitez éditer le fichier, il est plus pratique de le faire sans ces nombres. Voici la commande permettant de les retirer :
```bash
sed -Ei 's/^[0-9]{6}$//g' jour5.cob # pour éviter les espaces inutiles
sed -Ei 's/^[0-9]{6}/ /g' jour5.cob
```
## Jour 6
## Jour 7
## Jour 8
@ -113,7 +131,7 @@ Liste des langages utilisés
* Shell
* Perl
* LOLCODE / HolyC
* HolyC
* C++
* C#
* Pascal
@ -121,13 +139,27 @@ Liste des langages utilisés
* Go
* Rust
* Groovy
* Haskell
* JS
* PHP
* Pony
* Ruby
* Lua
* Pawn
* PureBasic
* Squirrel
* Scala
## Langages non utilisées
Liste des langages devant être utiliser mais qui ne lont pas été. Jessai dapporter 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.
### PureBasic
Compilateur propriétaire.

File diff suppressed because it is too large Load diff

View file

@ -1,113 +0,0 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. jour-cinq-prem-part.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE1 ASSIGN TO "input"
ORGANIZATION LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILE1.
01 INPUT-FILE.
02 STR PIC A(17).
WORKING-STORAGE SECTION.
01 MY-FILE.
02 MY-STR PIC A(17).
01 FILE-STATUS PIC X VALUE 'N'.
88 EOF VALUE 'Y'.
77 NB-NICE PIC 9(4) VALUE 0.
PROCEDURE DIVISION.
main.
OPEN INPUT FILE1.
PERFORM UNTIL EOF
READ FILE1 RECORD INTO MY-FILE
* Lorsquon arrive à la fin du fichier, on met Y pour le signaler
AT END MOVE 'Y' TO FILE-STATUS
NOT AT END CALL "parse-str" USING
BY CONTENT MY-STR,
BY REFERENCE NB-NICE
* On passe par référence NB-NICE pour lincrémenter
END-CALL
END-READ
END-PERFORM.
DISPLAY "Nombre de bonnes chaines : " NB-NICE.
CLOSE FILE1.
STOP RUN.
******************************************************************
* parse-str : parse la chaine de caractères pour voir le nombre de
* bonnes chaines. Prend en paramètres 2 arguments :
* STR : chaine de caractères de taille 16. Sera parser.
* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
IDENTIFICATION DIVISION.
PROGRAM-ID. parse-str.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 CHAR PIC A.
88 VOY VALUE 'a','e','i','o','u'.
77 I PIC 99.
88 END-P VALUE 17.
77 NB-VOY PIC 99.
77 PRED PIC A.
77 TMP PIC AA.
88 BAD VALUE 'ab', 'cd', 'pq', 'xy'.
77 DOUBLE PIC X.
* NB-VOY contient le nombre de voyelles
* PRED le caractère précédent
* TMP forme la chaine contenant le caractère précédent et courant
* BAD les mauvaises formes de chaines
* DOUBLE est mit à Y lorsque CHAR = PRED
*
* LINKAGE SECTION contient les paramètres du programme parse-str
LINKAGE SECTION.
77 STR PIC A(17).
77 NB PIC 9(4).
PROCEDURE DIVISION USING STR, NB.
parse.
MOVE 0 TO NB-VOY.
MOVE 'N' TO DOUBLE.
d DISPLAY STR.
d DISPLAY "=================".
PERFORM VARYING I FROM 1 BY 1 UNTIL END-P
MOVE STR(I:1) TO CHAR
d DISPLAY "ACT. CHAR : " CHAR
d DISPLAY "ACT. PRED : " PRED
d DISPLAY "I : " I
IF VOY
THEN ADD 1 TO NB-VOY
END-IF
IF I >= 2
THEN
STRING PRED CHAR INTO TMP
d DISPLAY "TMP STR : " TMP
IF BAD
THEN
EXIT PERFORM
END-IF
IF PRED = CHAR
THEN
MOVE 'Y' TO DOUBLE
END-IF
d DISPLAY "DOUBLE : " DOUBLE
END-IF
MOVE CHAR TO PRED
END-PERFORM.
IF NOT BAD AND NB-VOY >= 3 AND DOUBLE = 'Y'
THEN
ADD 1 TO NB
END-IF.
EXIT PROGRAM.
END PROGRAM parse-str.
*************************************************************************
END PROGRAM jour-cinq-prem-part.

211
jour05/jour5.cob Normal file
View file

@ -0,0 +1,211 @@
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. jour-cinq.
000003
000004 ENVIRONMENT DIVISION.
000005 INPUT-OUTPUT SECTION.
000006 FILE-CONTROL.
000007 SELECT FILE1 ASSIGN TO "input"
000008 ORGANIZATION LINE SEQUENTIAL.
000009
000010 DATA DIVISION.
000011 FILE SECTION.
000012 FD FILE1.
000013 01 INPUT-FILE.
000014 02 STR PIC A(17).
000015
000016 WORKING-STORAGE SECTION.
000017 01 MY-FILE.
000018 02 MY-STR PIC A(17).
000019 01 FILE-STATUS PIC X VALUE 'N'.
000020 88 EOF VALUE 'Y'.
000021 77 NB-NICE-PREM PIC 9(4) VALUE 0.
000022 77 NB-NICE-DEUX PIC 9(4) VALUE 0.
000023
000024 PROCEDURE DIVISION.
000025 main.
000026 OPEN INPUT FILE1.
000027 PERFORM UNTIL EOF
000028 READ FILE1 RECORD INTO MY-FILE
000029* Lorsquon arrive à la fin du fichier, on met Y pour le signaler
000030 AT END MOVE 'Y' TO FILE-STATUS
000031 NOT AT END CALL "hub" USING
000032 BY CONTENT MY-STR,
000033 BY REFERENCE NB-NICE-PREM
000034 BY REFERENCE NB-NICE-DEUX
000035* On passe par référence NB-NICE pour les incrémenter
000036 END-CALL
000037 END-READ
000038 END-PERFORM.
000039 DISPLAY "Nombres de bonnes chaines :" END-DISPLAY.
000040 DISPLAY "Dans la partie 1 : " NB-NICE-PREM END-DISPLAY.
000041 DISPLAY "Dans la partie 2 : " NB-NICE-DEUX END-DISPLAY.
000042 CLOSE FILE1.
000043 STOP RUN.
000044
000045*****************************************************************
000046* hub : exécute les 2 fonctions pour les 2 parties
000047* STR : la chaine à passer en paramètre aux deux fonctions
000048* NB-PREM : (REFERENCE) nombre bonnes chaines partie 1
000049* NB-DEUX : (REFERENCE) nombre bonnes chaines partie 2
000050* Ces 2 variables seront incrémentées
000051*****************************************************************
000052
000053 IDENTIFICATION DIVISION.
000054 PROGRAM-ID. hub.
000055
000056 DATA DIVISION.
000057 LINKAGE SECTION.
000058 77 STR PIC A(17).
000059 77 NB-PREM PIC 9(4).
000060 77 NB-DEUX PIC 9(4).
000061
000062 PROCEDURE DIVISION USING STR, NB-PREM, NB-DEUX.
000063 route.
000064 CALL "parse-prem" USING
000065 BY CONTENT STR,
000066 BY REFERENCE NB-PREM
000067 END-CALL.
000068
000069 CALL "parse-deux" USING
000070 BY CONTENT STR,
000071 BY REFERENCE NB-DEUX
000072 END-CALL.
000073 EXIT PROGRAM.
000074
000075******************************************************************
000076* parse-prem : parse la chaine de caractères pour voir le nombre de
000077* bonnes chaines pour la partie 1. Prend en paramètres 2 arguments :
000078* STR : chaine de caractères de taille 17 à analyser.
000079* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
000080*****************************************************************
000081
000082 IDENTIFICATION DIVISION.
000083 PROGRAM-ID. parse-prem.
000084
000085 DATA DIVISION.
000086 WORKING-STORAGE SECTION.
000087 77 CHAR PIC A.
000088 88 VOY VALUE 'a','e','i','o','u'.
000089 77 I PIC 99.
000090 88 END-P VALUE 17.
000091 77 NB-VOY PIC 99.
000092 77 PRED PIC A.
000093 77 TMP PIC AA.
000094 88 BAD VALUE 'ab', 'cd', 'pq', 'xy'.
000095 77 DOUBLE PIC X.
000096
000097*****************************************************************
000098* NB-VOY contient le nombre de voyelles
000099* PRED le caractère précédent
000100* TMP forme la chaine contenant le caractère précédent et courant
000101* BAD les mauvaises formes de chaines
000102* DOUBLE est mit à Y lorsque CHAR = PRED
000103*
000104* LINKAGE SECTION contient les paramètres du programme parse-str
000105*****************************************************************
000106
000107 LINKAGE SECTION.
000108 77 STR PIC A(17).
000109 77 NB PIC 9(4).
000110
000111 PROCEDURE DIVISION USING STR, NB.
000112 parse.
000113 MOVE 0 TO NB-VOY.
000114 MOVE 'N' TO DOUBLE.
000115 PERFORM VARYING I FROM 1 BY 1 UNTIL END-P
000116 MOVE STR(I:1) TO CHAR
000117 IF VOY THEN
000118 ADD 1 TO NB-VOY END-ADD
000119 END-IF
000120 IF I >= 2
000121 THEN
000122 STRING PRED CHAR INTO TMP END-STRING
000123 IF BAD THEN
000124 EXIT PERFORM
000125 END-IF
000126 IF PRED = CHAR THEN
000127 MOVE 'Y' TO DOUBLE
000128 END-IF
000129 END-IF
000130 MOVE CHAR TO PRED
000131 END-PERFORM.
000132 IF NOT BAD AND NB-VOY >= 3 AND DOUBLE = 'Y' THEN
000133 ADD 1 TO NB END-ADD
000134 END-IF.
000135 EXIT PROGRAM.
000136 END PROGRAM parse-prem.
000137
000138******************************************************************
000139* parse-deux : parse la chaine de caractères pour voir le nombre de
000140* bonnes chaines pour la partie 2. Prend en paramètres 2 arguments :
000141* STR : chaine de caractères de taille 17 à analyser.
000142* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
000143*****************************************************************
000144
000145 IDENTIFICATION DIVISION.
000146 PROGRAM-ID. parse-deux.
000147
000148 DATA DIVISION.
000149 WORKING-STORAGE SECTION.
000150 77 CHAR PIC A.
000151 77 I PIC 99.
000152 88 STR-LENGTH VALUE 17.
000153 77 J PIC 99.
000154 77 K PIC 99.
000155 88 DOUBLE-STR-LENGTH VALUE 16.
000156 77 PRED PIC A.
000157 77 MYNEW PIC A.
000158 77 DOUBLE-CHAR PIC AA.
000159 77 DOUBLE-CHAR-NEXT PIC AA.
000160 77 BETWEEN PIC X.
000161 77 DOUBLE PIC X.
000162
000163******************************************************************
000164* PRED le caractère précédent
000165* MYNEW le caractère suivant
000166* DOUBLE-CHAR la paire à vérifier
000167* DOUBLE-CHAR-NEXT les paires suivantes
000168* DOUBLE est mit à Y lorsque 2 pairs sont trouvées
000169* BETWEEN est mit à Y lorsque 2 memes lettres en encadrent une
000170******************************************************************
000171
000172 LINKAGE SECTION.
000173 77 STR PIC A(17).
000174 77 NB PIC 9(4).
000175
000176 PROCEDURE DIVISION USING STR, NB.
000177 deuxieme-part.
000178 MOVE 'N' TO BETWEEN.
000179 MOVE 'N' TO DOUBLE.
000180 PERFORM VARYING I FROM 1 BY 1 UNTIL STR-LENGTH
000181 COMPUTE J = I + 1 END-COMPUTE
000182 MOVE STR(I:1) TO CHAR
000183 IF I > 1 AND I < (LENGTH OF STR - 1) THEN
000184 MOVE STR(J:1) TO MYNEW
000185 IF PRED = MYNEW THEN
000186 MOVE 'Y' TO BETWEEN
000187 END-IF
000188 END-IF
000189
000190 IF I < ((LENGTH OF STR) - 2) AND DOUBLE = 'N' THEN
000191 MOVE STR(I:2) TO DOUBLE-CHAR
000192 ADD 1 TO J END-ADD
000193 PERFORM VARYING K FROM J BY 1 UNTIL DOUBLE-STR-LENGTH
000194 MOVE STR(K:2) TO DOUBLE-CHAR-NEXT
000195 IF DOUBLE-CHAR = DOUBLE-CHAR-NEXT THEN
000196 MOVE 'Y' TO DOUBLE
000197 END-IF
000198 END-PERFORM
000199 END-IF
000200 MOVE CHAR TO PRED
000201 END-PERFORM.
000202
000203 IF BETWEEN = 'Y' AND DOUBLE = 'Y'
000204 THEN
000205 ADD 1 TO NB END-ADD
000206 END-IF.
000207 EXIT PROGRAM.
000208 END PROGRAM parse-deux.
000209
000210 END PROGRAM hub.
000211 END PROGRAM jour-cinq.

26
jour10/jour10.bs Normal file
View file

@ -0,0 +1,26 @@
basInput$ = "1113222113"
pred$ = ""
act$ = ""
new$ = ""
k = 0
for i = 0 to 40
print i, " / 40"
for j = 1 to len(basInput$) step k
k = 1
act$ = mid$(basInput$, j, 1)
pred$ = act$
while pred$ = act$ and (j + k) < len(basInput$)
pred$ = act$
act$ = mid$(basInput$, j + k, 1)
k = k + 1
if act$ <> pred$ then
k = k - 1
endif
wend
new$ = new$ + str$(k) + pred$
next j
basInput$ = new$
next i
print "La longeur de la chaine finale est ", len(basInput$)