aoc-2015/jour05/jour5.cob

211 lines
7.4 KiB
COBOL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.