Initial commit

Juliana Rat 2 years ago
commit 191721ca7d

@ -0,0 +1,99 @@
/*
* IntComp.c - Advent of Code 2019 Day 2 Intcode Computer
*
* Copyright 2019 Jacob Sims <jtsims@pm.me>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Usage: ./IntComp filename [name verb]\n");
return 1;
}
char *filename = argv[1];
FILE *input = fopen(filename, "r");
if (input == NULL)
{
fprintf(stderr, "Could not open %s\n", filename);
return 2;
}
char *buf = NULL;
size_t n = 0;
int memory[500];
int address = 0;
// Read the program into memory
while (getdelim(&buf, &n, ',', input) != -1)
{
memory[address] = strtod(buf, NULL);
address++;
}
fclose(input);
// Add noun and verb values, if necessary
if (argc == 4 && !strcmp(filename, "main.txt"))
{
int noun = strtod(argv[2], NULL);
int verb = strtod(argv[3], NULL);
opcode[1] = noun;
opcode[2] = verb;
}
// Run the program
for (int i = 0; memory[i] != 99; i += 4)
{
int param1 = memory[memory[i + 1]];
int param2 = memory[memory[i + 2]];
int storeparam = memory[i + 3];
switch (memory[i])
{
case 1:
memory[storeparam] = param1 + param2;
break;
case 2:
memory[storeparam] = param1 * param2;
break;
default:
fprintf(stderr, "Unknown instruction\n");
return 3;
}
}
// Printf the output
printf("Address 0: %i\n", memory[0]);
return 0;
}

@ -0,0 +1,54 @@
/*
* AoC1.c - Advent of Code 2019 Day 1
*
* Given a certain mass, the amount of fuel required is calculated by
* floor dividing (dividing and rounding down) the mass by 3 then
* subtracting two. The masses in question are in 'mass-input.txt' in
* newline-divided format. The result is all of these masses' fuel
* requirements added together.
*
* Provides the correct answer.
*
* Jacob Sims (jtsims@pm.me) 2019-12-03
*
*/
#include <stdio.h>
#include <stdlib.h>
int calculateFuel(int to_lift);
int main(int argc, char **argv)
{
FILE *input = fopen("mass-input.txt", "r");
if (input == NULL)
{
fprintf(stderr, "Could not open input file\n");
return 1;
}
char *buf = NULL;
size_t n = 0;
int reqfuel;
int mass;
while (getline(&buf, &n, input) != -1)
{
mass = strtod(buf, NULL);
reqfuel += calculateFuel(mass);
}
fclose(input);
free(buf);
printf("Total fuel: %i\n", reqfuel);
return 0;
}
int calculateFuel(int to_lift)
{
int fuel = (to_lift / 3) - 2;
return fuel <= 0 ? 0 : fuel + calculateFuel(fuel);
}

@ -0,0 +1,100 @@
83453
89672
81336
74923
71474
117060
55483
116329
123515
99383
80314
108221
128335
72860
139235
127843
140120
63561
68854
109062
146211
59096
123085
105763
127657
142212
111007
100166
63641
59010
108575
93619
144095
74561
95059
145318
81404
96567
91799
92987
107137
87678
126842
85594
116330
104714
128117
132641
75602
90747
69038
67322
146147
147535
83266
85908
124634
51681
104430
56202
68631
69970
116985
140878
125357
126229
66379
103213
108210
73855
130992
113363
82298
111468
110751
52272
103661
122262
114363
80881
65183
125291
100119
56995
101634
55467
136284
107433
95647
71462
133265
104554
62499
61347
68675
123501
113954
135798
80825
128235

@ -0,0 +1,114 @@
/*
* AoC2.c - Advent of Code 2019 Day 2 Intcode Computer
*
* Copyright 2019 Jacob Sims <jtsims@pm.me>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compute(int *program, int noun, int verb);
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Usage: ./aoc filename\n");
exit(1);
}
char *filename = argv[1];
FILE *input = fopen(filename, "r");
if (input == NULL)
{
fprintf(stderr, "Could not open %s\n", filename);
exit(2);
}
char *buf;
size_t n;
int address;
int memory[500];
for (int verb = 0; verb < 100; verb++)
{
for (int noun = 0; noun < 100; noun++)
{
buf = NULL;
n = 0;
address = 0;
fseek(input, 0, SEEK_SET);
while (getdelim(&buf, &n, ',', input) != -1)
{
memory[address] = strtod(buf, NULL);
address++;
}
if (compute(memory, noun, verb) == 19690720)
{
printf("Noun: %i\nVerb: %i\n", noun, verb);
break;
}
}
}
fclose(input);
free(buf);
exit(0);
}
int compute(int *program, int noun, int verb)
{
program[1] = noun;
program[2] = verb;
// Run the program
for (int i = 0; program[i] != 99; i += 4)
{
int param1 = program[program[i + 1]];
int param2 = program[program[i + 2]];
int storeparam = program[i + 3];
switch (program[i])
{
case 1:
program[storeparam] = param1 + param2;
break;
case 2:
program[storeparam] = param1 * param2;
break;
default:
printf("Unknown instruction\n");
return 1;
}
}
return program[0];
}

@ -0,0 +1 @@
1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,6,19,23,2,23,6,27,1,5,27,31,1,10,31,35,2,6,35,39,1,39,13,43,1,43,9,47,2,47,10,51,1,5,51,55,1,55,10,59,2,59,6,63,2,6,63,67,1,5,67,71,2,9,71,75,1,75,6,79,1,6,79,83,2,83,9,87,2,87,13,91,1,10,91,95,1,95,13,99,2,13,99,103,1,103,10,107,2,107,10,111,1,111,9,115,1,115,2,119,1,9,119,0,99,2,0,14,0

@ -0,0 +1 @@
1,0,0,0,99

@ -0,0 +1 @@
2,3,0,3,99

@ -0,0 +1 @@
2,4,4,5,99,0

@ -0,0 +1 @@
1,1,1,4,99,5,6,0,99

@ -0,0 +1,148 @@
/*
* AoC3.c - Advent of Code 2019 Day 3
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct step
{
char direction;
int distance;
};
struct coord
{
int x;
int y;
};
#define TOTAL_STEPS 301
#define TOTAL_COORDS 131072
void readIn(struct step *to_fill, FILE *input);
/* returns length of line */
int calculatePath(struct step *line, struct coord *coordlist, size_t size);
int main(int argc, char **argv)
{
/* open files, create arrays, and read in */
FILE *input1 = fopen("directions1.txt", "r");
if (input1 == NULL)
{
fprintf(stderr, "Cannot open first input file\n");
exit(1);
}
FILE *input2 = fopen("directions2.txt", "r");
if (input2 == NULL)
{
fprintf(stderr, "Cannot open second input file\n");
exit(1);
}
struct step line1[TOTAL_STEPS];
struct step line2[TOTAL_STEPS];
readIn(line1, input1);
readIn(line2, input2);
fclose(input1);
fclose(input2);
struct coord *coordlist1 = malloc(sizeof(struct coord) * TOTAL_COORDS);
struct coord *coordlist2 = malloc(sizeof(struct coord) * TOTAL_COORDS);
if (coordlist1 == NULL || coordlist2 == NULL)
{
fprintf(stderr, "Insufficient memory for allocation\n");
exit(2);
}
/*int length1 = */calculatePath(line1, coordlist1, TOTAL_COORDS);
/*int length2 = */calculatePath(line2, coordlist2, TOTAL_COORDS);
for (int i = 0; i < 27603; i++)
{
printf("List 1 step %d x: %d\n", i, coordlist1[i].x);
printf("List 1 step %d y: %d\n", i, coordlist1[i].y);
printf("List 2 step %d x: %d\n", i, coordlist2[i].x);
printf("List 2 step %d y: %d\n", i, coordlist2[i].y);
}
free(coordlist1);
free(coordlist2);
return 0;
}
/* reads in a coordinate CSV file */
void readIn(struct step *to_fill, FILE *input)
{
int index = 0;
size_t n = 0;
char *buf = NULL;
struct step *ptr = to_fill;
// iterate over CSV file
while (getdelim(&buf, &n, ',', input) != -1)
{
// interprete a value by dividing it into direction and distance
sscanf(buf, "%[DLRU]%d", &ptr[index].direction, &ptr[index].distance);
index++;
}
free(buf);
}
/* compute and store the entire path of one line */
int calculatePath(struct step *line, struct coord *coordlist, size_t size)
{
// tracker variables
int x = 0;
int y = 0;
int preceding_steps = 0;
int distance;
// iterate over each direction-distance pair
for (int i = 0; i < TOTAL_STEPS; i++)
{
distance = line[i].distance;
if ((distance + preceding_steps) >= size)
{
size *= 2;
coordlist = (struct coord *)realloc(coordlist, sizeof(struct coord) * size);
}
// store every coordinate following the path of this straight line
for (int k = 0; k < distance; k++)
{
coordlist[k + preceding_steps].x = x;
coordlist[k + preceding_steps].y = y;
// check direction and iterate appropriate value
switch (line[i].direction)
{
case 'R':
x++;
break;
case 'L':
x--;
break;
case 'U':
y++;
break;
case 'D':
y--;
break;
default:
fprintf(stderr, "Path computation error; no valid direction\n");
exit(2);
}
}
preceding_steps += distance;
}
return preceding_steps;
}

