Compare commits

...

2 Commits

Author SHA1 Message Date
dobiadi
7e9d5e3fdd Day1 Rust 2023-12-02 16:26:30 +01:00
dobiadi
7850c50a55 Day1 C 2023-12-02 14:37:43 +01:00
9 changed files with 1189 additions and 0 deletions

BIN
day1/c/day1 Executable file
View File

Binary file not shown.

118
day1/c/day1.c Normal file
View File

@@ -0,0 +1,118 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_MAX_LENGTH 256
#define NUM_0_CHARCODE 48
#define NUM_9_CHARCODE NUM_0_CHARCODE + 9
#define PART_2 1
#define FORWARD 1
#define BACKWARD -1
char* english_digit_strings[] = {
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
};
#define NUM_OF_DIGITS ((sizeof(english_digit_strings)) / (sizeof(english_digit_strings[0])))
char *english_digit_strings_reversed[NUM_OF_DIGITS];
int get_num(char *p, int dir) {
// Check whether it is a number
if (*p >= NUM_0_CHARCODE && *p <= NUM_9_CHARCODE) {
return *p - NUM_0_CHARCODE;
}
// Check spelled out numbers
if (PART_2) {
// Check each digit
for (int i = 0; i < NUM_OF_DIGITS; i++) {
char *reference = dir == FORWARD ? english_digit_strings[i] : english_digit_strings_reversed[i];
char *tmp = p;
int match = 1;
while (*reference != '\0') {
if (*tmp != *reference) {
match = 0;
break;
}
reference++;
tmp += dir;
}
if (match) {
return i;
}
}
}
return -1;
}
char* reverse_string(char* str) {
char *p = str;
while (*p != '\0') p++;
int len = p - str;
char *newstr = (char *)malloc(len + 1);
memset(newstr, 0, len + 1);
p--;
char* newp = newstr;
while (p != str) {
*newp = *p;
newp++;
p--;
}
*newp = *p;
return newstr;
}
void create_reversed_digit_strings() {
for (int i = 0; i < NUM_OF_DIGITS; i++) {
english_digit_strings_reversed[i] = reverse_string(english_digit_strings[i]);
}
}
int main() {
char *p, *buf, c;
int sum = 0, n = -1;
create_reversed_digit_strings();
buf = (char *)malloc(LINE_MAX_LENGTH);
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
while ((c = getchar()) != EOF) {
*p++ = c;
if (c == '\n') {
// Find last number (p points to the end of line)
while ((n = get_num(p, BACKWARD)) == -1) p--;
sum += n;
// Find first number
p = buf;
while ((n = get_num(p, FORWARD)) == -1) p++;
sum += n * 10;
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
}
}
free(buf);
for (int i = 0; i < NUM_OF_DIGITS; i++) {
free(english_digit_strings_reversed[i]);
}
printf("%i\n", sum);
}

1000
day1/input.txt Normal file
View File

File diff suppressed because it is too large Load Diff

1
day1/rust/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
target

7
day1/rust/Cargo.lock generated Normal file
View File

@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "rust"
version = "0.1.0"

8
day1/rust/Cargo.toml Normal file
View File

@@ -0,0 +1,8 @@
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

44
day1/rust/src/main.rs Normal file
View File

@@ -0,0 +1,44 @@
fn main() {
let part2 = true;
let english_digit_names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
let stdin = std::io::stdin();
let mut sum = 0;
for line in stdin.lines() {
let line = line.unwrap();
let mut first: Option<u32> = None;
let mut last = 0;
for i in 0..line.chars().count() {
let slice = &line[i..];
let first_char = slice.chars().next().unwrap();
if first_char.is_digit(10) {
if first == None {
first = first_char.to_digit(10);
}
last = first_char.to_digit(10).unwrap();
}
if part2 {
for (i, name) in english_digit_names.iter().enumerate() {
if slice.starts_with(name) {
if first == None {
first = Some(i.try_into().unwrap());
}
last = i.try_into().unwrap();
}
}
}
}
sum += first.unwrap() * 10;
sum += last;
}
println!("{}", sum);
}

4
day1/sample.txt Normal file
View File

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

7
day1/sample2.txt Normal file
View File

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