2023 day1
This commit is contained in:
parent
433472ebb8
commit
78ab54994e
@ -1,11 +1,90 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "parse.h"
|
||||||
|
|
||||||
|
typedef int (* digit_parser_t)(const char * start, const char * end);
|
||||||
|
|
||||||
|
static int part1_digit_parser(const char * start, const char * end)
|
||||||
|
{
|
||||||
|
return parse_base10_digit(*start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int part2_digit_parser(const char * start, const char * end)
|
||||||
|
{
|
||||||
|
int length = end - start;
|
||||||
|
if (length >= 1) {
|
||||||
|
int n = parse_base10_digit(*start);
|
||||||
|
if (n >= 0) return n;
|
||||||
|
}
|
||||||
|
if (length >= 3) {
|
||||||
|
if (parse_match(start, "one")) return 1;
|
||||||
|
if (parse_match(start, "two")) return 2;
|
||||||
|
if (parse_match(start, "six")) return 6;
|
||||||
|
}
|
||||||
|
if (length >= 4) {
|
||||||
|
if (parse_match(start, "four")) return 4;
|
||||||
|
if (parse_match(start, "five")) return 5;
|
||||||
|
if (parse_match(start, "nine")) return 9;
|
||||||
|
}
|
||||||
|
if (length >= 5) {
|
||||||
|
if (parse_match(start, "three")) return 3;
|
||||||
|
if (parse_match(start, "seven")) return 7;
|
||||||
|
if (parse_match(start, "eight")) return 8;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_digit_left(const char * start, const char * end, digit_parser_t parser)
|
||||||
|
{
|
||||||
|
while (start < end) {
|
||||||
|
int digit = parser(start, end);
|
||||||
|
if (digit >= 0) {
|
||||||
|
return digit;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_digit_right(const char * start, const char * end, digit_parser_t parser)
|
||||||
|
{
|
||||||
|
const char * s = end - 1;
|
||||||
|
while (s >= start) {
|
||||||
|
int digit = parser(s, end);
|
||||||
|
if (digit >= 0) {
|
||||||
|
return digit;
|
||||||
|
}
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int solve(const char * input, int length, digit_parser_t parser)
|
||||||
|
{
|
||||||
|
const char * end = input + length;
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
|
||||||
|
while (input < end) {
|
||||||
|
const char * newline = parse_find(input, '\n');
|
||||||
|
int left = parse_digit_left(input, newline, parser);
|
||||||
|
int right = parse_digit_right(input, newline, parser);
|
||||||
|
|
||||||
|
sum += left * 10 + right;
|
||||||
|
|
||||||
|
input = newline + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t _2023_day1_part1(const char * input, int length)
|
int64_t _2023_day1_part1(const char * input, int length)
|
||||||
{
|
{
|
||||||
return -1;
|
return solve(input, length, part1_digit_parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t _2023_day1_part2(const char * input, int length)
|
int64_t _2023_day1_part2(const char * input, int length)
|
||||||
{
|
{
|
||||||
return -1;
|
return solve(input, length, part2_digit_parser);
|
||||||
}
|
}
|
||||||
|
1
Makefile
1
Makefile
@ -13,6 +13,7 @@ CFLAGS += -Wno-char-subscripts
|
|||||||
LIB ?= $(MAKEFILE_PATH)/dreamcast
|
LIB ?= $(MAKEFILE_PATH)/dreamcast
|
||||||
|
|
||||||
libgcc/%.o: $(LIBGCC)
|
libgcc/%.o: $(LIBGCC)
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
ar x --output $(dir $@) $(LIBGCC) $(notdir $@)
|
ar x --output $(dir $@) $(LIBGCC) $(notdir $@)
|
||||||
sh4-none-elf-objdump -t $@ \
|
sh4-none-elf-objdump -t $@ \
|
||||||
| grep -E '[.]hidden' \
|
| grep -E '[.]hidden' \
|
||||||
|
@ -25,7 +25,7 @@ void open_input(int ix, char ** buf, int * length)
|
|||||||
|
|
||||||
void open_sample(int ix, int part, char ** buf, int * length)
|
void open_sample(int ix, int part, char ** buf, int * length)
|
||||||
{
|
{
|
||||||
if (ix < 1 || ix > input_size || part < 0 || part > 1) {
|
if (ix < 0 || ix > input_size || part < 0 || part > 1) {
|
||||||
*buf = NULL;
|
*buf = NULL;
|
||||||
*length = 0;
|
*length = 0;
|
||||||
} else {
|
} else {
|
||||||
|
46
parse.c
46
parse.c
@ -3,25 +3,6 @@
|
|||||||
|
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
|
|
||||||
const char * parse_skip(const char * s, char c)
|
|
||||||
{
|
|
||||||
while (*s == c) {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * parse_find_first_right(const char * s, int length, char c)
|
|
||||||
{
|
|
||||||
const char * ss = &s[length - 1];
|
|
||||||
while (ss >= s) {
|
|
||||||
if (*ss == c)
|
|
||||||
return ss;
|
|
||||||
ss--;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_base10_digit(char c)
|
int parse_base10_digit(char c)
|
||||||
{
|
{
|
||||||
switch (c) {
|
switch (c) {
|
||||||
@ -39,6 +20,33 @@ int parse_base10_digit(char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * parse_skip(const char * s, char c)
|
||||||
|
{
|
||||||
|
while (*s == c) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * parse_find(const char * s, char c)
|
||||||
|
{
|
||||||
|
while (*s != c) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * parse_find_first_right(const char * s, int length, char c)
|
||||||
|
{
|
||||||
|
const char * ss = &s[length - 1];
|
||||||
|
while (ss >= s) {
|
||||||
|
if (*ss == c)
|
||||||
|
return ss;
|
||||||
|
ss--;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
const char * parse_base10(const char * s, int * n)
|
const char * parse_base10(const char * s, int * n)
|
||||||
{
|
{
|
||||||
*n = 0;
|
*n = 0;
|
||||||
|
1
parse.h
1
parse.h
@ -7,6 +7,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char * parse_skip(const char * s, char c);
|
const char * parse_skip(const char * s, char c);
|
||||||
|
const char * parse_find(const char * s, char c);
|
||||||
const char * parse_find_first_right(const char * s, int length, char c);
|
const char * parse_find_first_right(const char * s, int length, char c);
|
||||||
int parse_base10_digit(char c);
|
int parse_base10_digit(char c);
|
||||||
const char * parse_base10(const char * s, int * n);
|
const char * parse_base10(const char * s, int * n);
|
||||||
|
13
runner.c
13
runner.c
@ -26,6 +26,7 @@ bool runner_tick(struct runner_state * runner_state)
|
|||||||
{
|
{
|
||||||
int tick = (solution_ticks - 1) - runner_state->tick;
|
int tick = (solution_ticks - 1) - runner_state->tick;
|
||||||
//int tick = runner_state->tick;
|
//int tick = runner_state->tick;
|
||||||
|
runner_state->tick += 1;
|
||||||
|
|
||||||
if (tick < 0) {
|
if (tick < 0) {
|
||||||
runner_state->want_render = false;
|
runner_state->want_render = false;
|
||||||
@ -37,18 +38,20 @@ bool runner_tick(struct runner_state * runner_state)
|
|||||||
int year = solution[ix].year;
|
int year = solution[ix].year;
|
||||||
int day = solution[ix].day;
|
int day = solution[ix].day;
|
||||||
|
|
||||||
|
if (year != 2023) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
runner_state->want_render = solution[ix].render != NULL;
|
runner_state->want_render = solution[ix].render != NULL;
|
||||||
|
|
||||||
char * buf;
|
char * buf;
|
||||||
int length;
|
int length;
|
||||||
open_sample(ix, part, &buf, &length);
|
//open_sample(ix, part, &buf, &length);
|
||||||
//open_input(ix, &buf, &length);
|
open_input(ix, &buf, &length);
|
||||||
int64_t answer = solution[day].part[part](buf, length);
|
int64_t answer = solution[ix].part[part](buf, length);
|
||||||
|
|
||||||
printf("%d day %d part %d: %l\n", year, day, part + 1, answer);
|
printf("%d day %d part %d: %l\n", year, day, part + 1, answer);
|
||||||
|
|
||||||
runner_state->tick += 1;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user