@ -0,0 +1,66 @@
/*
* AoC3.c - Advent of Code 2019 Day 3
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct step
{
char direction;
int distance;
};
// total steps: 301 for each line
int main(int argc, char **argv)
{
FILE *input = fopen("directions.txt", "r");
if (input == NULL)
{
fprintf(stderr, "Cannot open input file\n");
exit(1);
}
size_t n = 0;
char *buf = NULL;
int total_steps = 500;
struct step line1[total_steps];
struct step line2[total_steps];
struct step *ptr = line1;
int index = 0;
while(getdelim(&buf, &n, ',', input) != -1)
{
sscanf(buf, "%[DLRU]%d", &ptr[index].direction, &ptr[index].distance);
for (int i = 0; i < n; i++)
{
if (buf[i] == '\n')
{
buf[i] = ' ';
ptr = line2;
index = 0;
sscanf(buf, "%[DLRU]%d", &ptr[index].direction, &ptr[index].distance);
break;
}
buf[i] = ' ';
}
index++;
}
fclose(input);
free(buf);
for (int i = 0; i < 301; i++)
{
printf("Line 1 direction: %c\n", (char) line1[i].direction);
printf("Line 1 distance: %i\n", line1[i].distance);
printf("Line 2 direction: %c\n", (char) line2[i].direction);
printf("Line 2 distance: %i\n", line2[i].distance);
}
return 0;
}

Binary file not shown.

@ -0,0 +1,2 @@
R990,U475,L435,D978,L801,D835,L377,D836,L157,D84,R329,D342,R931,D522,L724,U891,L508,U274,L146,U844,R686,D441,R192,U992,L781,D119,R436,D286,R787,D85,L801,U417,R619,D710,R42,U261,R296,U697,L354,D843,R613,U880,R789,D134,R636,D738,L939,D459,L338,D905,R811,D950,L44,U992,R845,U771,L563,D76,L69,U839,L57,D311,L615,D931,L437,D201,L879,D1,R978,U415,R548,D398,L560,D112,L894,D668,L708,D104,R622,D768,R901,D746,L793,D26,R357,U216,L216,D33,L653,U782,R989,U678,L7,D649,R860,D281,L988,U362,L525,U652,R620,D376,L983,U759,R828,D669,L297,U207,R68,U77,R255,U269,L661,U310,L309,D490,L55,U471,R260,D912,R691,D62,L63,D581,L289,D366,L862,D360,L485,U946,R937,D470,L792,D614,R936,D963,R611,D151,R908,D195,R615,U768,L166,D314,R640,U47,L161,U872,R50,U694,L917,D149,L92,U244,L337,U479,R755,U746,L196,D759,L936,U61,L744,D774,R53,U439,L185,D504,R769,D696,L285,D396,R791,U21,L35,D877,L9,U398,R447,U101,R590,U862,L351,D210,L935,U938,R131,U758,R99,U192,L20,U142,L946,D981,R998,U214,R174,U710,L719,D879,L411,U839,L381,U924,L221,D397,R380,U715,R139,D367,R253,D973,L9,U624,L426,D885,R200,U940,R214,D75,R717,D2,R578,U161,R421,U326,L561,U311,L701,U259,R836,D920,R35,D432,R610,D63,R664,D39,L119,D47,L605,D228,L364,D14,L226,D365,R796,D233,R476,U145,L926,D907,R681,U267,R844,U735,L948,U344,L629,U31,L383,U694,L666,U158,R841,D27,L150,D950,L335,U275,L184,D157,R504,D602,R605,D185,L215,D420,R700,U809,L139,D937,L248,U693,L56,U92,L914,U743,R445,U417,L504,U23,R332,U865,R747,D553,R595,U845,R693,U915,R81
L1004,U406,L974,D745,R504,D705,R430,D726,R839,D550,L913,D584,R109,U148,L866,U664,R341,U449,L626,D492,R716,U596,L977,D987,L47,U612,L478,U928,L66,D752,R665,U415,R543,U887,R315,D866,R227,D615,R478,U180,R255,D316,L955,U657,R752,U561,R786,U7,R918,D755,R506,U131,L875,D849,R823,D755,L604,U944,R186,D326,L172,U993,L259,D765,R427,D193,R663,U470,L294,D437,R645,U10,L926,D814,L536,D598,R886,D290,L226,U156,R754,D105,L604,D136,L883,U87,R839,D807,R724,U184,L746,D79,R474,U186,R727,U9,L69,U565,R459,D852,R61,U370,L890,D439,L431,U846,R460,U358,R51,D407,R55,U179,L385,D652,R193,D52,L569,U980,L185,U813,R636,D275,L585,U590,R215,U947,R851,D127,L249,U954,L884,D235,R3,U735,R994,D883,L386,D506,L963,D751,L989,U733,L221,U890,L711,D32,L74,U437,L700,D977,L49,U478,R438,D27,R945,D670,L230,U863,L616,U461,R267,D25,L646,D681,R426,D918,L791,U712,L730,U715,L67,U359,R915,D524,L722,U374,L582,U529,L802,D865,L596,D5,R323,U235,R405,D62,R304,U996,L939,U420,L62,D299,R802,D803,L376,U430,L810,D334,L67,U395,L818,U953,L817,D411,L225,U383,R247,D234,L430,U315,L418,U254,L964,D372,R979,D301,R577,U440,R924,D220,L121,D785,L609,U20,R861,U288,R388,D410,L278,D748,L800,U755,L919,D985,L785,U676,R916,D528,L507,D469,L582,D8,L900,U512,L764,D124,L10,U567,L379,D231,R841,D244,R479,U145,L769,D845,R651,U712,L920,U791,R95,D958,L608,D755,R967,U855,R563,D921,L37,U699,L944,U718,R959,D195,L922,U726,R378,U258,R340,D62,L555,D135,L690,U269,L273,D851,L60,D851,R1,D315,R117,D855,L275,D288,R25,U503,R569,D596,L823,U687,L450

@ -0,0 +1 @@
R990,U475,L435,D978,L801,D835,L377,D836,L157,D84,R329,D342,R931,D522,L724,U891,L508,U274,L146,U844,R686,D441,R192,U992,L781,D119,R436,D286,R787,D85,L801,U417,R619,D710,R42,U261,R296,U697,L354,D843,R613,U880,R789,D134,R636,D738,L939,D459,L338,D905,R811,D950,L44,U992,R845,U771,L563,D76,L69,U839,L57,D311,L615,D931,L437,D201,L879,D1,R978,U415,R548,D398,L560,D112,L894,D668,L708,D104,R622,D768,R901,D746,L793,D26,R357,U216,L216,D33,L653,U782,R989,U678,L7,D649,R860,D281,L988,U362,L525,U652,R620,D376,L983,U759,R828,D669,L297,U207,R68,U77,R255,U269,L661,U310,L309,D490,L55,U471,R260,D912,R691,D62,L63,D581,L289,D366,L862,D360,L485,U946,R937,D470,L792,D614,R936,D963,R611,D151,R908,D195,R615,U768,L166,D314,R640,U47,L161,U872,R50,U694,L917,D149,L92,U244,L337,U479,R755,U746,L196,D759,L936,U61,L744,D774,R53,U439,L185,D504,R769,D696,L285,D396,R791,U21,L35,D877,L9,U398,R447,U101,R590,U862,L351,D210,L935,U938,R131,U758,R99,U192,L20,U142,L946,D981,R998,U214,R174,U710,L719,D879,L411,U839,L381,U924,L221,D397,R380,U715,R139,D367,R253,D973,L9,U624,L426,D885,R200,U940,R214,D75,R717,D2,R578,U161,R421,U326,L561,U311,L701,U259,R836,D920,R35,D432,R610,D63,R664,D39,L119,D47,L605,D228,L364,D14,L226,D365,R796,D233,R476,U145,L926,D907,R681,U267,R844,U735,L948,U344,L629,U31,L383,U694,L666,U158,R841,D27,L150,D950,L335,U275,L184,D157,R504,D602,R605,D185,L215,D420,R700,U809,L139,D937,L248,U693,L56,U92,L914,U743,R445,U417,L504,U23,R332,U865,R747,D553,R595,U845,R693,U915,R81

@ -0,0 +1 @@
L1004,U406,L974,D745,R504,D705,R430,D726,R839,D550,L913,D584,R109,U148,L866,U664,R341,U449,L626,D492,R716,U596,L977,D987,L47,U612,L478,U928,L66,D752,R665,U415,R543,U887,R315,D866,R227,D615,R478,U180,R255,D316,L955,U657,R752,U561,R786,U7,R918,D755,R506,U131,L875,D849,R823,D755,L604,U944,R186,D326,L172,U993,L259,D765,R427,D193,R663,U470,L294,D437,R645,U10,L926,D814,L536,D598,R886,D290,L226,U156,R754,D105,L604,D136,L883,U87,R839,D807,R724,U184,L746,D79,R474,U186,R727,U9,L69,U565,R459,D852,R61,U370,L890,D439,L431,U846,R460,U358,R51,D407,R55,U179,L385,D652,R193,D52,L569,U980,L185,U813,R636,D275,L585,U590,R215,U947,R851,D127,L249,U954,L884,D235,R3,U735,R994,D883,L386,D506,L963,D751,L989,U733,L221,U890,L711,D32,L74,U437,L700,D977,L49,U478,R438,D27,R945,D670,L230,U863,L616,U461,R267,D25,L646,D681,R426,D918,L791,U712,L730,U715,L67,U359,R915,D524,L722,U374,L582,U529,L802,D865,L596,D5,R323,U235,R405,D62,R304,U996,L939,U420,L62,D299,R802,D803,L376,U430,L810,D334,L67,U395,L818,U953,L817,D411,L225,U383,R247,D234,L430,U315,L418,U254,L964,D372,R979,D301,R577,U440,R924,D220,L121,D785,L609,U20,R861,U288,R388,D410,L278,D748,L800,U755,L919,D985,L785,U676,R916,D528,L507,D469,L582,D8,L900,U512,L764,D124,L10,U567,L379,D231,R841,D244,R479,U145,L769,D845,R651,U712,L920,U791,R95,D958,L608,D755,R967,U855,R563,D921,L37,U699,L944,U718,R959,D195,L922,U726,R378,U258,R340,D62,L555,D135,L690,U269,L273,D851,L60,D851,R1,D315,R117,D855,L275,D288,R25,U503,R569,D596,L823,U687,L450

@ -0,0 +1,200 @@
261
1773
1839
1551
1781
1276
1372
1668
1823
1870
1672
1821
1327
1902
1949
1389
1720
1437
1716
1360
1893
1410
1881
1927
1639
1514
1753
1625
1249
1696
1698
1699
2004
1742
1903
473
1948
1830
1973
2005
1468
1824
1809
1493
2009
1848
1306
1519
1618
1905
1402
1705
1910
1609
1571
1557
1420
608
1471
1383
1442
1447
1985
1486
1629
1450
1767
1407
1626
1623
1467
1224
1269
1325
1674
1945
1733
1913
1451
1853
1875
405
1500
1634
1570
1868
1510
1069
1296
1852
1287
1274
832
1373
1142
1838
1854
1480
1628
1632
1597
1761
1717
1684
1956
1351
1622
1941
1704
1926
1873
1393
1850
1898
1960
1673
1736
1901
1806
1768
1670
1989
1214
1851
1715
1461
1277
951
1482
1464
1883
1976
1602
1606
1258
1801
1593
1332
1386
1309
1388
1762
1533
1805
1462
375
1555
1357
1578
1552
1473
1834
1262
1466
1925
1955
1575
1975
1964
1440
1667
1922
1454
1813
1968
1836
1982
1326
1811
900
1588
1529
1997
1345
1859
1458
1764
1509
1397
1237
1627
1564
1814
1842
1679
1289
1957
1819
801
1350
1841
1803
1718
1966
1272
1636
1352
1496
1455
1488

@ -0,0 +1,41 @@
import std.conv;
import std.file;
import std.stdio;
import std.string;
int main(string[] args) {
if (args.length < 2) {
writeln("Usage: ./day1 input.file");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
writeln(fileName, " does not exist.");
return 2;
}
string[] entries = readText(args[1]).splitLines();
int sum;
foreach (a; entries) {
int x = a.to!int;
foreach (b; entries) {
int y = b.to!int;
if (x == y)
continue;
else
sum = x + y;
if (sum == 2020) {
writeln("Solution: ", a, " * ", b, " = ", x * y);
return 0;
}
}
}
return 3;
}

@ -0,0 +1,47 @@
import std.conv;
import std.file;
import std.stdio;
import std.string;
int main(string[] args) {
if (args.length < 2) {
writeln("Usage: ./day1 input.file");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
writeln(fileName, " does not exist.");
return 2;
}
string[] entries = readText(args[1]).splitLines();
int sum;
foreach (a; entries) {
int x = a.to!int;
foreach (b; entries) {
int y = b.to!int;
if (x == y)
continue;
foreach (c; entries) {
int z = c.to!int;
if (y == z || x == z)
continue;
else
sum = x + y + z;
if (sum == 2020) {
writeln("Solution: ", a, " * ", b, " * ", c, " = ", x * y * z);
return 0;
}
}
}
}
return 3;
}

@ -0,0 +1,93 @@
97
62
23
32
51
19
98
26
90
134
73
151
116
76
6
94
113
127
119
44
115
50
143
150
86
91
36
104
131
101
38
66
46
96
54
70
8
30
1
108
69
139
24
29
77
124
107
14
137
16
140
80
68
25
31
59
45
126
148
67
13
125
53
57
41
47
35
145
120
12
37
5
110
138
130
2
63
83
22
79
52
7
95
58
149
123
89
109
15
144
114
9
78

@ -0,0 +1,37 @@
import std.algorithm.sorting : sort;
import std.array : split;
import std.conv : to;
import std.file : exists, readText;
import std.stdio : stderr, writeln;
import std.string : splitLines;
int main(string[] args) {
if (args.length != 2) {
stderr.writeln("Usage: ./p1 file.name");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
stderr.writeln(fileName, " does not exist");
return 1;
}
string[] fileLines = fileName.readText.splitLines();
ulong[] nums;
foreach (line; fileLines)
nums ~= line.to!ulong;
nums.sort();
nums ~= nums[$-1] + 3;
ulong[ulong] numDifferences;
ulong last;
foreach (val; nums) {
numDifferences[val - last]++;
last = val;
}
writeln("Result: ", numDifferences[1]*numDifferences[3]);
return 0;
}

@ -0,0 +1,47 @@
/* The runtime for this is impractical - use the memoized version */
import std.algorithm.searching : canFind;
import std.algorithm.sorting : sort;
import std.array : split;
import std.conv : to;
import std.file : exists, readText;
import std.stdio : stderr, writeln;
import std.string : splitLines;
int main(string[] args) {
if (args.length != 2) {
stderr.writeln("Usage: ./p2 file.name");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
stderr.writeln(fileName, " does not exist");
return 1;
}
string[] fileLines = fileName.readText.splitLines();
ulong[] nums = [0];
foreach (line; fileLines)
nums ~= line.to!ulong;
nums.sort();
nums ~= nums[$-1] + 3;
ulong numPaths = createArrangements(nums, nums[0]);
writeln("Result: ", numPaths);
return 0;
}
ulong createArrangements(ulong[] nums, ulong val) {
ulong toRet;
foreach (mod; 1 .. 4) {
ulong toFind = val+mod;
if (toFind == nums[$-1])
return toRet + 1;
else if (nums.canFind(toFind))
toRet += createArrangements(nums, toFind);
}
return toRet;
}

@ -0,0 +1,46 @@
import std.algorithm.searching : canFind;
import std.algorithm.sorting : sort;
import std.array : split;
import std.conv : to;
import std.file : exists, readText;
import std.functional : memoize;
import std.stdio : stderr, writeln;
import std.string : splitLines;
int main(string[] args) {
if (args.length != 2) {
stderr.writeln("Usage: ./p2 file.name");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
stderr.writeln(fileName, " does not exist");
return 1;
}
string[] fileLines = fileName.readText.splitLines();
ulong[] nums = [0];
foreach (line; fileLines)
nums ~= line.to!ulong;
nums.sort();
nums ~= nums[$-1] + 3;
ulong numPaths = createArrangements(nums, nums[0]);
writeln("Result: ", numPaths);
return 0;
}
ulong createArrangements(ulong[] nums, ulong val) {
ulong toRet;
foreach (mod; 1 .. 4) {
ulong toFind = val+mod;
if (toFind == nums[$-1])
return toRet + 1;
else if (nums.canFind(toFind))
toRet += memoize!createArrangements(nums, toFind);
}
return toRet;
}

@ -0,0 +1,11 @@
16
10
15
5
1
11
7
19
6
12
4

@ -0,0 +1,31 @@
28
33
18
42
31
14
46
20
48
47
24
23
49
45
19
38
39
11
1
32
25
35
8
17
7
9
4
2
34
10
3

