solved 9a and b, but needed another testcase to find the bug... ob1
This commit is contained in:
parent
007f32ac40
commit
721b69ae20
12 changed files with 520 additions and 0 deletions
BIN
8/a.out
Executable file
BIN
8/a.out
Executable file
Binary file not shown.
50
8/input
Normal file
50
8/input
Normal file
|
@ -0,0 +1,50 @@
|
|||
...........g......................................
|
||||
......e.g......s.............R...........I........
|
||||
............g........................I............
|
||||
..b......Q....s.....................P.............
|
||||
.......e..T...................K...........P...F...
|
||||
.....g................U.............4.............
|
||||
.........b..........4..RU..................1.F....
|
||||
....a.....Q..........b........R..U...............1
|
||||
.S...T............s.............I.........f.......
|
||||
...A....T...............................I.........
|
||||
.....Qa............A.G...K...........P............
|
||||
...........................G................1.....
|
||||
...D...................................4.f........
|
||||
..................................................
|
||||
................k.......R....................t....
|
||||
.........T.e..............K........u.......t......
|
||||
....................A.............................
|
||||
......S....a.............F...........KG...........
|
||||
....D...h......k..................................
|
||||
..D...............k............................4..
|
||||
..............................................i...
|
||||
.........S..................d.....................
|
||||
......QU....S......s..d...G............i..........
|
||||
...........d....9...F.h...E.......................
|
||||
.................d....B...........................
|
||||
...h........................H.......t.............
|
||||
.........h.B..3.E.............H..r................
|
||||
.......E......B......2...5.....H..................
|
||||
.z...........9................................t...
|
||||
.....9...D........................................
|
||||
.....Z.......39..a................................
|
||||
..........3.............r.........................
|
||||
...............Er.............................7...
|
||||
.........................J...k.r.q.......i.8.p....
|
||||
.......................u...............H.p..q.....
|
||||
..............................i.u6........p.......
|
||||
....................................0.............
|
||||
...............3..J....P...0......................
|
||||
........................2j........................
|
||||
...............................j2B0...............
|
||||
................J..2...5.....6......p....8........
|
||||
............y.........................7...........
|
||||
..............5.........y...........6.............
|
||||
................................j.................
|
||||
.........................Y.J.....0................
|
||||
.........................................y........
|
||||
..................Z...uy...................q......
|
||||
.......z.........Z............Y.6.............8...
|
||||
z.........................Y..........7............
|
||||
....................Z...5..Y......................
|
12
8/inputDemo
Normal file
12
8/inputDemo
Normal file
|
@ -0,0 +1,12 @@
|
|||
............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............
|
106
8/main.c
Normal file
106
8/main.c
Normal file
|
@ -0,0 +1,106 @@
|
|||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdbool.h>
|
||||
#include<unistd.h>
|
||||
|
||||
struct antenna {
|
||||
char type;
|
||||
int xy[2];
|
||||
struct antenna *next;
|
||||
};
|
||||
|
||||
void add_antenna(struct antenna *head, char type, int *xy)
|
||||
{
|
||||
// traverse list until last member
|
||||
while(head->next) head = head->next;
|
||||
|
||||
// allocate and store ptr
|
||||
if (head->type) {
|
||||
head->next = malloc(sizeof(struct antenna));
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
head->type = type;
|
||||
head->xy[0] = xy[0];
|
||||
head->xy[1] = xy[1];
|
||||
head->next = 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
struct antenna *list = malloc(sizeof(struct antenna));
|
||||
list->type = '\0';
|
||||
// figure out data dimensions
|
||||
FILE *input = fopen("./input", "r");
|
||||
int width = 0;
|
||||
int height = 1;
|
||||
while (fgetc(input) != '\n') width++;
|
||||
for (char c = fgetc(input); c != EOF; c = fgetc(input)) {
|
||||
if (c == '\n')
|
||||
height++;
|
||||
}
|
||||
rewind(input);
|
||||
printf("Dimensions: %d x %d\n", width, height);
|
||||
|
||||
// make 2d array
|
||||
char **grid = malloc(width * sizeof(char*));
|
||||
grid[0] = malloc(width * height);
|
||||
for (int i = 1; i < width; i++) {
|
||||
grid[i] = grid[0] + i * height;
|
||||
}
|
||||
|
||||
// put the data in the array
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width; j++) {
|
||||
grid[j][i] = fgetc(input);
|
||||
if (grid[j][i] != '.') {
|
||||
// store antenna in list
|
||||
int xy[] = {j, i};
|
||||
add_antenna(list, grid[j][i], xy);
|
||||
printf("Antenna %c coords: %d/%d\n", grid[j][i], j, i);
|
||||
}
|
||||
}
|
||||
// skip newline
|
||||
fgetc(input);
|
||||
}
|
||||
fclose(input);
|
||||
|
||||
struct antenna *current = list;
|
||||
struct antenna *other = list;
|
||||
// for each antenna in list
|
||||
while (current) {
|
||||
// find delta to other of same frequency
|
||||
while (other) {
|
||||
if (current->type == other->type && current != other) {
|
||||
int delta[2];
|
||||
delta[0] = other->xy[0] - current->xy[0];
|
||||
delta[1] = other->xy[1] - current->xy[1];
|
||||
// apply # to other + delta
|
||||
if (
|
||||
(other->xy[0] + delta[0]) >= 0 &&
|
||||
(other->xy[0] + delta[0]) < width &&
|
||||
(other->xy[1] + delta[1]) >= 0 &&
|
||||
(other->xy[1] + delta[1]) < height) {
|
||||
grid[other->xy[0] + delta[0]][other->xy[1] + delta[1]] = '#';
|
||||
}
|
||||
}
|
||||
other = other->next;
|
||||
}
|
||||
other = list;
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
// iterate through array again and sum it
|
||||
int sum_x = 0;
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width; j++) {
|
||||
if (grid[j][i] == '#')
|
||||
sum_x++;
|
||||
printf("%c", grid[j][i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("total antinodes: %d\n", sum_x);
|
||||
}
|
121
8/mainB.c
Normal file
121
8/mainB.c
Normal file
|
@ -0,0 +1,121 @@
|
|||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdbool.h>
|
||||
#include<unistd.h>
|
||||
|
||||
struct antenna {
|
||||
char type;
|
||||
int xy[2];
|
||||
struct antenna *next;
|
||||
};
|
||||
|
||||
void add_antenna(struct antenna *head, char type, int *xy)
|
||||
{
|
||||
// traverse list until last member
|
||||
while(head->next) head = head->next;
|
||||
|
||||
// allocate and store ptr
|
||||
if (head->type) {
|
||||
head->next = malloc(sizeof(struct antenna));
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
head->type = type;
|
||||
head->xy[0] = xy[0];
|
||||
head->xy[1] = xy[1];
|
||||
head->next = 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
struct antenna *list = malloc(sizeof(struct antenna));
|
||||
list->type = '\0';
|
||||
// figure out data dimensions
|
||||
FILE *input = fopen("./input", "r");
|
||||
int width = 0;
|
||||
int height = 1;
|
||||
while (fgetc(input) != '\n') width++;
|
||||
for (char c = fgetc(input); c != EOF; c = fgetc(input)) {
|
||||
if (c == '\n')
|
||||
height++;
|
||||
}
|
||||
rewind(input);
|
||||
printf("Dimensions: %d x %d\n", width, height);
|
||||
|
||||
// make 2d array
|
||||
char **grid = malloc(width * sizeof(char*));
|
||||
grid[0] = malloc(width * height);
|
||||
for (int i = 1; i < width; i++) {
|
||||
grid[i] = grid[0] + i * height;
|
||||
}
|
||||
|
||||
// put the data in the array
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width; j++) {
|
||||
grid[j][i] = fgetc(input);
|
||||
if (grid[j][i] != '.') {
|
||||
// store antenna in list
|
||||
int xy[] = {j, i};
|
||||
add_antenna(list, grid[j][i], xy);
|
||||
printf("Antenna %c coords: %d/%d\n", grid[j][i], j, i);
|
||||
}
|
||||
}
|
||||
// skip newline
|
||||
fgetc(input);
|
||||
}
|
||||
fclose(input);
|
||||
|
||||
struct antenna *current = list;
|
||||
struct antenna *other = list;
|
||||
// for each antenna in list
|
||||
while (current) {
|
||||
// find delta to other of same frequency
|
||||
while (other) {
|
||||
if (current->type == other->type && current != other) {
|
||||
int delta[2];
|
||||
delta[0] = other->xy[0] - current->xy[0];
|
||||
delta[1] = other->xy[1] - current->xy[1];
|
||||
// apply # to other + delta
|
||||
int pos[2] = {other->xy[0], other->xy[1]};
|
||||
while (
|
||||
(pos[0] + delta[0]) >= 0 &&
|
||||
(pos[0] + delta[0]) < width &&
|
||||
(pos[1] + delta[1]) >= 0 &&
|
||||
(pos[1] + delta[1]) < height) {
|
||||
pos[0] = pos[0] + delta[0];
|
||||
pos[1] = pos[1] + delta[1];
|
||||
grid[pos[0]][pos[1]] = '#';
|
||||
}
|
||||
pos[0] = other->xy[0];
|
||||
pos[1] = other->xy[1];
|
||||
while (
|
||||
(pos[0] - delta[0]) >= 0 &&
|
||||
(pos[0] - delta[0]) < width &&
|
||||
(pos[1] - delta[1]) >= 0 &&
|
||||
(pos[1] - delta[1]) < height) {
|
||||
pos[0] = pos[0] - delta[0];
|
||||
pos[1] = pos[1] - delta[1];
|
||||
grid[pos[0]][pos[1]] = '#';
|
||||
}
|
||||
|
||||
}
|
||||
other = other->next;
|
||||
}
|
||||
other = list;
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
// iterate through array again and sum it
|
||||
int sum_x = 0;
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width; j++) {
|
||||
if (grid[j][i] == '#')
|
||||
sum_x++;
|
||||
printf("%c", grid[j][i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("total antinodes: %d\n", sum_x);
|
||||
}
|
BIN
9/a.out
Executable file
BIN
9/a.out
Executable file
Binary file not shown.
1
9/input
Normal file
1
9/input
Normal file
File diff suppressed because one or more lines are too long
1
9/input2
Normal file
1
9/input2
Normal file
|
@ -0,0 +1 @@
|
|||
12101
|
1
9/inputDemo
Normal file
1
9/inputDemo
Normal file
|
@ -0,0 +1 @@
|
|||
2333133121414131402
|
89
9/main.c
Normal file
89
9/main.c
Normal file
|
@ -0,0 +1,89 @@
|
|||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdbool.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
// figure out data dimensions
|
||||
FILE *input = fopen("./input", "r");
|
||||
int width = 0;
|
||||
bool flip = 1;
|
||||
|
||||
unsigned int dataSum = 0;
|
||||
unsigned int dataID = 0;
|
||||
int dataSlot = 0;
|
||||
|
||||
for (char c = fgetc(input); c != EOF && c != '\n'; c = fgetc(input)) {
|
||||
dataSum += c - '0';
|
||||
width++;
|
||||
}
|
||||
rewind(input);
|
||||
printf("Length: %d\ndataSum: %u\n", width, dataSum);
|
||||
unsigned int *memory = malloc(dataSum * sizeof(int));
|
||||
// -1 represents empty memory
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
memory[i] = -1;
|
||||
}
|
||||
|
||||
// time to fill the array
|
||||
for (int i = 0; i < width; i++) {
|
||||
char c = fgetc(input);
|
||||
if (c == EOF) {
|
||||
printf("breakbreakbreak!\n");
|
||||
break;
|
||||
}
|
||||
// fan ska ju bara vara varannan som är data, resten free space
|
||||
// flipflopflipflop ^
|
||||
for (int j = 0; j < (c - '0'); j++) {
|
||||
if (flip) {
|
||||
memory[dataSlot] = dataID;
|
||||
printf("%u", memory[dataSlot]);
|
||||
} else {
|
||||
memory[dataSlot] = -1;
|
||||
printf(".");
|
||||
}
|
||||
dataSlot++;
|
||||
}
|
||||
if (flip)
|
||||
dataID++;
|
||||
flip ^= true;
|
||||
}
|
||||
fclose(input);
|
||||
printf("\n");
|
||||
|
||||
// it's compacting time!
|
||||
// start at end of array, save id, overwrite, put in first free spot
|
||||
int lastWrite = 0;
|
||||
for (int i = dataSum - 1; i >= 0; i--) {
|
||||
if (memory[i] == -1)
|
||||
continue;
|
||||
if (lastWrite >= i)
|
||||
goto exitDaLoop;
|
||||
int tmp = memory[i];
|
||||
memory[i] = -1;
|
||||
for (; lastWrite < dataSum; lastWrite++) {
|
||||
if (memory[lastWrite] == -1) {
|
||||
memory[lastWrite] = tmp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
exitDaLoop:
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
if (memory[i] != -1)
|
||||
printf("%u", memory[i]);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
// now hash time
|
||||
unsigned long int hash = 0;
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
if (memory[i] != -1)
|
||||
hash += memory[i] * i;
|
||||
}
|
||||
|
||||
free(memory);
|
||||
printf("\n%lu\n", hash);
|
||||
}
|
134
9/mainB.c
Normal file
134
9/mainB.c
Normal file
|
@ -0,0 +1,134 @@
|
|||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdbool.h>
|
||||
|
||||
int put_it_in(unsigned int *memory, char *diskMap, unsigned int dataID, unsigned long int dataSum)
|
||||
{
|
||||
int dataLen = diskMap[dataID * 2] - '0';
|
||||
int availableIndex = 0;
|
||||
int avail = 0;
|
||||
|
||||
// find start of dataID
|
||||
int start = 0;
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
if (memory[i] == dataID) {
|
||||
start = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// find free space
|
||||
for (int i = 0; i <= start; i++) {
|
||||
if ( i == start)
|
||||
return 0;
|
||||
if (memory[i] != -1) {
|
||||
availableIndex = 0;
|
||||
avail = 0;
|
||||
continue;
|
||||
}
|
||||
if (memory[i] == -1) {
|
||||
if (!availableIndex)
|
||||
availableIndex = i;
|
||||
avail++;
|
||||
}
|
||||
if (avail >= dataLen)
|
||||
break;
|
||||
}
|
||||
// write the file to this space
|
||||
for (int i = 0; i < dataLen; i++) {
|
||||
memory[availableIndex + i] = dataID;
|
||||
}
|
||||
|
||||
// remove the original file
|
||||
for (int i = dataSum - 1; i >= availableIndex + dataLen; i--) {
|
||||
if (memory[i] == dataID) {
|
||||
for (int j = 0; j < dataLen; j++) {
|
||||
memory[i - j] = -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
// figure out data dimensions
|
||||
FILE *input = fopen("./input", "r");
|
||||
int width = 0;
|
||||
bool flip = 1;
|
||||
|
||||
unsigned long int dataSum = 0;
|
||||
unsigned int dataID = 0;
|
||||
int dataSlot = 0;
|
||||
|
||||
for (char c = fgetc(input); c != EOF && c != '\n'; c = fgetc(input)) {
|
||||
dataSum += c - '0';
|
||||
width++;
|
||||
}
|
||||
rewind(input);
|
||||
printf("Length: %d\ndataSum: %u\n", width, dataSum);
|
||||
// save diskMap, cuz diskMap[dataID * 2] is the file length
|
||||
unsigned int *memory = malloc(dataSum * sizeof(int));
|
||||
char *diskMap = malloc(width * sizeof(char));
|
||||
//
|
||||
// -1 represents empty memory
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
memory[i] = -1;
|
||||
}
|
||||
|
||||
// time to fill the array
|
||||
for (int i = 0; i < width; i++) {
|
||||
char c = fgetc(input);
|
||||
diskMap[i] = c;
|
||||
if (c == EOF) {
|
||||
printf("breakbreakbreak!\n");
|
||||
break;
|
||||
}
|
||||
// fan ska ju bara vara varannan som är data, resten free space
|
||||
// flipflopflipflop ^
|
||||
for (int j = 0; j < (c - '0'); j++) {
|
||||
if (flip) {
|
||||
memory[dataSlot] = dataID;
|
||||
printf("%u", memory[dataSlot]);
|
||||
} else {
|
||||
memory[dataSlot] = -1;
|
||||
printf(".");
|
||||
}
|
||||
dataSlot++;
|
||||
}
|
||||
if (flip)
|
||||
dataID++;
|
||||
flip ^= true;
|
||||
}
|
||||
fclose(input);
|
||||
printf("\n");
|
||||
|
||||
// it's compacting time!
|
||||
// start at end of array, save id, overwrite, put in first free spot
|
||||
unsigned int lastID = - 1;
|
||||
for (int i = dataSum - 1; i >= 0; i--) {
|
||||
if (memory[i] < lastID) {
|
||||
lastID = memory[i];
|
||||
put_it_in(memory, diskMap, lastID, dataSum);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
if (memory[i] != -1)
|
||||
printf("%u ", memory[i]);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
// now hash time
|
||||
unsigned long int hash = 0;
|
||||
for (int i = 0; i < dataSum; i++) {
|
||||
if (memory[i] != -1)
|
||||
hash += memory[i] * i;
|
||||
}
|
||||
|
||||
free(memory);
|
||||
printf("\n%lu\n", hash);
|
||||
}
|
5
9/testout
Normal file
5
9/testout
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue