Init commit with a complete day 1.

This commit is contained in:
Alexander Andreev 2023-12-02 17:34:17 +04:00
commit 83ae802789
Signed by: Arav
GPG Key ID: D22A817D95815393
9 changed files with 1206 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
bin

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
CC=cc
CFLAGS=-static --std=c2x -O3 -Wall -Werror -Wextra -pedantic
EXES = $(wildcard day*)
all: create_bin_dir $(EXES)
create_bin_dir:
@mkdir -p bin
day1: day1/p1.c day1/p2.c
${CC} ${CFLAGS} $@/p1.c -o bin/$@p1
${CC} ${CFLAGS} $@/p2.c -o bin/$@p2
clean:
rm -f bin/day*p*

1000
day1/in.my Normal file

File diff suppressed because it is too large Load Diff

4
day1/in.test Normal file
View File

@ -0,0 +1,4 @@
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet

7
day1/in.test2 Normal file
View File

@ -0,0 +1,7 @@
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen

42
day1/p1.c Normal file
View File

@ -0,0 +1,42 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
int main(int argc, char **argv) {
FILE *input;
char *line = NULL;
size_t line_length = 0;
if (argc == 1 || argv[1][0] == '-')
input = stdin;
else if ((input = fopen(argv[1], "r")) == NULL) {
printf("Cannot open file %s\n", argv[1]);
return -1;
}
int32_t calibration_value = 0;
while (getline(&line, &line_length, input) != -1) {
int32_t current_calibration_value = -1;
int8_t last_digit = 0;
for (size_t i = 0; i < line_length-1; ++i) {
if (line[i]>>4 == 0x3) {
if (current_calibration_value == -1)
current_calibration_value = (line[i]&0xf) * 10;
last_digit = line[i]&0xf;
}
}
if (current_calibration_value != -1)
calibration_value += current_calibration_value + last_digit;
memset(line, 0, line_length);
}
printf("%d\n", calibration_value);
return 0;
}

103
day1/p2.c Normal file
View File

@ -0,0 +1,103 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
int main(int argc, char **argv) {
FILE *input;
char *line = NULL;
size_t line_length = 0;
if (argc == 1 || argv[1][0] == '-')
input = stdin;
else if ((input = fopen(argv[1], "r")) == NULL) {
printf("Cannot open file %s\n", argv[1]);
return -1;
}
int32_t calibration_value = 0;
while (getline(&line, &line_length, input) != -1) {
int32_t current_calibration_value = 0;
int8_t last_digit = 0;
for (size_t i = 0; i < line_length-1; ++i) {
if (line[i]>>4 == 0x3) {
if (current_calibration_value == 0)
current_calibration_value = (line[i]&0xf) * 10;
last_digit = line[i]&0xf;
} else {
int8_t digit = 0;
switch (line[i]) {
case 'o': // 1
if (i+2 <= line_length)
if (line[i+1] == 'n' && line[i+2] == 'e') {
digit = 1;
}
break;
case 't': // 2 3
if (i+2 <= line_length)
if (line[i+1] == 'w' && line[i+2] == 'o') {
digit = 2;
break;
}
if (i+4 <= line_length)
if (line[i+1] == 'h' && line[i+2] == 'r' && line[i+3] == 'e' && line[i+4] == 'e') {
digit = 3;
}
break;
case 'f': // 4 5
if (i+3 <= line_length)
if (line[i+1] == 'o' && line[i+2] == 'u' && line[i+3] == 'r') {
digit = 4;
break;
}
if (i+3 <= line_length)
if (line[i+1] == 'i' && line[i+2] == 'v' && line[i+3] == 'e') {
digit = 5;
}
break;
case 's': // 6 7
if (i+2 <= line_length)
if (line[i+1] == 'i' && line[i+2] == 'x') {
digit = 6;
break;
}
if (i+4 <= line_length)
if (line[i+1] == 'e' && line[i+2] == 'v' && line[i+3] == 'e' && line[i+4] == 'n') {
digit = 7;
}
break;
case 'e': // 8
if (i+4 <= line_length)
if (line[i+1] == 'i' && line[i+2] == 'g' && line[i+3] == 'h' && line[i+4] == 't') {
digit = 8;
}
break;
case 'n': // 9
if (i+3 <= line_length)
if (line[i+1] == 'i' && line[i+2] == 'n' && line[i+3] == 'e') {
digit = 9;
}
break;
}
if (digit != 0) {
if (current_calibration_value == 0)
current_calibration_value = digit * 10;
last_digit = digit;
}
}
}
if (current_calibration_value != 0)
calibration_value += current_calibration_value + last_digit;
memset(line, 0, line_length);
}
printf("%d\n", calibration_value);
return 0;
}

23
run Executable file
View File

@ -0,0 +1,23 @@
#!/usr/bin/sh
DAY=1
if [ -n "$1" ]; then
DAY=$1
fi
PART=1
if [ -n "$2" ]; then
PART=$2
fi
INPUT=my
if [ -n "$3" ]; then
INPUT=$3
fi
mkdir -p bin
set -e
echo -n "Day $DAY part $PART with '$INPUT' input: "
bin/day${DAY}p$PART < day$DAY/in.$INPUT

8
test Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/sh
test_case() {
[[ $(bin/day$1p$2 < day$1/in.$3) = "$4" ]] && { echo -ne "\e[32mpassed\e[0m"; } || { echo -ne "\e[31mfailed\e[0m"; }
}
echo "Day $1 with test data part 1 $(test_case $1 1 "test" "142"), and part 2 $(test_case $1 2 "test2" "281").";
echo "Day $1 with my data part 1 $(test_case $1 1 "my" "55621"), and part 2 $(test_case $1 2 "my" "53592").";