@ -0,0 +1,94 @@
LLLLLLLLLLL..LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL..LLLLL
LLLLL..L.LLL.L.LLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLL..LLLL
LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL
LLLL.L.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLL..LLLLLLL
..LLL...L....LL...LLLL.....LL.L.LL.....LL.....L...L.L....LLL..L....L......L........L...L.L..
LLLLLL.LLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLL
LLLLLLLLL.LL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LL.LL
LLLLLLLLL.LL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL..LLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLL.LL.LLLLLL..LLL.LLLLLLLLLLLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLLL.LL..LLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLL
LL.L.LLL.L.L..LLL....LL..L.L..LL.L.LL....LL....LL..LLL.......L....LLL...LL...L....L.....LL..
LLLLLL.LLLLL.LLLLLL.LLL.L.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
LLLLL..LLLL.LLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LL.LLL.L.LLL.LLLL.LLLLLLL
LLLLL..LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL..LLLLL.LLLLL
LL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.LL.LLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.L.LLL
....L...L.L...L..L..LL.........L.L...L.....L...LLLLL...LL.....LLL..LL..L.L...LL......LL..L..
LLLLLL.LLLLL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLL.LLL.L.LLLLLL.LLLLL.LLL.L.LL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLLL.LL.LLL.LLLLL.L.LLLLLL.LLLLLLLLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LL.LLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLL
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.L.LLLLLLL.LLLLLLLLLL.L.LLLLLL.LLLLL
L..LL......L...L.L..L..LLL........LLL....L.L.L.L..........L.L...L..LL.L.......L...L.LL.LL...
LLLLLLLLLLLL.LLL.LL.LLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLL.L.LLLLLLL.LLLLLL.LLLLL.LLLL.L.LLLLL
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLLLLLLL.L.LL.LL.LL.LLL.LLLLL.LLLLLLLLLLLL
LLLLLL.LLLLL.LLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLL.LLLLL.LLLL.L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLL.LL.LL.LLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLL
LLLLLL.LLLL..LLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
.L.......L...L.LLL...LL....L...L.......L......L..L...L.....L.....LL..L...L..L.L.......L.....
LL.LLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLL
LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.L
LLLLLLLLLL.L.LLLLLL.L.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL
LLLL.L.L.LLL.LLLLLL.LLLLL.LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
.........L..LL...L..LLL.L.L.L.LL....LLLL...L....L...L.LL....LL.LL.L......L.L.LLLLL.L.LL....L
LLLLLL.LLLLL.LLLLLL.LLLL..LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLLLL.LLLLL
LL.LLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.L..LLLLLLLLL...LLL..LLLLLLL.LLLLLLLLLLLL
L.LLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LL.LLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LL.LLL.LLLLL.L.LLLLLL.LLLLLL.L.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
LLLLL..LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
LLL.LLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLL..LLLLLL.LL.LLLLLL.LLLLL.L..LLLLL.LLLL...LLLLLLLLLLL
LLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLL
..L..........LLLL...LL....LLLLL....L...L...L...L.......L.LL..L....L....L.L..L....LL......L..
LLLLLL.LLLLL.L.LLLL.LLLL..LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
LL.LLL.LLLLL.LLLLL..LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL..LLLL
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLLL.LLLLLL.LLL..LLLLLLLLLLLLLLLLL
LLLL.LLLLLLL.LLLLLL.LLL.L.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL..LLLLL.LLLLL
LL.LLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLLL.L.L.LLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLL.L.LLLLL...LLLL.LLLLLLLLLLLLLLLLLL
.L...L...........L.LLL..L.......L.....LL......L.LLL........LL..L...L......L.L....L.LLL.LL..L
LLLLLL.LLLLL.L.LLLL.LLLLL.LLLLLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLL.LL.LL.LLLLLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLL.L.LLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.L.LLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
LLLLLL.LLLLL..LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LL.L.LLLL.LLLLLLLLLLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLL.LLL.L.LLLLLL..LLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL.LLLLLLL.LLLL.LLLLLL.LLLLL
..L..L..L...L..L.L.....LL..L..L..LLLL..L.......L.LL...L..LL..LLL...L....L..L.L.....L..LL...L
LLLLLL.LLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLL.LLLLLL..LLLLLL.LLLLL
LLLLLL.LL.LL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL
LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLL..LLLLLL.LLLLL..LLLLLLLLLLL
LL..L.L......L.......L........L.LL.....LL......L...L..L.L...L.LL..L..L......L.L..LL...LL...L
LLLLLL.LL.LL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.L..LLLLLL.LLLLLL.LLLLLLL.LLLLLL..L.LLLLLLLLLLLL.LL
LLLLLL.LL.LL.LLLLLL.LLLLLLLL.LLLLL.LLLLLL.LL.LLLLLL.LLLLLL.LLL.LLL.LL.LLL..LLLLLLLLLLL.LLLLL
LLLLLLL.LLLL.LLLLLL.LLL.LLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL..LLLLL.LLLLLLLLLLLL.LLLLL
LLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLL..LLLLL
LLLL.L.LLLLL..LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLL.L.LLLLL.LLLLLL.LLLLL.LLLL.LLLLLLL
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLL..L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL..LLLLL.LLLLLL.LLLLL
L....L.L.L..LLL.....L....LL...LL....LLLL....LLL.L.......L.....LL.....L..L.LL..LL....L...LL.L
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLL
LL.LLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LL.LLLLL.L.LLLLLL.LLLLL.LLLLLL.LLLL.
LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.L.LLL
LLLLLL.LLLLL.LLLL.L.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLL.L.LLLL.LLL.LLL.LLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLL.L.L.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL...LLLLL.L.LLLL.LLLLLLLLLLLL..LLLL
LLLLLL.LL.LL.LLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLLLLLL..LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL.LLLLLLLLLL.LLL.LLLLLL..LLLL.LLLLLLLLLLLL

@ -0,0 +1,100 @@
/*
* If a seat is empty (L) and there are no occupied seats adjacent to it, the seat becomes occupied.
* If a seat is occupied (#) and four or more seats adjacent to it are also occupied, the seat becomes empty.
* Otherwise, the seat's state does not change.
*/
import std.file : exists, readText;
import std.stdio: stderr, writeln;
import std.string : splitLines;
int main(string[] args) {
if (args.length != 2) {
stderr.writeln("Usage: ./p1 file.name");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
stderr.writeln(fileName, " does not exist");
return 2;
}
string[] fileText = fileName.readText.splitLines();
char[][] map;
foreach (i, line; fileText) {
char[] toAdd;
foreach (j, c; line) {
toAdd ~= c;
}
map ~= toAdd;
}
while (iterGen(map)) {}
ulong counter;
foreach (line; map) {
foreach (c; line) {
if (c == '#')
counter++;
}
}
writeln("Occupied seats: ", counter);
return 0;
}
bool iterGen(ref char[][] baseMap) {
bool changed;
char[][] map;
foreach (i, row; baseMap) {
char[] toAdd;
foreach (j, c; row) {
if (c == '.') {
toAdd ~= '.';
continue;
}
ubyte neighbors;
if (i > 0) {
if (j > 0)
neighbors += baseMap[i-1][j-1] == '#' ? 1 : 0;
neighbors += baseMap[i-1][j] == '#' ? 1 : 0;
if (j < row.length-1)
neighbors += baseMap[i-1][j+1] == '#' ? 1 : 0;
}
if (i < baseMap.length-1) {
if (j > 0)
neighbors += baseMap[i+1][j-1] == '#' ? 1 : 0;
neighbors += baseMap[i+1][j] == '#' ? 1 : 0;
if (j < row.length-1)
neighbors += baseMap[i+1][j+1] == '#' ? 1 : 0;
}
if (j > 0)
neighbors += baseMap[i][j-1] == '#' ? 1 : 0;
if (j < row.length-1)
neighbors += baseMap[i][j+1] == '#' ? 1 : 0;
if (c == 'L' && neighbors == 0) {
toAdd ~= '#';
changed = true;
} else if (c == '#' && neighbors >= 4) {
toAdd ~= 'L';
changed = true;
} else {
toAdd ~= c;
}
}
map ~= toAdd;
}
baseMap = map;
return changed;
}

@ -0,0 +1,141 @@
/*
* If a seat is empty (L) and there are no occupied seats adjacent to it, the seat becomes occupied.
* If a seat is occupied (#) and four or more seats adjacent to it are also occupied, the seat becomes empty.
* Otherwise, the seat's state does not change.
*/
import std.algorithm.comparison : min;
import std.file : exists, readText;
import std.stdio: stderr, writeln;
import std.string : splitLines;
int main(string[] args) {
if (args.length != 2) {
stderr.writeln("Usage: ./p2 file.name");
return 1;
}
string fileName = args[1];
if (!exists(fileName)) {
stderr.writeln(fileName, " does not exist");
return 2;
}
string[] fileText = fileName.readText.splitLines();
char[][] map;
foreach (i, line; fileText) {
char[] toAdd;
foreach (j, c; line) {
toAdd ~= c;
}
map ~= toAdd;
}
while (iterGen(map)) {}
ulong counter;
foreach (line; map) {
writeln(line);
foreach (c; line) {
if (c == '#')
counter++;
}
}
writeln("Occupied seats: ", counter);
return 0;
}
bool iterGen(ref char[][] baseMap) {
bool changed;
char[][] map;
foreach (i, row; baseMap) {
char[] toAdd;
foreach (j, c; row) {
if (c == '.') {
toAdd ~= '.';
continue;
}
ubyte neighbors;
// Go straight up
foreach (mod; 1 .. i+1) {
char testC = baseMap[i-mod][j];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go straight down
foreach (mod; 1 .. baseMap.length-i) {
char testC = baseMap[i+mod][j];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go straight right
foreach (mod; 1 .. row.length-j) {
char testC = baseMap[i][j+mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go straight left
foreach (mod; 1 .. j+1) {
char testC = baseMap[i][j-mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go down-right
foreach (mod; 1 .. min(baseMap.length-i, row.length-j)) {
char testC = baseMap[i+mod][j+mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go down-left
foreach (mod; 1 .. min(baseMap.length-i, j+1)) {
char testC = baseMap[i+mod][j-mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go up-left
foreach (mod; 1 .. min(i+1, j+1)) {
char testC = baseMap[i-mod][j-mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
// Go up-right
foreach (mod; 1 .. min(i+1, row.length-j)) {
char testC = baseMap[i-mod][j+mod];
neighbors += testC == '#' ? 1 : 0;
if ((testC == '#') || (testC == 'L'))
break;
}
if (c == 'L' && neighbors == 0) {
toAdd ~= '#';
changed = true;
} else if (c == '#' && neighbors >= 5) {
toAdd ~= 'L';
changed = true;
} else {
toAdd ~= c;
}
}
map ~= toAdd;
}
baseMap = map;
return changed;
}

@ -0,0 +1,10 @@
L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL

@ -0,0 +1,774 @@
F99
L180
W1
W3
R90
E5
R180
S4
F55
L90
E5
S3
R180
N2
W3
S1
F64
W4
F76
N2
F7
L180
S2
E5
S2
F87
N4
L90
F46
R90
F47
W5
N4
L270
N5
F89
L180
W2
N5
F69
E3
L90
F73
L90
N1
F28
N4
F72
L90
F24
R90
S1
F52
L90
W2