3 changed files with 102 additions and 0 deletions
			
			
		@ -0,0 +1,12 @@ | 
				
			|||
CFLAGS := -Wall -Wextra -std=c17 -D_GNU_SOURCE | 
				
			|||
 | 
				
			|||
#LIBS := glib-2.0
 | 
				
			|||
#CFLAGS += $(shell pkg-config --cflags $(LIBS))
 | 
				
			|||
#LDLIBS := $(shell pkg-config --libs $(LIBS))
 | 
				
			|||
 | 
				
			|||
.PHONY: all | 
				
			|||
all: main | 
				
			|||
 | 
				
			|||
.PHONY: clean | 
				
			|||
clean: | 
				
			|||
	rm -f main | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
447 players; last marble is worth 71510 points | 
				
			|||
@ -0,0 +1,89 @@ | 
				
			|||
#include <stdlib.h> | 
				
			|||
#include <stdio.h> | 
				
			|||
 | 
				
			|||
struct marble { | 
				
			|||
    struct marble *next; | 
				
			|||
    struct marble *prev; | 
				
			|||
    int value; | 
				
			|||
}; | 
				
			|||
 | 
				
			|||
void *xmalloc(size_t size) | 
				
			|||
{ | 
				
			|||
    void *res = malloc(size); | 
				
			|||
    if (!res) { | 
				
			|||
        perror("malloc"); | 
				
			|||
        exit(1); | 
				
			|||
    } | 
				
			|||
    return res; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void *xcalloc(size_t nmemb, size_t size) | 
				
			|||
{ | 
				
			|||
    void *res = calloc(nmemb, size); | 
				
			|||
    if (!res) { | 
				
			|||
        perror("calloc"); | 
				
			|||
        exit(1); | 
				
			|||
    } | 
				
			|||
    return res; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
int main(int argc, char *argv[]) | 
				
			|||
{ | 
				
			|||
    if (argc <= 2) { | 
				
			|||
        fprintf(stderr, "Usage: %s <players> <marbles>\n", argv[0]); | 
				
			|||
        return 1; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    int players = strtol(argv[1], NULL, 0); | 
				
			|||
    int marbles = strtol(argv[2], NULL, 0) * 100; | 
				
			|||
    if (!players || marbles <= 1) return 1; | 
				
			|||
 | 
				
			|||
    unsigned *scores = xcalloc(players, sizeof(unsigned)); | 
				
			|||
    int player = 0; | 
				
			|||
 | 
				
			|||
    struct marble *current = xmalloc(sizeof(struct marble)); | 
				
			|||
    current->next = current; | 
				
			|||
    current->prev = current; | 
				
			|||
    current->value = 0; | 
				
			|||
 | 
				
			|||
    for (int i = 1; i <= marbles; i++) { | 
				
			|||
        if (i % 23 == 0) { | 
				
			|||
            scores[player] += i; | 
				
			|||
            for (int i = 0; i < 7; i++) { | 
				
			|||
                current = current->prev; | 
				
			|||
            } | 
				
			|||
            scores[player] += current->value; | 
				
			|||
            current->prev->next = current->next; | 
				
			|||
            current->next->prev = current->prev; | 
				
			|||
 | 
				
			|||
            struct marble *remove = current; | 
				
			|||
            current = current->next; | 
				
			|||
            free(remove); | 
				
			|||
        } else { | 
				
			|||
            current = current->next; | 
				
			|||
            struct marble *new = xmalloc(sizeof(struct marble)); | 
				
			|||
            new->next = current->next; | 
				
			|||
            new->prev = current; | 
				
			|||
            new->next->prev = new; | 
				
			|||
            new->prev->next = new; | 
				
			|||
            new->value = i; | 
				
			|||
            current = new; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        if (++player >= players) player = 0; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    unsigned highest = 0; | 
				
			|||
    for (unsigned *score = scores; score < scores + players; score++) { | 
				
			|||
        if (*score > highest) highest = *score; | 
				
			|||
    } | 
				
			|||
    printf("Highest score: %u\n", highest); | 
				
			|||
 | 
				
			|||
    current->prev->next = NULL; | 
				
			|||
    while (current->next) { | 
				
			|||
        current = current->next; | 
				
			|||
        free(current->prev); | 
				
			|||
    } | 
				
			|||
    free(current); | 
				
			|||
    return 0; | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue