init
This commit is contained in:
commit
77064a9563
79 changed files with 10533 additions and 0 deletions
16
2018/1/2/Makefile
Normal file
16
2018/1/2/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
|||
CXX = g++-7
|
||||
CC = g++-7
|
||||
CXXFLAGS = -Wall -Wextra
|
||||
|
||||
all: main
|
||||
|
||||
main.o: main.cpp
|
||||
$(CXX) $(CXXFLAGS) -c main.cpp
|
||||
|
||||
main: main.o
|
||||
|
||||
clean:
|
||||
rm -f *.o *.h.gch *.exe main
|
||||
|
||||
run: all
|
||||
./main
|
998
2018/1/2/input
Normal file
998
2018/1/2/input
Normal file
|
@ -0,0 +1,998 @@
|
|||
-14
|
||||
-9
|
||||
-14
|
||||
-12
|
||||
+13
|
||||
+2
|
||||
+7
|
||||
-18
|
||||
+10
|
||||
-8
|
||||
+13
|
||||
+12
|
||||
+11
|
||||
-1
|
||||
+9
|
||||
+3
|
||||
+6
|
||||
-1
|
||||
+11
|
||||
-9
|
||||
-6
|
||||
+11
|
||||
-3
|
||||
+18
|
||||
-7
|
||||
+13
|
||||
-11
|
||||
+18
|
||||
+10
|
||||
+9
|
||||
+16
|
||||
+11
|
||||
+14
|
||||
-19
|
||||
+14
|
||||
-3
|
||||
-8
|
||||
-5
|
||||
-10
|
||||
-18
|
||||
-9
|
||||
-10
|
||||
+6
|
||||
+8
|
||||
+10
|
||||
+10
|
||||
-19
|
||||
+18
|
||||
+17
|
||||
-14
|
||||
+4
|
||||
+2
|
||||
+4
|
||||
-17
|
||||
+3
|
||||
-9
|
||||
-16
|
||||
-16
|
||||
+7
|
||||
+7
|
||||
+21
|
||||
+13
|
||||
-11
|
||||
+17
|
||||
+11
|
||||
+1
|
||||
+19
|
||||
-4
|
||||
+6
|
||||
-7
|
||||
-13
|
||||
-10
|
||||
+11
|
||||
-4
|
||||
-2
|
||||
-22
|
||||
-9
|
||||
+8
|
||||
-19
|
||||
-12
|
||||
-13
|
||||
-8
|
||||
-16
|
||||
-4
|
||||
-14
|
||||
-8
|
||||
-1
|
||||
+7
|
||||
+11
|
||||
-4
|
||||
-4
|
||||
-6
|
||||
-13
|
||||
-12
|
||||
-11
|
||||
-19
|
||||
-3
|
||||
+10
|
||||
+1
|
||||
+19
|
||||
+12
|
||||
+9
|
||||
-12
|
||||
+4
|
||||
+16
|
||||
+14
|
||||
+1
|
||||
-8
|
||||
-9
|
||||
+5
|
||||
+17
|
||||
+12
|
||||
-20
|
||||
+7
|
||||
-11
|
||||
+15
|
||||
+18
|
||||
-10
|
||||
-4
|
||||
-6
|
||||
+9
|
||||
+19
|
||||
+8
|
||||
+24
|
||||
-18
|
||||
-10
|
||||
-11
|
||||
-3
|
||||
+17
|
||||
+17
|
||||
-4
|
||||
-7
|
||||
-10
|
||||
+20
|
||||
+8
|
||||
+5
|
||||
+19
|
||||
+31
|
||||
-9
|
||||
+18
|
||||
-7
|
||||
-13
|
||||
-2
|
||||
-1
|
||||
+12
|
||||
+1
|
||||
+11
|
||||
-4
|
||||
+13
|
||||
+3
|
||||
+2
|
||||
+5
|
||||
+8
|
||||
-1
|
||||
+7
|
||||
+2
|
||||
+6
|
||||
+9
|
||||
-10
|
||||
+15
|
||||
+8
|
||||
-6
|
||||
+12
|
||||
+16
|
||||
+10
|
||||
-19
|
||||
-18
|
||||
-6
|
||||
+9
|
||||
+1
|
||||
-19
|
||||
+6
|
||||
-1
|
||||
+5
|
||||
+18
|
||||
+9
|
||||
+12
|
||||
-6
|
||||
+18
|
||||
-17
|
||||
+15
|
||||
+5
|
||||
+13
|
||||
-19
|
||||
+10
|
||||
+14
|
||||
-7
|
||||
+16
|
||||
-18
|
||||
+8
|
||||
-5
|
||||
-13
|
||||
+17
|
||||
+17
|
||||
+15
|
||||
-7
|
||||
-3
|
||||
+18
|
||||
+5
|
||||
+12
|
||||
+17
|
||||
+11
|
||||
-18
|
||||
+13
|
||||
+16
|
||||
-14
|
||||
-10
|
||||
+14
|
||||
+18
|
||||
+2
|
||||
+14
|
||||
+16
|
||||
+18
|
||||
+9
|
||||
+14
|
||||
-19
|
||||
+16
|
||||
-12
|
||||
+7
|
||||
-12
|
||||
-1
|
||||
+4
|
||||
+10
|
||||
+17
|
||||
-2
|
||||
-3
|
||||
+6
|
||||
+3
|
||||
+18
|
||||
+10
|
||||
-6
|
||||
+17
|
||||
-5
|
||||
-13
|
||||
-20
|
||||
+7
|
||||
+7
|
||||
+9
|
||||
-19
|
||||
+2
|
||||
+12
|
||||
+8
|
||||
-11
|
||||
+7
|
||||
-3
|
||||
-8
|
||||
-2
|
||||
-1
|
||||
-5
|
||||
-15
|
||||
-16
|
||||
-5
|
||||
-12
|
||||
+2
|
||||
-10
|
||||
-7
|
||||
-14
|
||||
-2
|
||||
-14
|
||||
-13
|
||||
-19
|
||||
-17
|
||||
-5
|
||||
+14
|
||||
-4
|
||||
+5
|
||||
-3
|
||||
-8
|
||||
+2
|
||||
+2
|
||||
-14
|
||||
-7
|
||||
+4
|
||||
+16
|
||||
-19
|
||||
-17
|
||||
-16
|
||||
-18
|
||||
+2
|
||||
-10
|
||||
+14
|
||||
-16
|
||||
-8
|
||||
+1
|
||||
-12
|
||||
+4
|
||||
+6
|
||||
-14
|
||||
-19
|
||||
+11
|
||||
-16
|
||||
+17
|
||||
+20
|
||||
+8
|
||||
+7
|
||||
+19
|
||||
+8
|
||||
-18
|
||||
-15
|
||||
+8
|
||||
-11
|
||||
-24
|
||||
+11
|
||||
-7
|
||||
-14
|
||||
-18
|
||||
-19
|
||||
-15
|
||||
-13
|
||||
+22
|
||||
+15
|
||||
-12
|
||||
-2
|
||||
+19
|
||||
-9
|
||||
-13
|
||||
-4
|
||||
+10
|
||||
-14
|
||||
-6
|
||||
+12
|
||||
-11
|
||||
+8
|
||||
-6
|
||||
-1
|
||||
-5
|
||||
-16
|
||||
+3
|
||||
-1
|
||||
+21
|
||||
+1
|
||||
-12
|
||||
+22
|
||||
+30
|
||||
-16
|
||||
+15
|
||||
-16
|
||||
-7
|
||||
-25
|
||||
+28
|
||||
+29
|
||||
+10
|
||||
-5
|
||||
+23
|
||||
+2
|
||||
-12
|
||||
+6
|
||||
+15
|
||||
+24
|
||||
-4
|
||||
+8
|
||||
+14
|
||||
-7
|
||||
-13
|
||||
+23
|
||||
-2
|
||||
+17
|
||||
+4
|
||||
-5
|
||||
-5
|
||||
-4
|
||||
+6
|
||||
+15
|
||||
-10
|
||||
+16
|
||||
-1
|
||||
-9
|
||||
-16
|
||||
-5
|
||||
-10
|
||||
+2
|
||||
-22
|
||||
+18
|
||||
+10
|
||||
+9
|
||||
+15
|
||||
-10
|
||||
-19
|
||||
+9
|
||||
+41
|
||||
+6
|
||||
-4
|
||||
-10
|
||||
+13
|
||||
+7
|
||||
+6
|
||||
+14
|
||||
+4
|
||||
+5
|
||||
+19
|
||||
+7
|
||||
-17
|
||||
-8
|
||||
+7
|
||||
-5
|
||||
+21
|
||||
-2
|
||||
+12
|
||||
-13
|
||||
-16
|
||||
+9
|
||||
+11
|
||||
+16
|
||||
-1
|
||||
+12
|
||||
-15
|
||||
+1
|
||||
+10
|
||||
-15
|
||||
-20
|
||||
-19
|
||||
-11
|
||||
+16
|
||||
-9
|
||||
+8
|
||||
-22
|
||||
+17
|
||||
+18
|
||||
-1
|
||||
+13
|
||||
+5
|
||||
+23
|
||||
-16
|
||||
+11
|
||||
-3
|
||||
+18
|
||||
+10
|
||||
+10
|
||||
-8
|
||||
-6
|
||||
+12
|
||||
+11
|
||||
+15
|
||||
-19
|
||||
-3
|
||||
+6
|
||||
-14
|
||||
-10
|
||||
+1
|
||||
+18
|
||||
-16
|
||||
+8
|
||||
+17
|
||||
-21
|
||||
-22
|
||||
-5
|
||||
-18
|
||||
-15
|
||||
-15
|
||||
-5
|
||||
-8
|
||||
-3
|
||||
-13
|
||||
+5
|
||||
+14
|
||||
+1
|
||||
+29
|
||||
+12
|
||||
+2
|
||||
+22
|
||||
+25
|
||||
-34
|
||||
-2
|
||||
-27
|
||||
+15
|
||||
-23
|
||||
-28
|
||||
-13
|
||||
+9
|
||||
-26
|
||||
-16
|
||||
+17
|
||||
-7
|
||||
+35
|
||||
+77
|
||||
+47
|
||||
-8
|
||||
+34
|
||||
-12
|
||||
+1
|
||||
-20
|
||||
+24
|
||||
+19
|
||||
-16
|
||||
+19
|
||||
-14
|
||||
+12
|
||||
+7
|
||||
+14
|
||||
+13
|
||||
-21
|
||||
-5
|
||||
-2
|
||||
-5
|
||||
+13
|
||||
+3
|
||||
+3
|
||||
+2
|
||||
-17
|
||||
-15
|
||||
+7
|
||||
+12
|
||||
+7
|
||||
+2
|
||||
-8
|
||||
-12
|
||||
-7
|
||||
+3
|
||||
-15
|
||||
-16
|
||||
+22
|
||||
+10
|
||||
-3
|
||||
-10
|
||||
+30
|
||||
+17
|
||||
-10
|
||||
+11
|
||||
-5
|
||||
-1
|
||||
+4
|
||||
+15
|
||||
+2
|
||||
+54
|
||||
-36
|
||||
+53
|
||||
-19
|
||||
-9
|
||||
-10
|
||||
+50
|
||||
+1
|
||||
+21
|
||||
+13
|
||||
+14
|
||||
-24
|
||||
-6
|
||||
-52
|
||||
+11
|
||||
-95
|
||||
-25
|
||||
-5
|
||||
-14
|
||||
+70
|
||||
+199
|
||||
-3
|
||||
+2
|
||||
-7
|
||||
-7
|
||||
+49
|
||||
-7
|
||||
+11
|
||||
-33
|
||||
-10
|
||||
+13
|
||||
+86
|
||||
-34
|
||||
-34
|
||||
+127
|
||||
-25
|
||||
-1700
|
||||
-76565
|
||||
-15
|
||||
+43
|
||||
-9
|
||||
-9
|
||||
+41
|
||||
+24
|
||||
+24
|
||||
-27
|
||||
+13
|
||||
-16
|
||||
-19
|
||||
-29
|
||||
-4
|
||||
-52
|
||||
-25
|
||||
-9
|
||||
-7
|
||||
+6
|
||||
-19
|
||||
+2
|
||||
+3
|
||||
+7
|
||||
+19
|
||||
-7
|
||||
-3
|
||||
+6
|
||||
-16
|
||||
-3
|
||||
-20
|
||||
+18
|
||||
+16
|
||||
+8
|
||||
+6
|
||||
-13
|
||||
+18
|
||||
+7
|
||||
+8
|
||||
-23
|
||||
-1
|
||||
-14
|
||||
-8
|
||||
-1
|
||||
-8
|
||||
-10
|
||||
-11
|
||||
-2
|
||||
-5
|
||||
-16
|
||||
+5
|
||||
+3
|
||||
-17
|
||||
-5
|
||||
-16
|
||||
-8
|
||||
+7
|
||||
-18
|
||||
-7
|
||||
-3
|
||||
+13
|
||||
+9
|
||||
+4
|
||||
+15
|
||||
+19
|
||||
+17
|
||||
-1
|
||||
-4
|
||||
+14
|
||||
+14
|
||||
+5
|
||||
-21
|
||||
+11
|
||||
-22
|
||||
+18
|
||||
+3
|
||||
-13
|
||||
-20
|
||||
-6
|
||||
-12
|
||||
+4
|
||||
-1
|
||||
+5
|
||||
+7
|
||||
-19
|
||||
+17
|
||||
-14
|
||||
+6
|
||||
+6
|
||||
+8
|
||||
+16
|
||||
+1
|
||||
+8
|
||||
+5
|
||||
+4
|
||||
+1
|
||||
+22
|
||||
-21
|
||||
-10
|
||||
-20
|
||||
+15
|
||||
+6
|
||||
+12
|
||||
+17
|
||||
+9
|
||||
+14
|
||||
+1
|
||||
-5
|
||||
+10
|
||||
-62
|
||||
-19
|
||||
-13
|
||||
-1
|
||||
-19
|
||||
-2
|
||||
-16
|
||||
+4
|
||||
+5
|
||||
-17
|
||||
-16
|
||||
-3
|
||||
-14
|
||||
-7
|
||||
+15
|
||||
+5
|
||||
-12
|
||||
-2
|
||||
+19
|
||||
-13
|
||||
+1
|
||||
-15
|
||||
-16
|
||||
+12
|
||||
-16
|
||||
-17
|
||||
+13
|
||||
+12
|
||||
-16
|
||||
+19
|
||||
+7
|
||||
+1
|
||||
-10
|
||||
+16
|
||||
-2
|
||||
-8
|
||||
-16
|
||||
+11
|
||||
-9
|
||||
-12
|
||||
+13
|
||||
-12
|
||||
+1
|
||||
-11
|
||||
-12
|
||||
-4
|
||||
+12
|
||||
-9
|
||||
-16
|
||||
-7
|
||||
+16
|
||||
+12
|
||||
+2
|
||||
-17
|
||||
-17
|
||||
+9
|
||||
-7
|
||||
-10
|
||||
-8
|
||||
+1
|
||||
-2
|
||||
+7
|
||||
+9
|
||||
+8
|
||||
+8
|
||||
-17
|
||||
-5
|
||||
-7
|
||||
-11
|
||||
-8
|
||||
-10
|
||||
-6
|
||||
+11
|
||||
-17
|
||||
-8
|
||||
-13
|
||||
+18
|
||||
-19
|
||||
+10
|
||||
-19
|
||||
-12
|
||||
-5
|
||||
-12
|
||||
-15
|
||||
+3
|
||||
-15
|
||||
+14
|
||||
+9
|
||||
+19
|
||||
-1
|
||||
-12
|
||||
-10
|
||||
+12
|
||||
-18
|
||||
-15
|
||||
+4
|
||||
-15
|
||||
+17
|
||||
-20
|
||||
+10
|
||||
+1
|
||||
+15
|
||||
+10
|
||||
+10
|
||||
-9
|
||||
+12
|
||||
-16
|
||||
+15
|
||||
+14
|
||||
+5
|
||||
-6
|
||||
+3
|
||||
+14
|
||||
-3
|
||||
+8
|
||||
+2
|
||||
-1
|
||||
+3
|
||||
-10
|
||||
-7
|
||||
+23
|
||||
-3
|
||||
-22
|
||||
+5
|
||||
+21
|
||||
+18
|
||||
-15
|
||||
-9
|
||||
+11
|
||||
+3
|
||||
+14
|
||||
+11
|
||||
+19
|
||||
-14
|
||||
-18
|
||||
+14
|
||||
-4
|
||||
+13
|
||||
+12
|
||||
+12
|
||||
+18
|
||||
+9
|
||||
-4
|
||||
-18
|
||||
+4
|
||||
+17
|
||||
-10
|
||||
+20
|
||||
-2
|
||||
+9
|
||||
-2
|
||||
+4
|
||||
-10
|
||||
+19
|
||||
-16
|
||||
+4
|
||||
-22
|
||||
-1
|
||||
+13
|
||||
+7
|
||||
+11
|
||||
+2
|
||||
+11
|
||||
-19
|
||||
+11
|
||||
+9
|
||||
+14
|
||||
-9
|
||||
+5
|
||||
+7
|
||||
+2
|
||||
+13
|
||||
+10
|
||||
+1
|
||||
+16
|
||||
-5
|
||||
-17
|
||||
-8
|
||||
+5
|
||||
+4
|
||||
+6
|
||||
+1
|
||||
+12
|
||||
+14
|
||||
-19
|
||||
+1
|
||||
+11
|
||||
-8
|
||||
-25
|
||||
-6
|
||||
-18
|
||||
+26
|
||||
+17
|
||||
+12
|
||||
-15
|
||||
+19
|
||||
+7
|
||||
-5
|
||||
+20
|
||||
-5
|
||||
+2
|
||||
+12
|
||||
-11
|
||||
-6
|
||||
-2
|
||||
+6
|
||||
-19
|
||||
-24
|
||||
-15
|
||||
+20
|
||||
+3
|
||||
+26
|
||||
+17
|
||||
+13
|
||||
-23
|
||||
+31
|
||||
+5
|
||||
+29
|
||||
-30
|
||||
+5
|
||||
+56
|
||||
-59
|
||||
-59
|
||||
-40
|
||||
-14
|
||||
+18
|
||||
-66
|
||||
-7
|
||||
-23
|
||||
-1
|
||||
-12
|
||||
-6
|
||||
-16
|
||||
+4
|
||||
+8
|
||||
+17
|
||||
+21
|
||||
-14
|
||||
-18
|
||||
-7
|
||||
-18
|
||||
-5
|
||||
+1
|
||||
+12
|
||||
+2
|
||||
+2
|
||||
+15
|
||||
+21
|
||||
-20
|
||||
-4
|
||||
-4
|
||||
-14
|
||||
-9
|
||||
-22
|
||||
+15
|
||||
-9
|
||||
+13
|
||||
-16
|
||||
+7
|
||||
-17
|
||||
-10
|
||||
-3
|
||||
-14
|
||||
+2
|
||||
-10
|
||||
-19
|
||||
-8
|
||||
-19
|
||||
+6
|
||||
-15
|
||||
-18
|
||||
+3
|
||||
-19
|
||||
+10
|
||||
-6
|
||||
+7
|
||||
+20
|
||||
-4
|
||||
-6
|
||||
-13
|
||||
-14
|
||||
-11
|
||||
+5
|
||||
+7
|
||||
-9
|
||||
+11
|
||||
-1
|
||||
+9
|
||||
+13
|
||||
-15
|
||||
-10
|
||||
-13
|
||||
-5
|
||||
-13
|
||||
-6
|
||||
+5
|
||||
+20
|
||||
-7
|
||||
-10
|
||||
+13
|
||||
-5
|
||||
+13
|
||||
-6
|
||||
+5
|
||||
-18
|
||||
-12
|
||||
-12
|
||||
-17
|
||||
+6
|
||||
-9
|
||||
-21
|
||||
+1
|
||||
+6
|
||||
-12
|
||||
+15
|
||||
-14
|
||||
+24
|
||||
+6
|
||||
+18
|
||||
-16
|
||||
+15
|
||||
-18
|
||||
-6
|
||||
+20
|
||||
+11
|
||||
+4
|
||||
-17
|
||||
+8
|
||||
-9
|
||||
+78549
|
44
2018/1/2/main.cpp
Normal file
44
2018/1/2/main.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
#include <map>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
map<int, bool> freqs;
|
||||
|
||||
ifstream input;
|
||||
input.open("input");
|
||||
string line;
|
||||
|
||||
int total = 0;
|
||||
int number;
|
||||
|
||||
if (input.is_open()) {
|
||||
while (true) {
|
||||
input.clear();
|
||||
input.seekg(0, ios::beg);
|
||||
|
||||
while (getline(input, line)) {
|
||||
auto found = freqs.find(total);
|
||||
if (found == freqs.end()) {
|
||||
// Insert new value
|
||||
freqs.insert(pair<int,bool>(total, true));
|
||||
} else {
|
||||
// Value was found. Exit.
|
||||
cout << found->first << endl;
|
||||
input.close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
number = stoi(line);
|
||||
total += number;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cout << "Could not open file." << endl;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
998
2018/1/input
Normal file
998
2018/1/input
Normal file
|
@ -0,0 +1,998 @@
|
|||
-14
|
||||
-9
|
||||
-14
|
||||
-12
|
||||
+13
|
||||
+2
|
||||
+7
|
||||
-18
|
||||
+10
|
||||
-8
|
||||
+13
|
||||
+12
|
||||
+11
|
||||
-1
|
||||
+9
|
||||
+3
|
||||
+6
|
||||
-1
|
||||
+11
|
||||
-9
|
||||
-6
|
||||
+11
|
||||
-3
|
||||
+18
|
||||
-7
|
||||
+13
|
||||
-11
|
||||
+18
|
||||
+10
|
||||
+9
|
||||
+16
|
||||
+11
|
||||
+14
|
||||
-19
|
||||
+14
|
||||
-3
|
||||
-8
|
||||
-5
|
||||
-10
|
||||
-18
|
||||
-9
|
||||
-10
|
||||
+6
|
||||
+8
|
||||
+10
|
||||
+10
|
||||
-19
|
||||
+18
|
||||
+17
|
||||
-14
|
||||
+4
|
||||
+2
|
||||
+4
|
||||
-17
|
||||
+3
|
||||
-9
|
||||
-16
|
||||
-16
|
||||
+7
|
||||
+7
|
||||
+21
|
||||
+13
|
||||
-11
|
||||
+17
|
||||
+11
|
||||
+1
|
||||
+19
|
||||
-4
|
||||
+6
|
||||
-7
|
||||
-13
|
||||
-10
|
||||
+11
|
||||
-4
|
||||
-2
|
||||
-22
|
||||
-9
|
||||
+8
|
||||
-19
|
||||
-12
|
||||
-13
|
||||
-8
|
||||
-16
|
||||
-4
|
||||
-14
|
||||
-8
|
||||
-1
|
||||
+7
|
||||
+11
|
||||
-4
|
||||
-4
|
||||
-6
|
||||
-13
|
||||
-12
|
||||
-11
|
||||
-19
|
||||
-3
|
||||
+10
|
||||
+1
|
||||
+19
|
||||
+12
|
||||
+9
|
||||
-12
|
||||
+4
|
||||
+16
|
||||
+14
|
||||
+1
|
||||
-8
|
||||
-9
|
||||
+5
|
||||
+17
|
||||
+12
|
||||
-20
|
||||
+7
|
||||
-11
|
||||
+15
|
||||
+18
|
||||
-10
|
||||
-4
|
||||
-6
|
||||
+9
|
||||
+19
|
||||
+8
|
||||
+24
|
||||
-18
|
||||
-10
|
||||
-11
|
||||
-3
|
||||
+17
|
||||
+17
|
||||
-4
|
||||
-7
|
||||
-10
|
||||
+20
|
||||
+8
|
||||
+5
|
||||
+19
|
||||
+31
|
||||
-9
|
||||
+18
|
||||
-7
|
||||
-13
|
||||
-2
|
||||
-1
|
||||
+12
|
||||
+1
|
||||
+11
|
||||
-4
|
||||
+13
|
||||
+3
|
||||
+2
|
||||
+5
|
||||
+8
|
||||
-1
|
||||
+7
|
||||
+2
|
||||
+6
|
||||
+9
|
||||
-10
|
||||
+15
|
||||
+8
|
||||
-6
|
||||
+12
|
||||
+16
|
||||
+10
|
||||
-19
|
||||
-18
|
||||
-6
|
||||
+9
|
||||
+1
|
||||
-19
|
||||
+6
|
||||
-1
|
||||
+5
|
||||
+18
|
||||
+9
|
||||
+12
|
||||
-6
|
||||
+18
|
||||
-17
|
||||
+15
|
||||
+5
|
||||
+13
|
||||
-19
|
||||
+10
|
||||
+14
|
||||
-7
|
||||
+16
|
||||
-18
|
||||
+8
|
||||
-5
|
||||
-13
|
||||
+17
|
||||
+17
|
||||
+15
|
||||
-7
|
||||
-3
|
||||
+18
|
||||
+5
|
||||
+12
|
||||
+17
|
||||
+11
|
||||
-18
|
||||
+13
|
||||
+16
|
||||
-14
|
||||
-10
|
||||
+14
|
||||
+18
|
||||
+2
|
||||
+14
|
||||
+16
|
||||
+18
|
||||
+9
|
||||
+14
|
||||
-19
|
||||
+16
|
||||
-12
|
||||
+7
|
||||
-12
|
||||
-1
|
||||
+4
|
||||
+10
|
||||
+17
|
||||
-2
|
||||
-3
|
||||
+6
|
||||
+3
|
||||
+18
|
||||
+10
|
||||
-6
|
||||
+17
|
||||
-5
|
||||
-13
|
||||
-20
|
||||
+7
|
||||
+7
|
||||
+9
|
||||
-19
|
||||
+2
|
||||
+12
|
||||
+8
|
||||
-11
|
||||
+7
|
||||
-3
|
||||
-8
|
||||
-2
|
||||
-1
|
||||
-5
|
||||
-15
|
||||
-16
|
||||
-5
|
||||
-12
|
||||
+2
|
||||
-10
|
||||
-7
|
||||
-14
|
||||
-2
|
||||
-14
|
||||
-13
|
||||
-19
|
||||
-17
|
||||
-5
|
||||
+14
|
||||
-4
|
||||
+5
|
||||
-3
|
||||
-8
|
||||
+2
|
||||
+2
|
||||
-14
|
||||
-7
|
||||
+4
|
||||
+16
|
||||
-19
|
||||
-17
|
||||
-16
|
||||
-18
|
||||
+2
|
||||
-10
|
||||
+14
|
||||
-16
|
||||
-8
|
||||
+1
|
||||
-12
|
||||
+4
|
||||
+6
|
||||
-14
|
||||
-19
|
||||
+11
|
||||
-16
|
||||
+17
|
||||
+20
|
||||
+8
|
||||
+7
|
||||
+19
|
||||
+8
|
||||
-18
|
||||
-15
|
||||
+8
|
||||
-11
|
||||
-24
|
||||
+11
|
||||
-7
|
||||
-14
|
||||
-18
|
||||
-19
|
||||
-15
|
||||
-13
|
||||
+22
|
||||
+15
|
||||
-12
|
||||
-2
|
||||
+19
|
||||
-9
|
||||
-13
|
||||
-4
|
||||
+10
|
||||
-14
|
||||
-6
|
||||
+12
|
||||
-11
|
||||
+8
|
||||
-6
|
||||
-1
|
||||
-5
|
||||
-16
|
||||
+3
|
||||
-1
|
||||
+21
|
||||
+1
|
||||
-12
|
||||
+22
|
||||
+30
|
||||
-16
|
||||
+15
|
||||
-16
|
||||
-7
|
||||
-25
|
||||
+28
|
||||
+29
|
||||
+10
|
||||
-5
|
||||
+23
|
||||
+2
|
||||
-12
|
||||
+6
|
||||
+15
|
||||
+24
|
||||
-4
|
||||
+8
|
||||
+14
|
||||
-7
|
||||
-13
|
||||
+23
|
||||
-2
|
||||
+17
|
||||
+4
|
||||
-5
|
||||
-5
|
||||
-4
|
||||
+6
|
||||
+15
|
||||
-10
|
||||
+16
|
||||
-1
|
||||
-9
|
||||
-16
|
||||
-5
|
||||
-10
|
||||
+2
|
||||
-22
|
||||
+18
|
||||
+10
|
||||
+9
|
||||
+15
|
||||
-10
|
||||
-19
|
||||
+9
|
||||
+41
|
||||
+6
|
||||
-4
|
||||
-10
|
||||
+13
|
||||
+7
|
||||
+6
|
||||
+14
|
||||
+4
|
||||
+5
|
||||
+19
|
||||
+7
|
||||
-17
|
||||
-8
|
||||
+7
|
||||
-5
|
||||
+21
|
||||
-2
|
||||
+12
|
||||
-13
|
||||
-16
|
||||
+9
|
||||
+11
|
||||
+16
|
||||
-1
|
||||
+12
|
||||
-15
|
||||
+1
|
||||
+10
|
||||
-15
|
||||
-20
|
||||
-19
|
||||
-11
|
||||
+16
|
||||
-9
|
||||
+8
|
||||
-22
|
||||
+17
|
||||
+18
|
||||
-1
|
||||
+13
|
||||
+5
|
||||
+23
|
||||
-16
|
||||
+11
|
||||
-3
|
||||
+18
|
||||
+10
|
||||
+10
|
||||
-8
|
||||
-6
|
||||
+12
|
||||
+11
|
||||
+15
|
||||
-19
|
||||
-3
|
||||
+6
|
||||
-14
|
||||
-10
|
||||
+1
|
||||
+18
|
||||
-16
|
||||
+8
|
||||
+17
|
||||
-21
|
||||
-22
|
||||
-5
|
||||
-18
|
||||
-15
|
||||
-15
|
||||
-5
|
||||
-8
|
||||
-3
|
||||
-13
|
||||
+5
|
||||
+14
|
||||
+1
|
||||
+29
|
||||
+12
|
||||
+2
|
||||
+22
|
||||
+25
|
||||
-34
|
||||
-2
|
||||
-27
|
||||
+15
|
||||
-23
|
||||
-28
|
||||
-13
|
||||
+9
|
||||
-26
|
||||
-16
|
||||
+17
|
||||
-7
|
||||
+35
|
||||
+77
|
||||
+47
|
||||
-8
|
||||
+34
|
||||
-12
|
||||
+1
|
||||
-20
|
||||
+24
|
||||
+19
|
||||
-16
|
||||
+19
|
||||
-14
|
||||
+12
|
||||
+7
|
||||
+14
|
||||
+13
|
||||
-21
|
||||
-5
|
||||
-2
|
||||
-5
|
||||
+13
|
||||
+3
|
||||
+3
|
||||
+2
|
||||
-17
|
||||
-15
|
||||
+7
|
||||
+12
|
||||
+7
|
||||
+2
|
||||
-8
|
||||
-12
|
||||
-7
|
||||
+3
|
||||
-15
|
||||
-16
|
||||
+22
|
||||
+10
|
||||
-3
|
||||
-10
|
||||
+30
|
||||
+17
|
||||
-10
|
||||
+11
|
||||
-5
|
||||
-1
|
||||
+4
|
||||
+15
|
||||
+2
|
||||
+54
|
||||
-36
|
||||
+53
|
||||
-19
|
||||
-9
|
||||
-10
|
||||
+50
|
||||
+1
|
||||
+21
|
||||
+13
|
||||
+14
|
||||
-24
|
||||
-6
|
||||
-52
|
||||
+11
|
||||
-95
|
||||
-25
|
||||
-5
|
||||
-14
|
||||
+70
|
||||
+199
|
||||
-3
|
||||
+2
|
||||
-7
|
||||
-7
|
||||
+49
|
||||
-7
|
||||
+11
|
||||
-33
|
||||
-10
|
||||
+13
|
||||
+86
|
||||
-34
|
||||
-34
|
||||
+127
|
||||
-25
|
||||
-1700
|
||||
-76565
|
||||
-15
|
||||
+43
|
||||
-9
|
||||
-9
|
||||
+41
|
||||
+24
|
||||
+24
|
||||
-27
|
||||
+13
|
||||
-16
|
||||
-19
|
||||
-29
|
||||
-4
|
||||
-52
|
||||
-25
|
||||
-9
|
||||
-7
|
||||
+6
|
||||
-19
|
||||
+2
|
||||
+3
|
||||
+7
|
||||
+19
|
||||
-7
|
||||
-3
|
||||
+6
|
||||
-16
|
||||
-3
|
||||
-20
|
||||
+18
|
||||
+16
|
||||
+8
|
||||
+6
|
||||
-13
|
||||
+18
|
||||
+7
|
||||
+8
|
||||
-23
|
||||
-1
|
||||
-14
|
||||
-8
|
||||
-1
|
||||
-8
|
||||
-10
|
||||
-11
|
||||
-2
|
||||
-5
|
||||
-16
|
||||
+5
|
||||
+3
|
||||
-17
|
||||
-5
|
||||
-16
|
||||
-8
|
||||
+7
|
||||
-18
|
||||
-7
|
||||
-3
|
||||
+13
|
||||
+9
|
||||
+4
|
||||
+15
|
||||
+19
|
||||
+17
|
||||
-1
|
||||
-4
|
||||
+14
|
||||
+14
|
||||
+5
|
||||
-21
|
||||
+11
|
||||
-22
|
||||
+18
|
||||
+3
|
||||
-13
|
||||
-20
|
||||
-6
|
||||
-12
|
||||
+4
|
||||
-1
|
||||
+5
|
||||
+7
|
||||
-19
|
||||
+17
|
||||
-14
|
||||
+6
|
||||
+6
|
||||
+8
|
||||
+16
|
||||
+1
|
||||
+8
|
||||
+5
|
||||
+4
|
||||
+1
|
||||
+22
|
||||
-21
|
||||
-10
|
||||
-20
|
||||
+15
|
||||
+6
|
||||
+12
|
||||
+17
|
||||
+9
|
||||
+14
|
||||
+1
|
||||
-5
|
||||
+10
|
||||
-62
|
||||
-19
|
||||
-13
|
||||
-1
|
||||
-19
|
||||
-2
|
||||
-16
|
||||
+4
|
||||
+5
|
||||
-17
|
||||
-16
|
||||
-3
|
||||
-14
|
||||
-7
|
||||
+15
|
||||
+5
|
||||
-12
|
||||
-2
|
||||
+19
|
||||
-13
|
||||
+1
|
||||
-15
|
||||
-16
|
||||
+12
|
||||
-16
|
||||
-17
|
||||
+13
|
||||
+12
|
||||
-16
|
||||
+19
|
||||
+7
|
||||
+1
|
||||
-10
|
||||
+16
|
||||
-2
|
||||
-8
|
||||
-16
|
||||
+11
|
||||
-9
|
||||
-12
|
||||
+13
|
||||
-12
|
||||
+1
|
||||
-11
|
||||
-12
|
||||
-4
|
||||
+12
|
||||
-9
|
||||
-16
|
||||
-7
|
||||
+16
|
||||
+12
|
||||
+2
|
||||
-17
|
||||
-17
|
||||
+9
|
||||
-7
|
||||
-10
|
||||
-8
|
||||
+1
|
||||
-2
|
||||
+7
|
||||
+9
|
||||
+8
|
||||
+8
|
||||
-17
|
||||
-5
|
||||
-7
|
||||
-11
|
||||
-8
|
||||
-10
|
||||
-6
|
||||
+11
|
||||
-17
|
||||
-8
|
||||
-13
|
||||
+18
|
||||
-19
|
||||
+10
|
||||
-19
|
||||
-12
|
||||
-5
|
||||
-12
|
||||
-15
|
||||
+3
|
||||
-15
|
||||
+14
|
||||
+9
|
||||
+19
|
||||
-1
|
||||
-12
|
||||
-10
|
||||
+12
|
||||
-18
|
||||
-15
|
||||
+4
|
||||
-15
|
||||
+17
|
||||
-20
|
||||
+10
|
||||
+1
|
||||
+15
|
||||
+10
|
||||
+10
|
||||
-9
|
||||
+12
|
||||
-16
|
||||
+15
|
||||
+14
|
||||
+5
|
||||
-6
|
||||
+3
|
||||
+14
|
||||
-3
|
||||
+8
|
||||
+2
|
||||
-1
|
||||
+3
|
||||
-10
|
||||
-7
|
||||
+23
|
||||
-3
|
||||
-22
|
||||
+5
|
||||
+21
|
||||
+18
|
||||
-15
|
||||
-9
|
||||
+11
|
||||
+3
|
||||
+14
|
||||
+11
|
||||
+19
|
||||
-14
|
||||
-18
|
||||
+14
|
||||
-4
|
||||
+13
|
||||
+12
|
||||
+12
|
||||
+18
|
||||
+9
|
||||
-4
|
||||
-18
|
||||
+4
|
||||
+17
|
||||
-10
|
||||
+20
|
||||
-2
|
||||
+9
|
||||
-2
|
||||
+4
|
||||
-10
|
||||
+19
|
||||
-16
|
||||
+4
|
||||
-22
|
||||
-1
|
||||
+13
|
||||
+7
|
||||
+11
|
||||
+2
|
||||
+11
|
||||
-19
|
||||
+11
|
||||
+9
|
||||
+14
|
||||
-9
|
||||
+5
|
||||
+7
|
||||
+2
|
||||
+13
|
||||
+10
|
||||
+1
|
||||
+16
|
||||
-5
|
||||
-17
|
||||
-8
|
||||
+5
|
||||
+4
|
||||
+6
|
||||
+1
|
||||
+12
|
||||
+14
|
||||
-19
|
||||
+1
|
||||
+11
|
||||
-8
|
||||
-25
|
||||
-6
|
||||
-18
|
||||
+26
|
||||
+17
|
||||
+12
|
||||
-15
|
||||
+19
|
||||
+7
|
||||
-5
|
||||
+20
|
||||
-5
|
||||
+2
|
||||
+12
|
||||
-11
|
||||
-6
|
||||
-2
|
||||
+6
|
||||
-19
|
||||
-24
|
||||
-15
|
||||
+20
|
||||
+3
|
||||
+26
|
||||
+17
|
||||
+13
|
||||
-23
|
||||
+31
|
||||
+5
|
||||
+29
|
||||
-30
|
||||
+5
|
||||
+56
|
||||
-59
|
||||
-59
|
||||
-40
|
||||
-14
|
||||
+18
|
||||
-66
|
||||
-7
|
||||
-23
|
||||
-1
|
||||
-12
|
||||
-6
|
||||
-16
|
||||
+4
|
||||
+8
|
||||
+17
|
||||
+21
|
||||
-14
|
||||
-18
|
||||
-7
|
||||
-18
|
||||
-5
|
||||
+1
|
||||
+12
|
||||
+2
|
||||
+2
|
||||
+15
|
||||
+21
|
||||
-20
|
||||
-4
|
||||
-4
|
||||
-14
|
||||
-9
|
||||
-22
|
||||
+15
|
||||
-9
|
||||
+13
|
||||
-16
|
||||
+7
|
||||
-17
|
||||
-10
|
||||
-3
|
||||
-14
|
||||
+2
|
||||
-10
|
||||
-19
|
||||
-8
|
||||
-19
|
||||
+6
|
||||
-15
|
||||
-18
|
||||
+3
|
||||
-19
|
||||
+10
|
||||
-6
|
||||
+7
|
||||
+20
|
||||
-4
|
||||
-6
|
||||
-13
|
||||
-14
|
||||
-11
|
||||
+5
|
||||
+7
|
||||
-9
|
||||
+11
|
||||
-1
|
||||
+9
|
||||
+13
|
||||
-15
|
||||
-10
|
||||
-13
|
||||
-5
|
||||
-13
|
||||
-6
|
||||
+5
|
||||
+20
|
||||
-7
|
||||
-10
|
||||
+13
|
||||
-5
|
||||
+13
|
||||
-6
|
||||
+5
|
||||
-18
|
||||
-12
|
||||
-12
|
||||
-17
|
||||
+6
|
||||
-9
|
||||
-21
|
||||
+1
|
||||
+6
|
||||
-12
|
||||
+15
|
||||
-14
|
||||
+24
|
||||
+6
|
||||
+18
|
||||
-16
|
||||
+15
|
||||
-18
|
||||
-6
|
||||
+20
|
||||
+11
|
||||
+4
|
||||
-17
|
||||
+8
|
||||
-9
|
||||
+78549
|
36
2018/1/main.c
Normal file
36
2018/1/main.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
FILE *stream;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
int nread;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
stream = fopen(argv[1], "r");
|
||||
if (stream == NULL) {
|
||||
perror("fopen");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int number;
|
||||
int total = 0;
|
||||
|
||||
while ((nread = getline(&line, &len, stream)) != -1) {
|
||||
number = atoi(line);
|
||||
total += number;
|
||||
}
|
||||
|
||||
printf("%d\n", total);
|
||||
|
||||
free(line);
|
||||
fclose(stream);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
16
2018/2/2/Makefile
Normal file
16
2018/2/2/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
|||
CXX = g++-7
|
||||
CC = g++-7
|
||||
CXXFLAGS = -Wall -Wextra
|
||||
|
||||
all: main
|
||||
|
||||
main.o: main.cpp
|
||||
$(CXX) $(CXXFLAGS) -c main.cpp
|
||||
|
||||
main: main.o
|
||||
|
||||
clean:
|
||||
rm -f *.o *.h.gch *.exe main
|
||||
|
||||
run: all
|
||||
./main
|
37
2018/2/2/main.cpp
Normal file
37
2018/2/2/main.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main () {
|
||||
ifstream input;
|
||||
input.open("../input");
|
||||
string line;
|
||||
|
||||
vector<string> strings = {};
|
||||
|
||||
while (getline(input, line)) {
|
||||
strings.push_back(line);
|
||||
}
|
||||
|
||||
// Compare every string with ones that come after it.
|
||||
for (vector<string>::const_iterator it = strings.begin(); it != strings.end(); ++it) {
|
||||
for (vector<string>::const_iterator it2 = ++it; it2 != strings.end(); ++it2) {
|
||||
int differences = 0;
|
||||
string::const_iterator str_it = it->begin();
|
||||
|
||||
for (string::const_iterator str_it2 = it2->begin(); str_it2 != it2->end(); ++str_it2) {
|
||||
if (*str_it != *str_it2) {
|
||||
++differences;
|
||||
}
|
||||
++str_it;
|
||||
}
|
||||
//cout << differences << endl;
|
||||
if (differences == 1) {
|
||||
cout << "Found a difference of 1 in strings: " << *it << " and " << *it2 << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
16
2018/2/Makefile
Normal file
16
2018/2/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
|||
CXX = g++-7
|
||||
CC = g++-7
|
||||
CXXFLAGS = -Wall -Wextra
|
||||
|
||||
all: main
|
||||
|
||||
main.o: main.cpp
|
||||
$(CXX) $(CXXFLAGS) -c main.cpp
|
||||
|
||||
main: main.o
|
||||
|
||||
clean:
|
||||
rm -f *.o *.h.gch *.exe main
|
||||
|
||||
run: all
|
||||
./main
|
250
2018/2/input
Normal file
250
2018/2/input
Normal file
|
@ -0,0 +1,250 @@
|
|||
bazvmqthjtrnlosiecxyghkwud
|
||||
pazvmqbijirzlosiecxyghkwud
|
||||
pazvtqbmjtrnlosiecxyghkwzd
|
||||
pazvmqbfjtrjlosnlcxyghkwud
|
||||
pazvkqbfjtrtlosiecjyghkwud
|
||||
paztmqbfjtrnbosiecxyglkwud
|
||||
pazvmqbfjtunlosievxmghkwud
|
||||
pazvmqbfjtmngosiecyyghkwud
|
||||
jazvmqbfjtrnlosiecxygikpud
|
||||
pazvqqbfctrnlosimcxyghkwud
|
||||
pazvmqbfjtrnwogiecxyihkwud
|
||||
pazvmqbfjtrqlojiecxeghkwud
|
||||
payvmqbfjtrzlosiecxyghkwuk
|
||||
pkzvmqnfjtrnlosieciyghkwud
|
||||
pazvmqqfjtrnldsiecxyghkwui
|
||||
pazvmqbfttrqlosiecxywhkwud
|
||||
gazvmybfjthnlosiecxyghkwud
|
||||
pazvmqbfjtrnlasiecxygptwud
|
||||
pktvmqbfjtrnwosiecxyghkwud
|
||||
pazvmqwfjtrnlosiecxgghkkud
|
||||
pazvmzkbjtrnlosiecxyghkwud
|
||||
pazvmqbfjtrnloslecxyghuwui
|
||||
pezvmqbfjtrnlesieyxyghkwud
|
||||
cazvmqbfjrrnlosiecxyghkmud
|
||||
pazvmqrfjjrnlosiecxyghkwnd
|
||||
pazvmqbgjtrnlosiecxyphtwud
|
||||
pazvmqbvmtrnlosiecxyghkpud
|
||||
pazdmqbfjtrnlosiecxyuhkpud
|
||||
pazvmqbflnrnloshecxyghkwud
|
||||
pazvvqbfjprilosiecxyghkwud
|
||||
pazvwqbfjtrllosiecxyghknud
|
||||
pazvmqbfjtrnloniecxdghkaud
|
||||
pazvmqbfjtrnlvsuecxynhkwud
|
||||
ptzvmqwfjtrnlosieccyghkwud
|
||||
pkzvmqbjjtrnlosiecryghkwud
|
||||
pazvmqqfjtrexosiecxyghkwud
|
||||
pazgmqbfjtrneoyiecxyghkwud
|
||||
paznmqbfjtrnlosiecxydhkwzd
|
||||
pazvmqbfjtrnaosiwcxsghkwud
|
||||
pazomqbfjxrnlosiewxyghkwud
|
||||
pazsmqbfjprnlosiecxrghkwud
|
||||
pazvmqbfqtrnoosiecxygmkwud
|
||||
aazvmqbfjtrnlosiacxyghjwud
|
||||
pazviqbfjtrnlobiecxygrkwud
|
||||
qazwmqbfjhrnlosiecxyghkwud
|
||||
pazvmqbfftrnlosiqcxygfkwud
|
||||
patvmqbfjtonlosircxyghkwud
|
||||
pazvmqbfjtrnlomaecxyghkpud
|
||||
paztmqbfjtrulossecxyghkwud
|
||||
pazvmqbijtrnlobiecxyghkwkd
|
||||
pazvsqbfjtrnlospecxyghkqud
|
||||
pbzmmqbfjtrnlosiecxyghkwhd
|
||||
pezvkqbfjtenlosiecxyghkwud
|
||||
razvmqbfjkrnlosiecxeghkwud
|
||||
pazcmqbfjtrnloriecxyghkgud
|
||||
pazvmqbfftfnlosiecvyghkwud
|
||||
pazvmqpujtrnlosiepxyghkwud
|
||||
patvgqbfjtrnloslecxyghkwud
|
||||
pazvmqbfltrnlosibcxyghswud
|
||||
pazvmebfjtrnlosaecxyehkwud
|
||||
pazdmqbejtrnlosiecxyghrwud
|
||||
pazvmcbfntrplosiecxyghkwud
|
||||
pszvmqbfjtrnlosivcfyghkwud
|
||||
puzvmqbfjtrnloeiecxyxhkwud
|
||||
pazvmqbfjtrivooiecxyghkwud
|
||||
pazvyqbfjtrngosiwcxyghkwud
|
||||
pauvmqbfjtrnlosimexyghkwud
|
||||
pazvmqbfjtrnwoshecxeghkwud
|
||||
dazvmqbfjtrnloshecxygxkwud
|
||||
pazvmqbfjtrtdosiecxyghvwud
|
||||
pazxmqbfjtrnlosieceyghjwud
|
||||
pazvmqbfjtrnlosihexjghkwud
|
||||
pazvmqbfjsrnlosiecxughiwud
|
||||
phzvcqbfjtrqlosiecxyghkwud
|
||||
pazvmibfjtrnlosjecxxghkwud
|
||||
pazvmqbfjtrbeosiecxlghkwud
|
||||
pazvmqyfjttolosiecxyghkwud
|
||||
fawvmqbfjtrnlosiecxyghkwhd
|
||||
pazvmqbfjprnxosiecxyghkbud
|
||||
macvmqbfjtrnlosiesxyghkwud
|
||||
pazsmqbfjtrflouiecxyghkwud
|
||||
pacvmqbfjtrnltsiecxyghcwud
|
||||
pazvmqbfjtymlosiecxygykwud
|
||||
pazvmqbfjtrclosiecxygukwmd
|
||||
pazvmqbfjtrnlobiecxphhkwud
|
||||
mazvmqbhitrnlosiecxyghkwud
|
||||
pazvmqdtjtrnlrsiecxyghkwud
|
||||
pazvmqbfjgrnllsieczyghkwud
|
||||
pazvmqbfjtrilosiecxxgikwud
|
||||
pazvmqbjjtrnlosreceyghkwud
|
||||
paxvmmbfjtrilosiecxyghkwud
|
||||
pazqmwbfjtrnlowiecxyghkwud
|
||||
pazvmqbfjfrnqosiecxyghkwui
|
||||
pazvmqbfjtrrgosiecxyghswud
|
||||
pazvmqnfjtrnlosiecsyghkwmd
|
||||
paiemqbmjtrnlosiecxyghkwud
|
||||
pazvmqbfdtqnlosiecxyjhkwud
|
||||
pazvmxbfjthndosiecxyghkwud
|
||||
pqzvmqbfjtrnlosiecxbghkzud
|
||||
pagrmqbfjtrnlosiecxygskwud
|
||||
pazamqtfjtrnsosiecxyghkwud
|
||||
pazvmqbfjtrnldshecxyzhkwud
|
||||
pazvmnbfjtrllosieclyghkwud
|
||||
snzvmqbfjnrnlosiecxyghkwud
|
||||
pazvsqbfjdrnlosiecxyghswud
|
||||
pazvmqnfjfrnlosiecsyghkwud
|
||||
pazvmqbfjtrnlosiecxjghowum
|
||||
pazvmqbfjtjnlosieczygfkwud
|
||||
pazvmqbsjtrnloziecxyghkeud
|
||||
pazvxqbgjtrnlooiecxyghkwud
|
||||
pazvmqbfjtrnlooiecxmyhkwud
|
||||
pazvmqbyftrnlosgecxyghkwud
|
||||
pazvmqbfjtrnlosiwcxyqhksud
|
||||
pazvmqkyjtrnlokiecxyghkwud
|
||||
pazfmqbfjtrnlosijcxyohkwud
|
||||
pazvmqbfjtrnlociecxygikcud
|
||||
fazvmqbfjtrnlosiecxyjhkuud
|
||||
pazvmqbojtknlohiecxyghkwud
|
||||
pazvmqbfjtgnlosbecxyghkwux
|
||||
pazvmqbfjtrnlocieckoghkwud
|
||||
pazvdqbfjtrlltsiecxyghkwud
|
||||
pazvmqbfjtsnlfsiecxyglkwud
|
||||
przvpqbfjtrnyosiecxyghkwud
|
||||
pazvmbrfjtrnlosiecxmghkwud
|
||||
dazvmqbfttrnlostecxyghkwud
|
||||
pazvmqbfttdnlosiecxygwkwud
|
||||
pazvmqbvitrnlosieexyghkwud
|
||||
pazvmqbfjhrnlosjecxyvhkwud
|
||||
pazvmqbfstrnlosiecxyggkwpd
|
||||
bazvmqbfjtrnlmsiecxyohkwud
|
||||
patmmqbfjtrnlosizcxyghkwud
|
||||
pazvmqbfwtrglosieqxyghkwud
|
||||
pazvmqbfjtrnlosiecxdhhkwmd
|
||||
pazvmqbfjdrnlosnexxyghkwud
|
||||
oazrrqbfjtrnlosiecxyghkwud
|
||||
pazvmqbfjcrnlosiecxygakwjd
|
||||
pazvmqbfjtrnlosifcxfghkwyd
|
||||
pazvmnbfjtrnlosiecxyahzwud
|
||||
pazvmqbfgtrnlojiecxyghkgud
|
||||
pazvmqbfjtrnlaliecxyghkwuy
|
||||
pazvmqbfjtrnlfsiecrtghkwud
|
||||
pazvmqbkjtrnloswecxdghkwud
|
||||
pazvtqbfjtdnlosiecxyghkwuu
|
||||
pozvmqbfrtrnlosiesxyghkwud
|
||||
payvmqbfjornlossecxyghkwud
|
||||
pazvuqbfjtrnlosiscxyghkpud
|
||||
pgzcmqbfjtrnlotiecxyghkwud
|
||||
pazvvqbfjtrnlobieyxyghkwud
|
||||
pazycqbfjtrnlosiecxyzhkwud
|
||||
pizvdqbfjtrnlosiecxbghkwud
|
||||
pazvmqbfjtrnloqiecxmgtkwud
|
||||
gazvmqbfjtrnlusiecxpghkwud
|
||||
pazvmqdfjtralosiecxyghkwmd
|
||||
pazvmqbfjtmnlosiecxywhawud
|
||||
pazvlqbfjtrnlosqecxyghqwud
|
||||
pazvmqbfjtrnlhsneixyghkwud
|
||||
kazvmqbfjtrqlosimcxyghkwud
|
||||
pazvmwbfjtrclosiecxyghkuud
|
||||
pazvmqjfjtrnlosieckyghpwud
|
||||
pezvmqbgjtrnloseecxyghkwud
|
||||
pazvqqbfjtfnlosvecxyghkwud
|
||||
oazvmqbfjtunlosiecxyghkwad
|
||||
pazvmqbfjtrncoswecxyghfwud
|
||||
pazvyqbfjtrnlosqecxygtkwud
|
||||
pazvmqbfjtrvlzsiecxygwkwud
|
||||
pazvmqbfjjrnlosiekxylhkwud
|
||||
madvmqbfjtrnlosircxyghkwud
|
||||
pazvmybfjtrnlisiecxyghkwbd
|
||||
pazvmqbjjixnlosiecxyghkwud
|
||||
pazvmqefjtrnloqiecxyghhwud
|
||||
pazveqbfjtrnlosiecgygzkwud
|
||||
pazvmqbfjtrxlosiecxmgwkwud
|
||||
uazvmqufjtrnlosiecxyghkwuo
|
||||
pasymqbfjtrnlosiecxyghowud
|
||||
pazvmqbfjtlnlpsiecxyghswud
|
||||
pnzvmqbfjprnloszecxyghkwud
|
||||
pafjmqcfjtrnlosiecxyghkwud
|
||||
pazvmqxfbtrnloqiecxyghkwud
|
||||
pazvmzbfjtrnposiccxyghkwud
|
||||
pazvmqbfjotulosiecxyghkwud
|
||||
pazvmqbfotrnlosgecxykhkwud
|
||||
przvmqbfjtrnlosiecxyqhkwcd
|
||||
pazvmqbfjtsnlogiecxyyhkwud
|
||||
pazvmqbfrtrnlzsiecxyghkwug
|
||||
pazvmqbfjtrnlosiecxzgukwuo
|
||||
pqzvmqbqjtrnlosdecxyghkwud
|
||||
pazvmqbfjtqqlosiecxughkwud
|
||||
pazvmqbfjtrnlosiedhyphkwud
|
||||
pazsmqbcutrnlosiecxyghkwud
|
||||
pazvmqbgrtrnlosiecxyghpwud
|
||||
pazemqbfjtznlosiecxyghkvud
|
||||
pazvkqbfjtrilosiecxyghkwod
|
||||
pfzvmqbfjtrnlopiecxygjkwud
|
||||
pazvmqvfjtreloniecxyghkwud
|
||||
pazvmqbfjernljsiecxgghkwud
|
||||
pazvmqikjtrnlosiecxyghqwud
|
||||
pazvmqbfjtrnpesoecxyghkwud
|
||||
fazvmqbfjtrnlosihchyghkwud
|
||||
pazvmqbfjtgnloanecxyghkwud
|
||||
pazvmqsfjqrnlosiecxychkwud
|
||||
parvmqbfjtrnlosiecxygfuwud
|
||||
przvmqbfjtrhlosihcxyghkwud
|
||||
pazvmqbcjtrnlosimcxgghkwud
|
||||
pazvmqbfjtrnlosceciyjhkwud
|
||||
pazvkqbfjtrylosivcxyghkwud
|
||||
pazvmqbfjtrnlgsieoxyghdwud
|
||||
pazvmqnfstrnlowiecxyghkwud
|
||||
pazvmqbfdtrnlosieumyghkwud
|
||||
pazvmqbfjtrnlosyecxfghkwul
|
||||
pazvmqbfjtrclosivcxyghkcud
|
||||
pazjmqbfjtrnlosiecxygokwkd
|
||||
hazvmqbfjtrflosiecxzghkwud
|
||||
wazvmqbfjtrnlomiecxyphkwud
|
||||
yazvmqbfjirnkosiecxyghkwud
|
||||
pczvmqbfjtrnlohiecxyghkwpd
|
||||
pazvmqbfotrbeosiecxlghkwud
|
||||
pazvmqbfjtrplosiecxynhzwud
|
||||
paxvbqbwjtrnlosiecxyghkwud
|
||||
pazvmqvfjtrnlosiecbyghqwud
|
||||
pazjmqbfjtrnlosiecxoghkwed
|
||||
pazvmqbfjtreljsitcxyghkwud
|
||||
mazamqbfjtrnlosiecxoghkwud
|
||||
pazvmqbfjjrnposiscxyghkwud
|
||||
pbrvmqbfjtrnloliecxyghkwud
|
||||
pazvmqbfjtrnlosiecxgghkyyd
|
||||
pmzvmqbfntrnlosiecxyghkwuw
|
||||
pazvzqbfjtrnlosienxyghzwud
|
||||
pazvmqifjtvnlosrecxyghkwud
|
||||
tazvmqbhjtjnlosiecxyghkwud
|
||||
pazvmqbfjtlnxosiecxyghkwuo
|
||||
pazvmqbfjennlosiecxyghkwxd
|
||||
pahvmqbfjhrnlosiecxythkwud
|
||||
pazvmlkfjtrnlxsiecxyghkwud
|
||||
pfzvmqbojtrnlosieciyghkwud
|
||||
pazvbqbfjtrollsiecxyghkwud
|
||||
eazvmqbfjtrnlosiecayghkoud
|
||||
pazvmqbfjtjnlvsiecxyghkwsd
|
||||
pazvoqbojtrnlosiecfyghkwud
|
||||
pazvmqbfjtuslosiecxyghksud
|
||||
pazvmqbfjnrnlosiedxyghkwup
|
||||
pazvmqbjjtrnlosieaxyghdwud
|
||||
pazccqbfjtrhlosiecxyghkwud
|
||||
pbzvmqkfjtrnlosievxyghkwud
|
||||
pazvmqrljtrnlosiscxyghkwud
|
||||
pazvmqbfjfoqlosiecxyghkwud
|
||||
pazcmqbfjtrnlosiecxyihkwuf
|
||||
pszvmqbfjtrnnosiacxyghkwud
|
||||
aazvmqbfjtrnlosieyxyghkwld
|
||||
pazvrqbfntrnlosiycxyghkwud
|
||||
pkzvoqbfjtrnlosiecxyghxwud
|
48
2018/2/main.cpp
Normal file
48
2018/2/main.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <iostream>
|
||||
#include <map>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main () {
|
||||
int twice = 0;
|
||||
int thrice = 0;
|
||||
|
||||
ifstream input;
|
||||
input.open("input");
|
||||
string line;
|
||||
|
||||
while (getline(input, line)) {
|
||||
map<char, int> freqs;
|
||||
|
||||
for (string::const_iterator it = line.begin(); it != line.end(); ++it) {
|
||||
auto found = freqs.find(*it);
|
||||
if (found == freqs.end()) {
|
||||
freqs.insert(pair<char,int>(*it, 1));
|
||||
} else {
|
||||
found->second++;
|
||||
}
|
||||
}
|
||||
|
||||
int twice_found = false;
|
||||
int thrice_found = false;
|
||||
|
||||
for (map<char, int>::const_iterator it = freqs.begin(); it != freqs.end(); ++it) {
|
||||
if (it->second == 2) {
|
||||
twice_found = true;
|
||||
} else if (it->second == 3) {
|
||||
thrice_found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (twice_found) {
|
||||
++twice;
|
||||
}
|
||||
|
||||
if (thrice_found) {
|
||||
++thrice;
|
||||
}
|
||||
}
|
||||
|
||||
cout << (twice * thrice) << endl;
|
||||
}
|
1347
2018/3/input
Normal file
1347
2018/3/input
Normal file
File diff suppressed because it is too large
Load diff
31
2018/3/main.rb
Normal file
31
2018/3/main.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
require 'pry'
|
||||
|
||||
arr = Array.new(1000){Array.new(1000){{count: 0, id: nil}}}
|
||||
|
||||
ids = Array.new
|
||||
dups = Array.new
|
||||
|
||||
File.open("input", "r") do |f|
|
||||
f.each_line do |line|
|
||||
id = line[/\d+/].to_i
|
||||
offset_left, offset_top = line[/\d+,\d+/].split(",").map(&:to_i)
|
||||
width, height = line[/\d+x\d+/].split("x").map(&:to_i)
|
||||
|
||||
ids.push id
|
||||
|
||||
height.times do |y|
|
||||
width.times do |x|
|
||||
arr[offset_top + y][offset_left + x][:count] += 1
|
||||
if arr[offset_top + y][offset_left + x][:id] != nil
|
||||
dups.push arr[offset_top + y][offset_left + x][:id]
|
||||
dups.push id
|
||||
end
|
||||
arr[offset_top + y][offset_left + x][:id] = id
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
puts arr.flatten.select{|a| a[:count] > 1}.count
|
||||
|
||||
puts (ids - dups.uniq)
|
1110
2018/4/input
Normal file
1110
2018/4/input
Normal file
File diff suppressed because it is too large
Load diff
88
2018/4/main.rb
Normal file
88
2018/4/main.rb
Normal file
|
@ -0,0 +1,88 @@
|
|||
require 'pry'
|
||||
|
||||
events = []
|
||||
|
||||
guards = {}
|
||||
|
||||
File.open("input", "r") do |f|
|
||||
f.each_line do |line|
|
||||
events.push ({
|
||||
date: line[/\d{4}-\d{2}-\d{2} \d{2}:\d{2}/],
|
||||
type: (line.end_with?("shift\n") ? :begins_shift : (line.end_with?("asleep\n") ? :falls_asleep : :wakes_up)),
|
||||
id: line[/#\d+/].to_s[1..-1].to_i
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
events.sort_by! do |event|
|
||||
event[:date]
|
||||
end
|
||||
|
||||
current_guard = 0
|
||||
begin_minute = 0
|
||||
|
||||
events.each do |event|
|
||||
if event[:type] == :begins_shift
|
||||
if guards[event[:id]].nil?
|
||||
guards[event[:id]] = Array.new(60){0}
|
||||
end
|
||||
|
||||
current_guard = event[:id]
|
||||
elsif event[:type] == :falls_asleep
|
||||
begin_minute = event[:date][-2..-1].to_i
|
||||
else
|
||||
(event[:date][-2..-1].to_i - begin_minute).times do |minute|
|
||||
guards[current_guard][begin_minute + minute] += 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Strategy 1
|
||||
|
||||
sleepiest_guard = 0
|
||||
longest_time = 0
|
||||
|
||||
guards.each do |id, counts|
|
||||
time = counts.inject(:+)
|
||||
if time > longest_time
|
||||
longest_time = time
|
||||
sleepiest_guard = id
|
||||
end
|
||||
end
|
||||
|
||||
sleepiest_minute = 0
|
||||
max_count = 0
|
||||
|
||||
guards[sleepiest_guard].each_with_index do |count, index|
|
||||
if count > max_count
|
||||
max_count = count
|
||||
sleepiest_minute = index
|
||||
end
|
||||
end
|
||||
|
||||
puts sleepiest_minute * sleepiest_guard
|
||||
|
||||
# Strategy 2
|
||||
|
||||
guard = 0
|
||||
minute = 0
|
||||
count = 0
|
||||
|
||||
guards.each do |id, counts|
|
||||
max_count = 0
|
||||
max_index = 0
|
||||
counts.each_with_index do |count_, index|
|
||||
if count_ > max_count
|
||||
max_count = count_
|
||||
max_index = index
|
||||
end
|
||||
end
|
||||
|
||||
if max_count > count
|
||||
guard = id
|
||||
minute = max_index
|
||||
count = max_count
|
||||
end
|
||||
end
|
||||
|
||||
puts guard * minute
|
1
2018/5/input
Normal file
1
2018/5/input
Normal file
File diff suppressed because one or more lines are too long
49
2018/5/main.rb
Normal file
49
2018/5/main.rb
Normal file
|
@ -0,0 +1,49 @@
|
|||
require 'pry'
|
||||
|
||||
input = File.open('input') {|file| file.readline}
|
||||
|
||||
('a'..'z').each do |letter|
|
||||
output = input
|
||||
temp = ""
|
||||
|
||||
i = 0
|
||||
while i != output.length
|
||||
if output[i].downcase != letter
|
||||
temp += output[i]
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
|
||||
output = temp
|
||||
temp = ""
|
||||
|
||||
removed = true
|
||||
|
||||
while removed
|
||||
removed = false
|
||||
|
||||
i = 1
|
||||
while i < output.length
|
||||
if output[i - 1] != output[i] && output[i - 1].downcase == output[i].downcase
|
||||
removed = true
|
||||
i += 2
|
||||
|
||||
if i == output.length
|
||||
temp += output[-1]
|
||||
end
|
||||
else
|
||||
temp += output[i - 1]
|
||||
i += 1
|
||||
|
||||
if i == output.length
|
||||
temp += output[-1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
output = temp
|
||||
temp = ""
|
||||
end
|
||||
|
||||
puts "#{letter}: #{output.length}"
|
||||
end
|
50
2018/6/input
Normal file
50
2018/6/input
Normal file
|
@ -0,0 +1,50 @@
|
|||
135, 127
|
||||
251, 77
|
||||
136, 244
|
||||
123, 169
|
||||
253, 257
|
||||
359, 309
|
||||
100, 247
|
||||
191, 323
|
||||
129, 323
|
||||
76, 284
|
||||
69, 56
|
||||
229, 266
|
||||
74, 216
|
||||
236, 130
|
||||
152, 126
|
||||
174, 319
|
||||
315, 105
|
||||
329, 146
|
||||
288, 51
|
||||
184, 344
|
||||
173, 69
|
||||
293, 80
|
||||
230, 270
|
||||
279, 84
|
||||
107, 163
|
||||
130, 176
|
||||
347, 114
|
||||
133, 331
|
||||
237, 300
|
||||
291, 283
|
||||
246, 297
|
||||
60, 359
|
||||
312, 278
|
||||
242, 76
|
||||
81, 356
|
||||
204, 291
|
||||
187, 335
|
||||
176, 98
|
||||
103, 274
|
||||
357, 144
|
||||
314, 118
|
||||
67, 196
|
||||
156, 265
|
||||
254, 357
|
||||
218, 271
|
||||
118, 94
|
||||
300, 189
|
||||
290, 356
|
||||
354, 91
|
||||
209, 334
|
75
2018/6/main.rb
Normal file
75
2018/6/main.rb
Normal file
|
@ -0,0 +1,75 @@
|
|||
require 'pry'
|
||||
|
||||
coords = []
|
||||
|
||||
# Parse input file.
|
||||
|
||||
File.open("input", "r") do |f|
|
||||
f.each_line do |line|
|
||||
x, y = line.split(", ").map(&:chomp).map(&:to_i)
|
||||
coords.push({
|
||||
x: x,
|
||||
y: y,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
# Create matrix with correct size
|
||||
|
||||
left_bound = right_bound = coords.first[:x]
|
||||
top_bound = bottom_bound = coords.first[:y]
|
||||
|
||||
coords.each do |coord|
|
||||
if coord[:x] < left_bound
|
||||
left_bound = coord[:x]
|
||||
end
|
||||
|
||||
if coord[:x] > right_bound
|
||||
right_bound = coord[:x]
|
||||
end
|
||||
|
||||
if coord[:y] < top_bound
|
||||
top_bound = coord[:y]
|
||||
end
|
||||
|
||||
if coord[:y] > bottom_bound
|
||||
bottom_bound = coord[:y]
|
||||
end
|
||||
end
|
||||
|
||||
height = bottom_bound - top_bound + 1
|
||||
width = right_bound - left_bound + 1
|
||||
|
||||
coords.map!{|coord| {x: coord[:x] - left_bound, y: coord[:y] - top_bound}}
|
||||
|
||||
matrix = Array.new(height){Array.new(width){0}}
|
||||
|
||||
# Fill the matrix with lowest distance to coordinates
|
||||
|
||||
(0...height).each do |y|
|
||||
(0...width).each do |x|
|
||||
coords.each_with_index do |coord, i|
|
||||
distance = (x - coord[:x]).abs + (y - coord[:y]).abs
|
||||
|
||||
matrix[y][x] += distance
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
# Count the area for each coordinate.
|
||||
|
||||
(0...height).each do |y|
|
||||
(0...width).each do |x|
|
||||
if (y == 0 || x == 0 || y == height - 1 || x == width - 1) && matrix[y][x][:coords].length == 1
|
||||
coords[matrix[y][x][:coords].first][:infinite] = true
|
||||
else
|
||||
if matrix[y][x][:coords].length == 1
|
||||
coords[matrix[y][x][:coords].first][:area] += 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
=end
|
||||
|
||||
puts matrix.flatten.select{|point| point < 10000}.length
|
5
2018/6/sample
Normal file
5
2018/6/sample
Normal file
|
@ -0,0 +1,5 @@
|
|||
0, 0
|
||||
0, 10
|
||||
10, 0
|
||||
10, 10
|
||||
3, 4
|
101
2018/7/input
Normal file
101
2018/7/input
Normal file
|
@ -0,0 +1,101 @@
|
|||
Step Z must be finished before step B can begin.
|
||||
Step X must be finished before step D can begin.
|
||||
Step D must be finished before step P can begin.
|
||||
Step O must be finished before step C can begin.
|
||||
Step C must be finished before step Y can begin.
|
||||
Step K must be finished before step J can begin.
|
||||
Step H must be finished before step T can begin.
|
||||
Step B must be finished before step Q can begin.
|
||||
Step V must be finished before step M can begin.
|
||||
Step E must be finished before step W can begin.
|
||||
Step S must be finished before step J can begin.
|
||||
Step I must be finished before step N can begin.
|
||||
Step T must be finished before step L can begin.
|
||||
Step N must be finished before step M can begin.
|
||||
Step P must be finished before step G can begin.
|
||||
Step F must be finished before step Q can begin.
|
||||
Step J must be finished before step G can begin.
|
||||
Step L must be finished before step G can begin.
|
||||
Step Y must be finished before step R can begin.
|
||||
Step U must be finished before step A can begin.
|
||||
Step W must be finished before step G can begin.
|
||||
Step R must be finished before step G can begin.
|
||||
Step G must be finished before step M can begin.
|
||||
Step A must be finished before step Q can begin.
|
||||
Step M must be finished before step Q can begin.
|
||||
Step N must be finished before step F can begin.
|
||||
Step Y must be finished before step W can begin.
|
||||
Step J must be finished before step W can begin.
|
||||
Step U must be finished before step G can begin.
|
||||
Step X must be finished before step L can begin.
|
||||
Step P must be finished before step J can begin.
|
||||
Step L must be finished before step Y can begin.
|
||||
Step G must be finished before step Q can begin.
|
||||
Step K must be finished before step G can begin.
|
||||
Step V must be finished before step J can begin.
|
||||
Step F must be finished before step U can begin.
|
||||
Step V must be finished before step N can begin.
|
||||
Step I must be finished before step T can begin.
|
||||
Step U must be finished before step W can begin.
|
||||
Step S must be finished before step A can begin.
|
||||
Step C must be finished before step G can begin.
|
||||
Step L must be finished before step A can begin.
|
||||
Step E must be finished before step L can begin.
|
||||
Step D must be finished before step H can begin.
|
||||
Step Z must be finished before step E can begin.
|
||||
Step J must be finished before step U can begin.
|
||||
Step R must be finished before step A can begin.
|
||||
Step C must be finished before step J can begin.
|
||||
Step T must be finished before step R can begin.
|
||||
Step Z must be finished before step D can begin.
|
||||
Step Y must be finished before step G can begin.
|
||||
Step Y must be finished before step M can begin.
|
||||
Step X must be finished before step H can begin.
|
||||
Step S must be finished before step Q can begin.
|
||||
Step R must be finished before step Q can begin.
|
||||
Step D must be finished before step Q can begin.
|
||||
Step G must be finished before step A can begin.
|
||||
Step N must be finished before step A can begin.
|
||||
Step F must be finished before step L can begin.
|
||||
Step O must be finished before step N can begin.
|
||||
Step T must be finished before step J can begin.
|
||||
Step S must be finished before step T can begin.
|
||||
Step O must be finished before step M can begin.
|
||||
Step P must be finished before step Y can begin.
|
||||
Step I must be finished before step U can begin.
|
||||
Step V must be finished before step S can begin.
|
||||
Step F must be finished before step G can begin.
|
||||
Step P must be finished before step M can begin.
|
||||
Step C must be finished before step S can begin.
|
||||
Step A must be finished before step M can begin.
|
||||
Step C must be finished before step Q can begin.
|
||||
Step Y must be finished before step Q can begin.
|
||||
Step O must be finished before step P can begin.
|
||||
Step S must be finished before step R can begin.
|
||||
Step S must be finished before step Y can begin.
|
||||
Step I must be finished before step Q can begin.
|
||||
Step O must be finished before step T can begin.
|
||||
Step F must be finished before step W can begin.
|
||||
Step U must be finished before step R can begin.
|
||||
Step O must be finished before step U can begin.
|
||||
Step D must be finished before step L can begin.
|
||||
Step H must be finished before step I can begin.
|
||||
Step P must be finished before step R can begin.
|
||||
Step J must be finished before step L can begin.
|
||||
Step P must be finished before step W can begin.
|
||||
Step W must be finished before step Q can begin.
|
||||
Step X must be finished before step Q can begin.
|
||||
Step Z must be finished before step U can begin.
|
||||
Step T must be finished before step U can begin.
|
||||
Step D must be finished before step S can begin.
|
||||
Step U must be finished before step Q can begin.
|
||||
Step N must be finished before step G can begin.
|
||||
Step E must be finished before step Q can begin.
|
||||
Step X must be finished before step K can begin.
|
||||
Step J must be finished before step R can begin.
|
||||
Step X must be finished before step R can begin.
|
||||
Step T must be finished before step W can begin.
|
||||
Step K must be finished before step S can begin.
|
||||
Step S must be finished before step G can begin.
|
||||
Step P must be finished before step F can begin.
|
||||
Step X must be finished before step C can begin.
|
101
2018/7/main.rb
Normal file
101
2018/7/main.rb
Normal file
|
@ -0,0 +1,101 @@
|
|||
require 'pry'
|
||||
|
||||
orders = []
|
||||
instructions = []
|
||||
|
||||
# Parse input file.
|
||||
|
||||
File.open("input", "r") do |f|
|
||||
f.each_line do |line|
|
||||
first, second = line.scan(/\s[A-Z]{1}\s/).map(&:strip)
|
||||
orders.push({
|
||||
first: first,
|
||||
then: second
|
||||
})
|
||||
instructions.push(first)
|
||||
instructions.push(second)
|
||||
end
|
||||
end
|
||||
|
||||
instructions.uniq!
|
||||
|
||||
result = ""
|
||||
|
||||
workers = 5.times.map do
|
||||
{
|
||||
current_instruction: nil,
|
||||
time_left: 0
|
||||
}
|
||||
end
|
||||
|
||||
time = 0
|
||||
|
||||
while !instructions.empty?
|
||||
# Get a list of the next instructions available.
|
||||
next_instructions = instructions.select do |instruction|
|
||||
orders.none? do |order|
|
||||
order[:then] == instruction && order[:first] != nil
|
||||
end and workers.none? do |worker|
|
||||
worker[:current_instruction] == instruction
|
||||
end
|
||||
end.sort
|
||||
|
||||
# Give free workers instructions.
|
||||
workers.each_with_index do |worker, i|
|
||||
if worker[:current_instruction].nil? and !next_instructions.empty?
|
||||
workers[i][:current_instruction] = next_instructions[0]
|
||||
workers[i][:time_left] = next_instructions[0].ord - "A".ord + 1 + 60
|
||||
next_instructions.delete(next_instructions[0])
|
||||
end
|
||||
end
|
||||
|
||||
elapsed_time = workers.select do |worker|
|
||||
!worker[:current_instruction].nil?
|
||||
end.map do |worker|
|
||||
worker[:time_left]
|
||||
end.min
|
||||
|
||||
time += elapsed_time
|
||||
|
||||
workers.each_with_index do |worker, i|
|
||||
if !workers[i][:current_instruction].nil?
|
||||
workers[i][:time_left] -= elapsed_time
|
||||
|
||||
if workers[i][:time_left] == 0
|
||||
instructions.delete(workers[i][:current_instruction])
|
||||
orders.each do |order|
|
||||
if order[:first] == workers[i][:current_instruction]
|
||||
order[:first] = nil
|
||||
end
|
||||
end
|
||||
|
||||
workers[i][:current_instruction] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
#binding.pry
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
while !instructions.empty?
|
||||
next_instruction = instructions.select do |instruction|
|
||||
orders.none? do |order|
|
||||
order[:then] == instruction && order[:first] != nil
|
||||
end
|
||||
end.sort.first
|
||||
|
||||
result += next_instruction
|
||||
|
||||
instructions.delete next_instruction
|
||||
orders.each do |order|
|
||||
if order[:first] == next_instruction
|
||||
order[:first] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
=end
|
||||
|
||||
puts time
|
7
2018/7/sample
Normal file
7
2018/7/sample
Normal file
|
@ -0,0 +1,7 @@
|
|||
Step C must be finished before step A can begin.
|
||||
Step C must be finished before step F can begin.
|
||||
Step A must be finished before step B can begin.
|
||||
Step A must be finished before step D can begin.
|
||||
Step B must be finished before step E can begin.
|
||||
Step D must be finished before step E can begin.
|
||||
Step F must be finished before step E can begin.
|
4
2020/.formatter.exs
Normal file
4
2020/.formatter.exs
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Used by "mix format"
|
||||
[
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||
]
|
19
2020/lib/days/day1.ex
Normal file
19
2020/lib/days/day1.ex
Normal file
|
@ -0,0 +1,19 @@
|
|||
defmodule AOC.Day1 do
|
||||
def part1 do
|
||||
l = AOC.Util.input_integers(1, 1)
|
||||
[x, y] = Enum.filter(l, &((2020 - &1) in l))
|
||||
x * y
|
||||
end
|
||||
|
||||
def find_three([h | tl]) do
|
||||
case Enum.filter(tl, &((2020 - h - &1) in tl)) do
|
||||
[x, y] -> h * x * y
|
||||
_ -> find_three(tl)
|
||||
end
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_integers(1, 1)
|
||||
|> find_three()
|
||||
end
|
||||
end
|
48
2020/lib/days/day10.ex
Normal file
48
2020/lib/days/day10.ex
Normal file
|
@ -0,0 +1,48 @@
|
|||
defmodule AOC.Day10 do
|
||||
def find_diffs(xs), do: find_diffs(xs, %{})
|
||||
def find_diffs([_], acc), do: acc
|
||||
|
||||
def find_diffs([x1, x2 | xs], acc) do
|
||||
acc = Map.update(acc, x2 - x1, 1, &(&1 + 1))
|
||||
|
||||
find_diffs([x2 | xs], acc)
|
||||
end
|
||||
|
||||
def count_walks([x | _] = xs) do
|
||||
memo =
|
||||
Enum.into(xs, %{}, &{&1, 0})
|
||||
|> Map.put(x, 1)
|
||||
|
||||
count_walks(xs, memo)
|
||||
end
|
||||
|
||||
def count_walks([x], memo), do: memo[x]
|
||||
|
||||
def count_walks([x | xs], memo) do
|
||||
memo =
|
||||
Enum.take(xs, 3)
|
||||
|> Enum.reduce(memo, fn
|
||||
next, memo when next - x <= 3 ->
|
||||
Map.update!(memo, next, &(&1 + memo[x]))
|
||||
|
||||
_, memo ->
|
||||
memo
|
||||
end)
|
||||
|
||||
count_walks(xs, memo)
|
||||
end
|
||||
|
||||
def parts do
|
||||
input =
|
||||
AOC.Util.input_integers(10, 1)
|
||||
|> Enum.sort()
|
||||
|
||||
input = [0 | input] ++ [Enum.max(input) + 3]
|
||||
|
||||
%{1 => ones, 3 => threes} = find_diffs(input)
|
||||
part1 = ones * threes
|
||||
part2 = count_walks(input)
|
||||
|
||||
{part1, part2}
|
||||
end
|
||||
end
|
91
2020/lib/days/day11.ex
Normal file
91
2020/lib/days/day11.ex
Normal file
|
@ -0,0 +1,91 @@
|
|||
defmodule AOC.Day11 do
|
||||
@x_size 95
|
||||
@y_size 93
|
||||
|
||||
def parse_input do
|
||||
AOC.Util.input_lines(11, 1)
|
||||
|> Enum.with_index()
|
||||
|> Enum.reduce(%{}, fn {line, y}, acc ->
|
||||
line
|
||||
|> String.split("", trim: true)
|
||||
|> Enum.with_index()
|
||||
|> Enum.reject(&(elem(&1, 0) == "."))
|
||||
|> Enum.map(fn {_, i} -> {false, i} end)
|
||||
|> Enum.into(acc, fn {c, x} -> {{x, y}, c} end)
|
||||
end)
|
||||
end
|
||||
|
||||
def count_direct_adj(seats, {x, y}) do
|
||||
[
|
||||
{x - 1, y - 1},
|
||||
{x - 1, y},
|
||||
{x - 1, y + 1},
|
||||
{x, y - 1},
|
||||
{x, y + 1},
|
||||
{x + 1, y - 1},
|
||||
{x + 1, y},
|
||||
{x + 1, y + 1}
|
||||
]
|
||||
|> Enum.count(fn coords -> Map.get(seats, coords) end)
|
||||
end
|
||||
|
||||
def look_direction(seats, coords, next_fun) do
|
||||
{x, y} = coords = next_fun.(coords)
|
||||
|
||||
if x not in 0..@x_size or y not in 0..@y_size do
|
||||
false
|
||||
else
|
||||
case Map.get(seats, coords) do
|
||||
nil -> look_direction(seats, coords, next_fun)
|
||||
x -> x
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def count_sight_adj(seats, {x, y}) do
|
||||
[
|
||||
fn {x, y} -> {x + 1, y + 1} end,
|
||||
fn {x, y} -> {x + 1, y - 1} end,
|
||||
fn {x, y} -> {x - 1, y + 1} end,
|
||||
fn {x, y} -> {x - 1, y - 1} end,
|
||||
fn {x, y} -> {x + 1, y} end,
|
||||
fn {x, y} -> {x - 1, y} end,
|
||||
fn {x, y} -> {x, y + 1} end,
|
||||
fn {x, y} -> {x, y - 1} end
|
||||
]
|
||||
|> Enum.count(&look_direction(seats, {x, y}, &1))
|
||||
end
|
||||
|
||||
def simulate_round(seats, count_adj, min) do
|
||||
Enum.reduce(seats, {%{}, false}, fn {coords, x}, {acc, changed} ->
|
||||
new =
|
||||
case {x, count_adj.(seats, coords)} do
|
||||
{false, 0} -> true
|
||||
{true, count} when count >= min -> false
|
||||
_ -> x
|
||||
end
|
||||
|
||||
{Map.put(acc, coords, new), changed or new != x}
|
||||
end)
|
||||
end
|
||||
|
||||
def find_stable(seats, count_adj, min) do
|
||||
{seats, changed} = simulate_round(seats, count_adj, min)
|
||||
|
||||
if changed do
|
||||
find_stable(seats, count_adj, min)
|
||||
else
|
||||
seats
|
||||
end
|
||||
end
|
||||
|
||||
def parts do
|
||||
input = parse_input()
|
||||
stable = find_stable(input, &count_direct_adj/2, 4)
|
||||
part1 = Enum.count(stable, &elem(&1, 1))
|
||||
stable = find_stable(input, &count_sight_adj/2, 5)
|
||||
part2 = Enum.count(stable, &elem(&1, 1))
|
||||
|
||||
{part1, part2}
|
||||
end
|
||||
end
|
93
2020/lib/days/day12.ex
Normal file
93
2020/lib/days/day12.ex
Normal file
|
@ -0,0 +1,93 @@
|
|||
defmodule AOC.Day12 do
|
||||
@turn_right %{
|
||||
N: :E,
|
||||
E: :S,
|
||||
S: :W,
|
||||
W: :N
|
||||
}
|
||||
|
||||
def parse_input do
|
||||
AOC.Util.input_lines(12, 1)
|
||||
|> Enum.map(fn line ->
|
||||
{action, value} = String.split_at(line, 1)
|
||||
action = String.to_atom(action)
|
||||
value = String.to_integer(value)
|
||||
|
||||
{action, value}
|
||||
end)
|
||||
end
|
||||
|
||||
def handle_instruction1({:N, value}, acc), do: Map.update!(acc, :y, &(&1 - value))
|
||||
def handle_instruction1({:E, value}, acc), do: Map.update!(acc, :x, &(&1 + value))
|
||||
def handle_instruction1({:S, value}, acc), do: Map.update!(acc, :y, &(&1 + value))
|
||||
def handle_instruction1({:W, value}, acc), do: Map.update!(acc, :x, &(&1 - value))
|
||||
|
||||
def handle_instruction1({:F, value}, %{dir: dir} = acc),
|
||||
do: handle_instruction1({dir, value}, acc)
|
||||
|
||||
def handle_instruction1({:L, value}, acc), do: handle_instruction1({:R, -value}, acc)
|
||||
|
||||
def handle_instruction1({:R, value}, %{dir: dir} = acc) do
|
||||
value = rem(div(value, 90), 4)
|
||||
|
||||
value =
|
||||
if value < 0 do
|
||||
value + 4
|
||||
else
|
||||
value
|
||||
end
|
||||
|
||||
dir =
|
||||
List.duplicate(nil, value)
|
||||
|> Enum.reduce(dir, fn _, d -> Map.get(@turn_right, d) end)
|
||||
|
||||
Map.put(acc, :dir, dir)
|
||||
end
|
||||
|
||||
def handle_instruction2({:N, value}, acc), do: Map.update!(acc, :wpy, &(&1 - value))
|
||||
def handle_instruction2({:E, value}, acc), do: Map.update!(acc, :wpx, &(&1 + value))
|
||||
def handle_instruction2({:S, value}, acc), do: Map.update!(acc, :wpy, &(&1 + value))
|
||||
def handle_instruction2({:W, value}, acc), do: Map.update!(acc, :wpx, &(&1 - value))
|
||||
|
||||
def handle_instruction2({:F, value}, %{x: x, y: y, wpx: wpx, wpy: wpy} = acc),
|
||||
do: %{acc | x: x + value * wpx, y: y + value * wpy}
|
||||
|
||||
def handle_instruction2({:L, value}, acc), do: handle_instruction2({:R, -value}, acc)
|
||||
|
||||
def handle_instruction2({:R, value}, %{wpx: wpx, wpy: wpy} = acc) do
|
||||
value = rem(div(value, 90), 4)
|
||||
|
||||
value =
|
||||
if value < 0 do
|
||||
value + 4
|
||||
else
|
||||
value
|
||||
end
|
||||
|
||||
{wpx, wpy} =
|
||||
case value do
|
||||
0 -> {wpx, wpy}
|
||||
1 -> {-wpy, wpx}
|
||||
2 -> {-wpx, -wpy}
|
||||
3 -> {wpy, -wpx}
|
||||
end
|
||||
|
||||
%{acc | wpx: wpx, wpy: wpy}
|
||||
end
|
||||
|
||||
def handle_instructions(instructions, instruction_handler) do
|
||||
acc = %{x: 0, y: 0, dir: :E, wpx: 10, wpy: -1}
|
||||
Enum.reduce(instructions, acc, instruction_handler)
|
||||
end
|
||||
|
||||
def parts do
|
||||
input = parse_input()
|
||||
%{x: x, y: y} = handle_instructions(input, &handle_instruction1/2)
|
||||
part1 = abs(x) + abs(y)
|
||||
|
||||
%{x: x, y: y} = handle_instructions(input, &handle_instruction2/2)
|
||||
part2 = abs(x) + abs(y)
|
||||
|
||||
{part1, part2}
|
||||
end
|
||||
end
|
45
2020/lib/days/day13.ex
Normal file
45
2020/lib/days/day13.ex
Normal file
|
@ -0,0 +1,45 @@
|
|||
defmodule AOC.Day13 do
|
||||
def parse_input do
|
||||
[depart, buses] = AOC.Util.input_lines(13, 1)
|
||||
depart = String.to_integer(depart)
|
||||
|
||||
buses =
|
||||
buses
|
||||
|> String.split(",")
|
||||
|> Enum.map(fn
|
||||
bus when bus == "x" -> :x
|
||||
bus -> String.to_integer(bus)
|
||||
end)
|
||||
|
||||
{depart, buses}
|
||||
end
|
||||
|
||||
def find_earliest_bus(depart, buses), do: find_earliest_bus(depart, buses, {nil, :infinity})
|
||||
def find_earliest_bus(_, [], earliest), do: earliest
|
||||
|
||||
def find_earliest_bus(depart, [bus | tl], {_, earliest} = acc) do
|
||||
rounds = div(depart, bus)
|
||||
rounds = if rounds * bus < depart, do: rounds + 1, else: rounds
|
||||
wait = rounds * bus - depart
|
||||
|
||||
acc = if wait < earliest, do: {bus, wait}, else: acc
|
||||
|
||||
find_earliest_bus(depart, tl, acc)
|
||||
end
|
||||
|
||||
def find_offsets(buses) do
|
||||
buses
|
||||
|> Enum.with_index()
|
||||
|> Enum.reject(&(elem(&1, 0) |> is_atom()))
|
||||
end
|
||||
|
||||
def parts do
|
||||
{depart, buses} = parse_input()
|
||||
{bus, earliest} = find_earliest_bus(depart, Enum.reject(buses, &is_atom/1))
|
||||
part1 = bus * earliest
|
||||
|
||||
offsets = find_offsets(buses)
|
||||
|
||||
{part1, offsets}
|
||||
end
|
||||
end
|
36
2020/lib/days/day2.ex
Normal file
36
2020/lib/days/day2.ex
Normal file
|
@ -0,0 +1,36 @@
|
|||
defmodule AOC.Day2 do
|
||||
def parse_line(line) do
|
||||
[min, max, char, password] = String.split(line, [" ", "-", ":"], trim: true)
|
||||
password = String.to_charlist(password)
|
||||
[char] = String.to_charlist(char)
|
||||
min = String.to_integer(min)
|
||||
max = String.to_integer(max)
|
||||
[password, char, min, max]
|
||||
end
|
||||
|
||||
def validate_password1(password, char, min, max) do
|
||||
count = Enum.count(password, &(&1 == char))
|
||||
count in min..max
|
||||
end
|
||||
|
||||
def part1 do
|
||||
AOC.Util.input_lines(2, 1)
|
||||
|> Enum.map(&parse_line/1)
|
||||
|> Enum.map(&apply(__MODULE__, :validate_password1, &1))
|
||||
|> Enum.count(&Function.identity/1)
|
||||
end
|
||||
|
||||
def validate_password2(password, char, pos1, pos2) do
|
||||
m1 = Enum.at(password, pos1 - 1) == char
|
||||
m2 = Enum.at(password, pos2 - 1) == char
|
||||
|
||||
(m1 or m2) and not (m1 and m2)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_lines(2, 1)
|
||||
|> Enum.map(&parse_line/1)
|
||||
|> Enum.map(&apply(__MODULE__, :validate_password2, &1))
|
||||
|> Enum.count(&Function.identity/1)
|
||||
end
|
||||
end
|
33
2020/lib/days/day3.ex
Normal file
33
2020/lib/days/day3.ex
Normal file
|
@ -0,0 +1,33 @@
|
|||
defmodule AOC.Day3 do
|
||||
@line_length 31
|
||||
|
||||
def count_trees(lines, jump), do: count_trees(lines, jump, 0, 0)
|
||||
def count_trees([], _, _, acc), do: acc
|
||||
|
||||
def count_trees([hd | tl], jump, x, acc) do
|
||||
acc =
|
||||
acc +
|
||||
if String.at(hd, x) == "#" do
|
||||
1
|
||||
else
|
||||
0
|
||||
end
|
||||
|
||||
x = rem(x + jump, @line_length)
|
||||
count_trees(tl, jump, x, acc)
|
||||
end
|
||||
|
||||
def part1 do
|
||||
AOC.Util.input_lines(3, 1)
|
||||
|> count_trees(3)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
lines = AOC.Util.input_lines(3, 1)
|
||||
|
||||
count_down2 = Enum.take_every(lines, 2) |> count_trees(1)
|
||||
tree_counts = Enum.map([1, 3, 5, 7], &count_trees(lines, &1))
|
||||
|
||||
Enum.reduce([count_down2 | tree_counts], &*/2)
|
||||
end
|
||||
end
|
82
2020/lib/days/day4.ex
Normal file
82
2020/lib/days/day4.ex
Normal file
|
@ -0,0 +1,82 @@
|
|||
defmodule AOC.Day4 do
|
||||
def parse_input(lines), do: parse_input(lines, [], %{})
|
||||
def parse_input([], acc, el), do: [el | acc]
|
||||
def parse_input(["" | tl], acc, el), do: parse_input(tl, [el | acc], %{})
|
||||
|
||||
def parse_input([hd | tl], acc, el) do
|
||||
el =
|
||||
String.split(hd)
|
||||
|> Enum.map(&String.split(&1, ":"))
|
||||
|> Enum.map(fn [k, v] -> {k, v} end)
|
||||
|> Enum.into(el)
|
||||
|
||||
parse_input(tl, acc, el)
|
||||
end
|
||||
|
||||
def validate_field_presence(%{
|
||||
"byr" => _,
|
||||
"iyr" => _,
|
||||
"eyr" => _,
|
||||
"hgt" => _,
|
||||
"hcl" => _,
|
||||
"ecl" => _,
|
||||
"pid" => _
|
||||
}),
|
||||
do: true
|
||||
|
||||
def validate_field_presence(_), do: false
|
||||
|
||||
def part1 do
|
||||
AOC.Util.input_lines(4, 1)
|
||||
|> parse_input()
|
||||
|> Enum.filter(&validate_field_presence/1)
|
||||
|> Enum.count()
|
||||
end
|
||||
|
||||
def validate_height(height) do
|
||||
if String.ends_with?(height, ["cm", "in"]) do
|
||||
{height, measure} = String.split_at(height, -2)
|
||||
height = String.to_integer(height)
|
||||
|
||||
case measure do
|
||||
"cm" -> height >= 150 and height <= 193
|
||||
"in" -> height >= 59 and height <= 76
|
||||
end
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def validate_fields(%{
|
||||
"byr" => byr,
|
||||
"iyr" => iyr,
|
||||
"eyr" => eyr,
|
||||
"hgt" => hgt,
|
||||
"hcl" => hcl,
|
||||
"ecl" => ecl,
|
||||
"pid" => pid
|
||||
}) do
|
||||
byr = String.to_integer(byr)
|
||||
iyr = String.to_integer(iyr)
|
||||
eyr = String.to_integer(eyr)
|
||||
|
||||
[
|
||||
byr >= 1920 and byr <= 2002,
|
||||
iyr >= 2010 and iyr <= 2020,
|
||||
eyr >= 2020 and eyr <= 2030,
|
||||
validate_height(hgt),
|
||||
hcl =~ ~r/^#([a-f]|[0-9]){6}$/,
|
||||
ecl in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"],
|
||||
pid =~ ~r/^[0-9]{9}$/
|
||||
]
|
||||
|> Enum.reduce(&and/2)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_lines(4, 1)
|
||||
|> parse_input()
|
||||
|> Enum.filter(&validate_field_presence/1)
|
||||
|> Enum.filter(&validate_fields/1)
|
||||
|> Enum.count()
|
||||
end
|
||||
end
|
42
2020/lib/days/day5.ex
Normal file
42
2020/lib/days/day5.ex
Normal file
|
@ -0,0 +1,42 @@
|
|||
defmodule AOC.Day5 do
|
||||
@upper 'BR'
|
||||
@lower 'FL'
|
||||
|
||||
def search_range([], x, x), do: x
|
||||
|
||||
def search_range([hd | tl], low, high) when hd in @lower do
|
||||
search_range(tl, low, div(high + 1 + low, 2) - 1)
|
||||
end
|
||||
|
||||
def search_range([hd | tl], low, high) when hd in @upper do
|
||||
search_range(tl, div(low + high + 1, 2), high)
|
||||
end
|
||||
|
||||
def search_seat({row_search, col_search}) do
|
||||
row = search_range(row_search, 0, 127)
|
||||
column = search_range(col_search, 0, 7)
|
||||
{row, column}
|
||||
end
|
||||
|
||||
def part1 do
|
||||
AOC.Util.input_lines(5, 1)
|
||||
|> Enum.map(&String.to_charlist/1)
|
||||
|> Enum.map(&Enum.split(&1, 7))
|
||||
|> Enum.map(&search_seat/1)
|
||||
|> Enum.map(fn {r, c} -> r * 8 + c end)
|
||||
|> Enum.max()
|
||||
end
|
||||
|
||||
def find_missing_seat([l, r | _]) when r != l + 1, do: l + 1
|
||||
def find_missing_seat([_ | tl]), do: find_missing_seat(tl)
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_lines(5, 1)
|
||||
|> Enum.map(&String.to_charlist/1)
|
||||
|> Enum.map(&Enum.split(&1, 7))
|
||||
|> Enum.map(&search_seat/1)
|
||||
|> Enum.map(fn {r, c} -> r * 8 + c end)
|
||||
|> Enum.sort()
|
||||
|> find_missing_seat()
|
||||
end
|
||||
end
|
29
2020/lib/days/day6.ex
Normal file
29
2020/lib/days/day6.ex
Normal file
|
@ -0,0 +1,29 @@
|
|||
defmodule AOC.Day6 do
|
||||
def part1 do
|
||||
AOC.Util.input_file(6, 1)
|
||||
|> String.split("\n\n")
|
||||
|> Enum.map(fn group ->
|
||||
group
|
||||
|> String.replace("\n", "")
|
||||
|> String.to_charlist()
|
||||
|> Enum.uniq()
|
||||
|> Enum.count()
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_file(6, 1)
|
||||
|> String.split("\n\n")
|
||||
|> Enum.map(fn group ->
|
||||
count = String.split(group, "\n") |> Enum.count()
|
||||
|
||||
group
|
||||
|> String.replace("\n", "")
|
||||
|> String.to_charlist()
|
||||
|> Enum.frequencies()
|
||||
|> Enum.count(fn {_, v} -> v == count end)
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
end
|
61
2020/lib/days/day7.ex
Normal file
61
2020/lib/days/day7.ex
Normal file
|
@ -0,0 +1,61 @@
|
|||
defmodule AOC.Day7 do
|
||||
def parse_input(lines), do: parse_input(lines, %{})
|
||||
def parse_input([], acc), do: acc
|
||||
|
||||
def parse_input([str | tl], acc) do
|
||||
[container, str] = String.split(str, " bags contain ")
|
||||
|
||||
inner =
|
||||
str
|
||||
|> String.split(", ")
|
||||
|> Enum.map(fn
|
||||
"no other bags." ->
|
||||
[]
|
||||
|
||||
bags ->
|
||||
[num, adj1, adj2, _] = String.split(bags)
|
||||
{String.to_integer(num), "#{adj1} #{adj2}"}
|
||||
end)
|
||||
|> List.flatten()
|
||||
|
||||
parse_input(tl, Map.put(acc, container, inner))
|
||||
end
|
||||
|
||||
def find_golden_containers(map) do
|
||||
map
|
||||
|> Map.keys()
|
||||
|> Enum.filter(fn
|
||||
"shiny gold" -> false
|
||||
bag -> find_golden_containers(map, bag)
|
||||
end)
|
||||
end
|
||||
|
||||
def find_golden_containers(_, "shiny gold"), do: true
|
||||
|
||||
def find_golden_containers(map, bag) do
|
||||
map[bag]
|
||||
|> Enum.map(fn {_, x} -> find_golden_containers(map, x) end)
|
||||
|> Enum.any?()
|
||||
end
|
||||
|
||||
def part1 do
|
||||
AOC.Util.input_lines(7, 1)
|
||||
|> parse_input()
|
||||
|> find_golden_containers()
|
||||
|> Enum.count()
|
||||
end
|
||||
|
||||
def count_bags(map), do: count_bags(map, "shiny gold")
|
||||
|
||||
def count_bags(map, bag) do
|
||||
map[bag]
|
||||
|> Enum.map(fn {n, x} -> n * (count_bags(map, x) + 1) end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_lines(7, 1)
|
||||
|> parse_input()
|
||||
|> count_bags()
|
||||
end
|
||||
end
|
60
2020/lib/days/day8.ex
Normal file
60
2020/lib/days/day8.ex
Normal file
|
@ -0,0 +1,60 @@
|
|||
defmodule AOC.Day8 do
|
||||
def get_input do
|
||||
AOC.Util.input_lines(8, 1)
|
||||
|> Enum.map(fn line ->
|
||||
[opcode, arg] = String.split(line)
|
||||
{String.to_atom(opcode), String.to_integer(arg)}
|
||||
end)
|
||||
|> Enum.with_index()
|
||||
|> Enum.into(%{}, fn {v, k} -> {k, v} end)
|
||||
end
|
||||
|
||||
def find_loop(program), do: find_loop(program, 0, MapSet.new(), 0)
|
||||
|
||||
def find_loop(program, acc, seen, ip) do
|
||||
cond do
|
||||
MapSet.member?(seen, ip) ->
|
||||
acc
|
||||
|
||||
ip >= length(Map.keys(program)) ->
|
||||
{true, acc}
|
||||
|
||||
true ->
|
||||
seen = MapSet.put(seen, ip)
|
||||
|
||||
{acc, ip} =
|
||||
case program[ip] do
|
||||
{:acc, arg} -> {acc + arg, ip + 1}
|
||||
{:nop, _} -> {acc, ip + 1}
|
||||
{:jmp, arg} -> {acc, ip + arg}
|
||||
end
|
||||
|
||||
find_loop(program, acc, seen, ip)
|
||||
end
|
||||
end
|
||||
|
||||
def part1 do
|
||||
get_input()
|
||||
|> find_loop()
|
||||
end
|
||||
|
||||
def perturb_program(program) do
|
||||
program
|
||||
|> Stream.reject(fn {_, {opcode, _}} -> opcode == :acc end)
|
||||
|> Stream.map(fn
|
||||
{ip, {:nop, arg}} -> {ip, {:jmp, arg}}
|
||||
{ip, {:jmp, arg}} -> {ip, {:nop, arg}}
|
||||
end)
|
||||
|> Stream.map(fn {ip, v} ->
|
||||
Map.put(program, ip, v)
|
||||
end)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
get_input()
|
||||
|> perturb_program()
|
||||
|> Stream.map(&find_loop/1)
|
||||
|> Stream.filter(&is_tuple/1)
|
||||
|> Enum.to_list()
|
||||
end
|
||||
end
|
46
2020/lib/days/day9.ex
Normal file
46
2020/lib/days/day9.ex
Normal file
|
@ -0,0 +1,46 @@
|
|||
defmodule AOC.Day9 do
|
||||
@preamble_len 25
|
||||
|
||||
def find_invalid(queue, [hd | tl]) do
|
||||
sums =
|
||||
:queue.to_list(queue)
|
||||
|> Combination.combine(2)
|
||||
|> Enum.map(&Enum.sum/1)
|
||||
|
||||
queue =
|
||||
:queue.in(hd, queue)
|
||||
|> :queue.drop()
|
||||
|
||||
if hd in sums do
|
||||
find_invalid(queue, tl)
|
||||
else
|
||||
hd
|
||||
end
|
||||
end
|
||||
|
||||
def find_weakness(invalid, [_ | tl] = nums) do
|
||||
result =
|
||||
Enum.reduce_while(nums, {0, []}, fn num, {sum, l} ->
|
||||
sum = sum + num
|
||||
if sum < invalid, do: {:cont, {sum, [num | l]}}, else: {:halt, {sum, l}}
|
||||
end)
|
||||
|
||||
case result do
|
||||
{sum, l} when sum == invalid -> Enum.min_max(l)
|
||||
_ -> find_weakness(invalid, tl)
|
||||
end
|
||||
end
|
||||
|
||||
def parts do
|
||||
input = AOC.Util.input_integers(9, 1)
|
||||
{preamble, nums} = Enum.split(input, @preamble_len)
|
||||
|
||||
invalid =
|
||||
preamble
|
||||
|> :queue.from_list()
|
||||
|> find_invalid(nums)
|
||||
|
||||
{min, max} = find_weakness(invalid, input)
|
||||
{invalid, min + max}
|
||||
end
|
||||
end
|
21
2020/lib/util.ex
Normal file
21
2020/lib/util.ex
Normal file
|
@ -0,0 +1,21 @@
|
|||
defmodule AOC.Util do
|
||||
def input_file_name(day, input) do
|
||||
Path.join([File.cwd!(), "inputs", "day#{day}", "input#{input}.txt"])
|
||||
end
|
||||
|
||||
def input_file(day, input) do
|
||||
input_file_name(day, input)
|
||||
|> File.read!()
|
||||
end
|
||||
|
||||
def input_lines(day, input) do
|
||||
input_file_name(day, input)
|
||||
|> File.stream!()
|
||||
|> Enum.map(&String.trim/1)
|
||||
end
|
||||
|
||||
def input_integers(day, input) do
|
||||
input_lines(day, input)
|
||||
|> Enum.map(&String.to_integer/1)
|
||||
end
|
||||
end
|
27
2020/mix.exs
Normal file
27
2020/mix.exs
Normal file
|
@ -0,0 +1,27 @@
|
|||
defmodule Aoc2020.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
def project do
|
||||
[
|
||||
app: :aoc2020,
|
||||
version: "0.1.0",
|
||||
elixir: "~> 1.12-dev",
|
||||
start_permanent: Mix.env() == :prod,
|
||||
deps: deps()
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help compile.app" to learn about applications.
|
||||
def application do
|
||||
[
|
||||
extra_applications: [:logger]
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help deps" to learn about dependencies.
|
||||
defp deps do
|
||||
[
|
||||
{:combination, "~> 0.0.3"}
|
||||
]
|
||||
end
|
||||
end
|
3
2020/mix.lock
Normal file
3
2020/mix.lock
Normal file
|
@ -0,0 +1,3 @@
|
|||
%{
|
||||
"combination": {:hex, :combination, "0.0.3", "746aedca63d833293ec6e835aa1f34974868829b1486b1e1cb0685f0b2ae1f41", [:mix], [], "hexpm", "72b099f463df42ef7dc6371d250c7070b57b6c5902853f69deb894f79eda18ca"},
|
||||
}
|
1
2020/test/test_helper.exs
Normal file
1
2020/test/test_helper.exs
Normal file
|
@ -0,0 +1 @@
|
|||
ExUnit.start()
|
4
2021/.formatter.exs
Normal file
4
2021/.formatter.exs
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Used by "mix format"
|
||||
[
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||
]
|
17
2021/lib/days/day1.ex
Normal file
17
2021/lib/days/day1.ex
Normal file
|
@ -0,0 +1,17 @@
|
|||
defmodule AOC.Day1 do
|
||||
def part1 do
|
||||
AOC.Util.input_integers(1, 1)
|
||||
|> Enum.chunk_every(2, 1, :discard)
|
||||
|> Enum.map(fn [x, y] -> y > x end)
|
||||
|> Enum.count(& &1)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
AOC.Util.input_integers(1, 1)
|
||||
|> Enum.chunk_every(3, 1, :discard)
|
||||
|> Enum.map(&Enum.sum/1)
|
||||
|> Enum.chunk_every(2, 1, :discard)
|
||||
|> Enum.map(fn [x, y] -> y > x end)
|
||||
|> Enum.count(& &1)
|
||||
end
|
||||
end
|
27
2021/lib/days/day2.ex
Normal file
27
2021/lib/days/day2.ex
Normal file
|
@ -0,0 +1,27 @@
|
|||
defmodule AOC.Day2 do
|
||||
def parse_input do
|
||||
AOC.Util.input_lines(2, 1)
|
||||
|> Enum.map(fn l ->
|
||||
[dir, amount] = String.split(l, " ")
|
||||
{String.to_atom(dir), String.to_integer(amount)}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1 do
|
||||
parse_input()
|
||||
|> Enum.reduce({0, 0}, fn
|
||||
{:forward, amount}, {distance, depth} -> {distance + amount, depth}
|
||||
{:down, amount}, {distance, depth} -> {distance, depth + amount}
|
||||
{:up, amount}, {distance, depth} -> {distance, depth - amount}
|
||||
end)
|
||||
end
|
||||
|
||||
def part2 do
|
||||
parse_input()
|
||||
|> Enum.reduce({0, 0, 0}, fn
|
||||
{:down, amount}, {distance, depth, aim} -> {distance, depth, aim + amount}
|
||||
{:up, amount}, {distance, depth, aim} -> {distance, depth, aim - amount}
|
||||
{:forward, amount}, {distance, depth, aim} -> {distance + amount, depth + aim * amount, aim}
|
||||
end)
|
||||
end
|
||||
end
|
21
2021/lib/util.ex
Normal file
21
2021/lib/util.ex
Normal file
|
@ -0,0 +1,21 @@
|
|||
defmodule AOC.Util do
|
||||
def input_file_name(day, input) do
|
||||
Path.join([File.cwd!(), "inputs", "day#{day}", "input#{input}.txt"])
|
||||
end
|
||||
|
||||
def input_file(day, input) do
|
||||
input_file_name(day, input)
|
||||
|> File.read!()
|
||||
end
|
||||
|
||||
def input_lines(day, input) do
|
||||
input_file_name(day, input)
|
||||
|> File.stream!()
|
||||
|> Enum.map(&String.trim/1)
|
||||
end
|
||||
|
||||
def input_integers(day, input) do
|
||||
input_lines(day, input)
|
||||
|> Enum.map(&String.to_integer/1)
|
||||
end
|
||||
end
|
28
2021/mix.exs
Normal file
28
2021/mix.exs
Normal file
|
@ -0,0 +1,28 @@
|
|||
defmodule Aoc2021.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
def project do
|
||||
[
|
||||
app: :aoc2021,
|
||||
version: "0.1.0",
|
||||
elixir: "~> 1.12",
|
||||
start_permanent: Mix.env() == :prod,
|
||||
deps: deps()
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help compile.app" to learn about applications.
|
||||
def application do
|
||||
[
|
||||
extra_applications: [:logger]
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help deps" to learn about dependencies.
|
||||
defp deps do
|
||||
[
|
||||
# {:dep_from_hexpm, "~> 0.3.0"},
|
||||
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
|
||||
]
|
||||
end
|
||||
end
|
4
2022/.formatter.exs
Normal file
4
2022/.formatter.exs
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Used by "mix format"
|
||||
[
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||
]
|
2
2022/Makefile
Normal file
2
2022/Makefile
Normal file
|
@ -0,0 +1,2 @@
|
|||
day%:
|
||||
mix run -e "AOC.Day$*.solve()"
|
21
2022/README.md
Normal file
21
2022/README.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# Aoc2022
|
||||
|
||||
**TODO: Add description**
|
||||
|
||||
## Installation
|
||||
|
||||
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
|
||||
by adding `aoc2022` to your list of dependencies in `mix.exs`:
|
||||
|
||||
```elixir
|
||||
def deps do
|
||||
[
|
||||
{:aoc2022, "~> 0.1.0"}
|
||||
]
|
||||
end
|
||||
```
|
||||
|
||||
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
|
||||
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
|
||||
be found at <https://hexdocs.pm/aoc2022>.
|
||||
|
41
2022/day10.py
Executable file
41
2022/day10.py
Executable file
|
@ -0,0 +1,41 @@
|
|||
#!/bin/python3
|
||||
|
||||
program = list()
|
||||
|
||||
with open('day10.txt', 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line == "noop":
|
||||
program.append("noop")
|
||||
else:
|
||||
[cmd, arg] = line.split(" ")
|
||||
program.append((cmd, int(arg)))
|
||||
|
||||
states = list()
|
||||
|
||||
state = 1
|
||||
for instruction in program:
|
||||
if instruction == 'noop':
|
||||
states.append(state)
|
||||
else:
|
||||
(cmd, arg) = instruction
|
||||
states.append(state)
|
||||
states.append(state)
|
||||
state += arg
|
||||
|
||||
part1 = 0
|
||||
|
||||
for i in range(19, len(states), 40):
|
||||
part1 += (i+1) * states[i]
|
||||
|
||||
print(part1)
|
||||
|
||||
for y in range(6):
|
||||
for x in range(40):
|
||||
index = y * 40 + x
|
||||
state = states[index]
|
||||
if x == state or x == state-1 or x == state+1:
|
||||
print('#', end='')
|
||||
else:
|
||||
print('.', end='')
|
||||
print('')
|
139
2022/day10.txt
Normal file
139
2022/day10.txt
Normal file
|
@ -0,0 +1,139 @@
|
|||
noop
|
||||
addx 12
|
||||
addx -5
|
||||
addx -1
|
||||
noop
|
||||
addx 4
|
||||
noop
|
||||
addx 1
|
||||
addx 4
|
||||
noop
|
||||
addx 13
|
||||
addx -8
|
||||
noop
|
||||
addx -19
|
||||
addx 24
|
||||
addx 1
|
||||
noop
|
||||
addx 4
|
||||
noop
|
||||
addx 1
|
||||
addx 5
|
||||
addx -1
|
||||
addx -37
|
||||
addx 16
|
||||
addx -13
|
||||
addx 18
|
||||
addx -11
|
||||
addx 2
|
||||
addx 23
|
||||
noop
|
||||
addx -18
|
||||
addx 9
|
||||
addx -8
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -21
|
||||
addx 26
|
||||
noop
|
||||
addx -15
|
||||
addx 20
|
||||
noop
|
||||
addx 3
|
||||
noop
|
||||
addx -38
|
||||
addx 3
|
||||
noop
|
||||
addx 26
|
||||
addx -4
|
||||
addx -19
|
||||
addx 3
|
||||
addx 1
|
||||
addx 5
|
||||
addx 3
|
||||
noop
|
||||
addx 2
|
||||
addx 3
|
||||
noop
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
noop
|
||||
addx -30
|
||||
addx -4
|
||||
addx 1
|
||||
addx 18
|
||||
addx -8
|
||||
addx -4
|
||||
addx 2
|
||||
noop
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx -2
|
||||
addx -20
|
||||
addx 27
|
||||
addx -20
|
||||
addx 25
|
||||
addx -2
|
||||
addx -35
|
||||
noop
|
||||
noop
|
||||
addx 4
|
||||
addx 3
|
||||
addx -2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -11
|
||||
addx 1
|
||||
addx 13
|
||||
addx 2
|
||||
addx 5
|
||||
addx 6
|
||||
addx -1
|
||||
addx -2
|
||||
noop
|
||||
addx 7
|
||||
addx -2
|
||||
addx 6
|
||||
addx 1
|
||||
addx -21
|
||||
addx 22
|
||||
addx -38
|
||||
addx 5
|
||||
addx 3
|
||||
addx -1
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx 1
|
||||
addx 4
|
||||
addx 3
|
||||
addx -2
|
||||
addx 2
|
||||
noop
|
||||
addx 7
|
||||
addx -1
|
||||
addx 2
|
||||
addx 4
|
||||
addx -10
|
||||
addx -19
|
||||
addx 35
|
||||
addx -1
|
||||
noop
|
||||
noop
|
||||
noop
|
146
2022/day10test.txt
Normal file
146
2022/day10test.txt
Normal file
|
@ -0,0 +1,146 @@
|
|||
addx 15
|
||||
addx -11
|
||||
addx 6
|
||||
addx -3
|
||||
addx 5
|
||||
addx -1
|
||||
addx -8
|
||||
addx 13
|
||||
addx 4
|
||||
noop
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx -35
|
||||
addx 1
|
||||
addx 24
|
||||
addx -19
|
||||
addx 1
|
||||
addx 16
|
||||
addx -11
|
||||
noop
|
||||
noop
|
||||
addx 21
|
||||
addx -15
|
||||
noop
|
||||
noop
|
||||
addx -3
|
||||
addx 9
|
||||
addx 1
|
||||
addx -3
|
||||
addx 8
|
||||
addx 1
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -36
|
||||
noop
|
||||
addx 1
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
addx 6
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 7
|
||||
addx 1
|
||||
noop
|
||||
addx -13
|
||||
addx 13
|
||||
addx 7
|
||||
noop
|
||||
addx 1
|
||||
addx -33
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 8
|
||||
noop
|
||||
addx -1
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx 17
|
||||
addx -9
|
||||
addx 1
|
||||
addx 1
|
||||
addx -3
|
||||
addx 11
|
||||
noop
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx -13
|
||||
addx -19
|
||||
addx 1
|
||||
addx 3
|
||||
addx 26
|
||||
addx -30
|
||||
addx 12
|
||||
addx -1
|
||||
addx 3
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -9
|
||||
addx 18
|
||||
addx 1
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
addx 9
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -1
|
||||
addx 2
|
||||
addx -37
|
||||
addx 1
|
||||
addx 3
|
||||
noop
|
||||
addx 15
|
||||
addx -21
|
||||
addx 22
|
||||
addx -6
|
||||
addx 1
|
||||
noop
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx -10
|
||||
noop
|
||||
noop
|
||||
addx 20
|
||||
addx 1
|
||||
addx 2
|
||||
addx 2
|
||||
addx -6
|
||||
addx -11
|
||||
noop
|
||||
noop
|
||||
noop
|
104
2022/day12.py
Executable file
104
2022/day12.py
Executable file
|
@ -0,0 +1,104 @@
|
|||
#!/bin/python3
|
||||
|
||||
import sys
|
||||
sys.setrecursionlimit(1500)
|
||||
|
||||
hmap = list()
|
||||
|
||||
with open('day12.txt', 'r') as f:
|
||||
for line in f:
|
||||
hmap.append(line.strip())
|
||||
|
||||
h = len(hmap)
|
||||
w = len(hmap[0])
|
||||
|
||||
for y in range(h):
|
||||
for x in range(w):
|
||||
if hmap[y][x] == 'S':
|
||||
start = (x, y)
|
||||
if hmap[y][x] == 'E':
|
||||
end = (x, y)
|
||||
|
||||
def get_elevation(char):
|
||||
if char == 'S':
|
||||
return ord('a')
|
||||
if char == 'E':
|
||||
return ord('z')
|
||||
return ord(char)
|
||||
|
||||
def get_adjacents(pos):
|
||||
(x, y) = pos
|
||||
return [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]
|
||||
|
||||
def in_bounds(pos):
|
||||
(x, y) = pos
|
||||
return x >= 0 and x < w and y >= 0 and y < h
|
||||
|
||||
def get_char(hmap, pos):
|
||||
(x, y) = pos
|
||||
return hmap[y][x]
|
||||
|
||||
def valid_jump(hmap, pos, adj):
|
||||
poschar = get_char(hmap, pos)
|
||||
adjchar = get_char(hmap, adj)
|
||||
poselev = get_elevation(poschar)
|
||||
adjelev = get_elevation(adjchar)
|
||||
return poselev + 1 >= adjelev
|
||||
|
||||
best_cost = {}
|
||||
|
||||
def find_path(hmap, path, pos):
|
||||
if get_char(hmap, pos) == 'E':
|
||||
return [path]
|
||||
|
||||
paths = list()
|
||||
for adj in get_adjacents(pos):
|
||||
if adj not in path and in_bounds(adj) and valid_jump(hmap, pos, adj):
|
||||
if adj not in best_cost or best_cost[adj] > len(path):
|
||||
best_cost[adj] = len(path)
|
||||
new_path = set.copy(path)
|
||||
new_path.add(adj)
|
||||
paths.extend(find_path(hmap, new_path, adj))
|
||||
return paths
|
||||
|
||||
shortest = None
|
||||
|
||||
paths = find_path(hmap, set([start]), start)
|
||||
for path in paths:
|
||||
if not shortest or len(path) < shortest:
|
||||
shortest = len(path)
|
||||
|
||||
print('part1', shortest - 1)
|
||||
|
||||
trail_lengths = {}
|
||||
|
||||
def valid_jump2(hmap, pos, adj):
|
||||
poschar = get_char(hmap, pos)
|
||||
adjchar = get_char(hmap, adj)
|
||||
poselev = get_elevation(poschar)
|
||||
adjelev = get_elevation(adjchar)
|
||||
return adjelev + 1 >= poselev
|
||||
|
||||
def find_trail(hmap, trail, pos):
|
||||
for adj in get_adjacents(pos):
|
||||
if adj not in trail and in_bounds(adj) and valid_jump2(hmap, pos, adj):
|
||||
trail_length = len(trail) + 1
|
||||
if adj not in trail_lengths or trail_lengths[adj] > trail_length:
|
||||
trail_lengths[adj] = trail_length
|
||||
new_trail = list.copy(trail)
|
||||
new_trail.append(adj)
|
||||
find_trail(hmap, new_trail, adj)
|
||||
|
||||
find_trail(hmap, [end], end)
|
||||
|
||||
shortest = None
|
||||
|
||||
for y in range(h):
|
||||
for x in range(w):
|
||||
if (x, y) in trail_lengths:
|
||||
if get_elevation(get_char(hmap, (x, y))) == ord('a'):
|
||||
trail_length = trail_lengths[(x, y)]
|
||||
if not shortest or trail_length < shortest:
|
||||
shortest = trail_length
|
||||
|
||||
print('part2', shortest - 1)
|
41
2022/day12.txt
Normal file
41
2022/day12.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
abacccaaaacccccccccccaaaaaacccccaaaaaaccccaaacccccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||
abaaccaaaacccccccccccaaaaaaccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||
abaaccaaaacccccccccccaaaaacccccaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||
abccccccccccccccccccccaaaaacccaaaaaaaaaaaaaaaacccccccccccccccccccccccccccaaaccccccccccccaaaaa
|
||||
abccccccccccccccccccccaacaacccaaaaaaaaccaaaaaccccccccccccccccccccccccccccaaaccccccccccccaccaa
|
||||
abcccccccccccccaacccaaaccccccaaaaaaaaaccaaaaaccccccccccccccccccccccccccccccacccccccccccccccca
|
||||
abcccccccccccaaaaaaccaaaccacccccaaaaaaacccccccccccccccccccccccccciiiicccccccddddddccccccccccc
|
||||
abcccccccccccaaaaaaccaaaaaaaccccaaaaaacccccaacccccccaaaccccccccciiiiiiiicccdddddddddacaaccccc
|
||||
abccccccccccccaaaaaaaaaaaaacccccaaaaaaacaaaacccccccaaaacccccccchhiiiiiiiiicddddddddddaaaccccc
|
||||
abcccccccccccaaaaaaaaaaaaaacccccccaaacccaaaaaacccccaaaaccccccchhhipppppiiiijjjjjjjddddaaccccc
|
||||
abcccccccccccaaaaaaaaaaaaaaccccccccccccccaaaaaccccccaaaccccccchhhpppppppiijjjjjjjjjddeeaccccc
|
||||
abcccccccccccccccccaaaaaaaacccccccccccccaaaaaccccccccccccccccchhppppppppppjjqqqjjjjjeeeaacccc
|
||||
abccccccccccccccccccaaaaaaaacccccccccccccccaacccccccccccccccchhhpppuuuupppqqqqqqqjjjeeeaacccc
|
||||
abcccccccccccccccccccaacccacccccccccccccccccccccccccccccccccchhhopuuuuuuppqqqqqqqjjjeeecccccc
|
||||
abacccccccccccccaaacaaaccccccccccccccccccccccccccccaaccccccchhhhoouuuuuuuqvvvvvqqqjkeeecccccc
|
||||
abaccccccccccccaaaaaacccccaaccccccccccccccccccccccaaaccccccchhhooouuuxxxuvvvvvvqqqkkeeecccccc
|
||||
abaccccccccccccaaaaaacccaaaaaaccccccccccccccccccaaaaaaaaccchhhhooouuxxxxuvyyyvvqqqkkeeecccccc
|
||||
abcccccccccccccaaaaacccaaaaaaaccccccccccccccccccaaaaaaaaccjjhooooouuxxxxyyyyyvvqqqkkeeecccccc
|
||||
abccccccccccccccaaaaaacaaaaaaaccccccccaaaccccccccaaaaaaccjjjooootuuuxxxxyyyyyvvqqkkkeeecccccc
|
||||
abccccccccccccccaaaaaaaaaaaaacccccccccaaaacccccccaaaaaacjjjooootttuxxxxxyyyyvvrrrkkkeeecccccc
|
||||
SbccccccccccccccccccaaaaaaaaacccccccccaaaacccccccaaaaaacjjjoootttxxxEzzzzyyvvvrrrkkkfffcccccc
|
||||
abcccccccccccaaacccccaaaaaaacaaaccccccaaaccccccccaaccaacjjjoootttxxxxxyyyyyyvvvrrkkkfffcccccc
|
||||
abcccccccccaaaaaacccaaaaaacccaaacacccaacccccccccccccccccjjjoootttxxxxyxyyyyyywvvrrkkkfffccccc
|
||||
abcccccccccaaaaaacccaaaaaaaaaaaaaaaccaaacaaacccccaacccccjjjnnnttttxxxxyyyyyyywwwrrkkkfffccccc
|
||||
abcaacacccccaaaaacccaaacaaaaaaaaaaaccaaaaaaacccccaacaaacjjjnnnntttttxxyywwwwwwwwrrrlkfffccccc
|
||||
abcaaaaccccaaaaacccccccccaacaaaaaaccccaaaaaacccccaaaaacccjjjnnnnnttttwwywwwwwwwrrrrllfffccccc
|
||||
abaaaaaccccaaaaaccccccaaaaaccaaaaacaaaaaaaaccccaaaaaaccccjjjjinnnntttwwwwwsssrrrrrllllffccccc
|
||||
abaaaaaaccccccccccccccaaaaacaaaaaacaaaaaaaaacccaaaaaaacccciiiiinnnntswwwwssssrrrrrlllfffccccc
|
||||
abacaaaaccccccccccccccaaaaaacaaccccaaaaaaaaaaccccaaaaaaccccciiiinnnssswwsssssllllllllfffccccc
|
||||
abccaaccccccccccccccccaaaaaaccccccccccaaacaaaccccaaccaacccccciiiinnsssssssmmllllllllfffaacccc
|
||||
abccccccccccccccccccccaaaaaaccccccccccaaaccccccccaaccccccccccciiinnmsssssmmmmlllllgggffaacccc
|
||||
abcccccccccccccccaccccccaaacccccccccccaaccccccccccccccccccccccciiimmmsssmmmmmgggggggggaaacccc
|
||||
abcccccccccaaaaaaaaccccccccccccccccccccccccccccaaaaaccccccccccciiimmmmmmmmmgggggggggaaacccccc
|
||||
abccccccccccaaaaaaccccccccccccccccccaacccccccccaaaaacccccccccccciiimmmmmmmhhggggcaaaaaaaccccc
|
||||
abccccccccccaaaaaacccccccccccccccccaacccccccccaaaaaacccccccccccciihhmmmmhhhhgccccccccaacccccc
|
||||
abccccaacaaaaaaaaaaccccccccccccccccaaaccccccccaaaaaaccccccccccccchhhhhhhhhhhaaccccccccccccccc
|
||||
abccccaaaaaaaaaaaaaaccccccccccaaccaaaaccccccccaaaaaacccaaacccccccchhhhhhhhaaaaccccccccccccccc
|
||||
abcccaaaaaaaaaaaaaaaccccccccaaaaaacaaaacacaccccaaaccccaaaacccccccccchhhhccccaaccccccccccaaaca
|
||||
abcccaaaaaacacaaacccccccccccaaaaaaaaaaaaaaacccccccccccaaaacccccccccccaaaccccccccccccccccaaaaa
|
||||
abcccccaaaacccaaaccccccccccaaaaaaaaaaaaaaaaccccccccccccaaacccccccccccaaacccccccccccccccccaaaa
|
||||
abcccccaacccccaacccccccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
|
5
2022/day12test.txt
Normal file
5
2022/day12test.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
89
2022/day14.py
Executable file
89
2022/day14.py
Executable file
|
@ -0,0 +1,89 @@
|
|||
#!/bin/python3
|
||||
|
||||
from collections import defaultdict
|
||||
from enum import Enum
|
||||
from itertools import pairwise
|
||||
|
||||
class Tile(Enum):
|
||||
AIR = 1
|
||||
ROCK = 2
|
||||
SOURCE = 3
|
||||
SAND = 4
|
||||
|
||||
grid = defaultdict(lambda: Tile.AIR)
|
||||
|
||||
with open('inputs/day14.txt', 'r') as f:
|
||||
for line in f:
|
||||
for (start, end) in pairwise(line.strip().split(' -> ')):
|
||||
[sx, sy] = map(int, start.split(','))
|
||||
[ex, ey] = map(int, end.split(','))
|
||||
|
||||
dx = 0
|
||||
dy = 0
|
||||
if ex > sx:
|
||||
dx = 1
|
||||
elif ex < sx:
|
||||
dx = -1
|
||||
|
||||
if ey > sy:
|
||||
dy = 1
|
||||
elif ey < sy:
|
||||
dy = -1
|
||||
|
||||
curx = sx
|
||||
cury = sy
|
||||
grid[(curx, cury)] = Tile.ROCK
|
||||
while curx != ex or cury != ey:
|
||||
curx += dx
|
||||
cury += dy
|
||||
grid[(curx, cury)] = Tile.ROCK
|
||||
|
||||
highest_y = -1
|
||||
for (x, y), tile in grid.items():
|
||||
if y > highest_y:
|
||||
highest_y = y
|
||||
|
||||
def query_grid(x, y):
|
||||
if y == highest_y + 2:
|
||||
return Tile.ROCK
|
||||
return grid[(x, y)]
|
||||
|
||||
(sourcex, sourcey) = (500, 0)
|
||||
|
||||
def abyss_underneath(x, y):
|
||||
for (gridx, gridy), tile in grid.items():
|
||||
if gridy > y and gridx == x and tile != Tile.AIR:
|
||||
return False
|
||||
return True
|
||||
|
||||
# voided = False
|
||||
blocked = False
|
||||
while True:
|
||||
(x, y) = (sourcex, sourcey)
|
||||
while True:
|
||||
# if abyss_underneath(x, y):
|
||||
# voided = True
|
||||
# break
|
||||
if query_grid(x, y+1) == Tile.AIR:
|
||||
y += 1
|
||||
elif query_grid(x-1, y+1) == Tile.AIR:
|
||||
y += 1
|
||||
x -= 1
|
||||
elif query_grid(x+1, y+1) == Tile.AIR:
|
||||
y += 1
|
||||
x += 1
|
||||
else:
|
||||
if (x, y) == (sourcex, sourcey):
|
||||
blocked = True
|
||||
break
|
||||
# if voided:
|
||||
# break
|
||||
if blocked:
|
||||
break
|
||||
grid[(x, y)] = Tile.SAND
|
||||
|
||||
rest_count = 0
|
||||
for (x, y), tile in grid.items():
|
||||
if tile == Tile.SAND:
|
||||
rest_count += 1
|
||||
print(rest_count + 1)
|
101
2022/day15.py
Executable file
101
2022/day15.py
Executable file
|
@ -0,0 +1,101 @@
|
|||
#!/bin/bash
|
||||
|
||||
# thanks github.com/bernadetten
|
||||
import sys
|
||||
import re
|
||||
from itertools import pairwise
|
||||
|
||||
test = bool(int(sys.argv[1]))
|
||||
file_path = ""
|
||||
data = ""
|
||||
prodata = []
|
||||
given_y = [int(sys.argv[2])]
|
||||
absent_points = []
|
||||
part1 = bool(int(sys.argv[3]))
|
||||
max_y = int(sys.argv[4])
|
||||
|
||||
if test:
|
||||
file_path = "test_day_15.txt"
|
||||
else:
|
||||
file_path = "input_day_15.txt"
|
||||
|
||||
with open(file_path, "r") as f:
|
||||
data = f.read().split("\n")
|
||||
|
||||
# The anhatten distance
|
||||
def md(x1, y1, x2, y2):
|
||||
return abs(x1 - x2) + abs(y1 - y2)
|
||||
|
||||
# Processing the data.
|
||||
for line in data:
|
||||
if line != "":
|
||||
m = re.match(
|
||||
r"Sensor at x=(?P<sx>-?\d+), y=(?P<sy>-?\d+): closest beacon is at x=(?P<bx>-?\d+), y=(?P<by>-?\d+)",
|
||||
line.strip(),
|
||||
)
|
||||
x_s = int(m.group("sx"))
|
||||
y_s = int(m.group("sy"))
|
||||
x_b = int(m.group("bx"))
|
||||
y_b = int(m.group("by"))
|
||||
|
||||
dis = md(x_s, y_s, x_b, y_b)
|
||||
prodata += [((x_s, y_s), (x_b, y_b), dis)]
|
||||
|
||||
# All y-values we want to loop over if part 2
|
||||
if not part1:
|
||||
given_y = [x for x in range(0, max_y + 1)]
|
||||
|
||||
# Merge all ranges
|
||||
def mergeranges(ranges):
|
||||
super_range = ranges[0]
|
||||
ranges = ranges[1:]
|
||||
|
||||
for (xl, xh) in ranges:
|
||||
# print('super', super_range)
|
||||
#print('comparing to', xl, ' ', xh)
|
||||
|
||||
if not (xl - 1 <= super_range[1] and xl >= super_range[0]):
|
||||
return xl - 1
|
||||
|
||||
if xh > super_range[1]:
|
||||
super_range = (super_range[0], xh)
|
||||
|
||||
return None
|
||||
|
||||
# Now we calculate the impossible ranges
|
||||
for y in given_y:
|
||||
if part1:
|
||||
beacon_on_y = [b[0] for _, b, _ in prodata if b[1] == y]
|
||||
|
||||
absent_points = []
|
||||
#print(y)
|
||||
# We need to add the ranges of points that are not available.
|
||||
for source, beacon, dis in prodata:
|
||||
height_diff = abs(source[1] - y)
|
||||
|
||||
remain_dist = dis - height_diff
|
||||
|
||||
if remain_dist >= 0:
|
||||
# print('Source ', source, ' y ', y, ' dis ', dis, ' diff ', height_diff)
|
||||
lower_x = source[0] - remain_dist
|
||||
higher_x = source[0] + remain_dist
|
||||
|
||||
if part1:
|
||||
absent_points += [
|
||||
x for x in range(lower_x, higher_x + 1) if x not in beacon_on_y
|
||||
]
|
||||
else:
|
||||
absent_points += [(lower_x, higher_x)]
|
||||
|
||||
# If we are doing part two we need to post process the output per line.
|
||||
if not part1:
|
||||
# print(absent_points)
|
||||
absent_points = sorted(absent_points)
|
||||
#print(absent_points)
|
||||
result = mergeranges(absent_points)
|
||||
if result != None:
|
||||
print('part2, x:', result, 'y:', y, 'output:', result *4000000 +y)
|
||||
sys.exit()
|
||||
|
||||
if part1:
|
||||
print('part1', len(set(absent_points)))
|
103
2022/day16.py
Executable file
103
2022/day16.py
Executable file
|
@ -0,0 +1,103 @@
|
|||
#!/bin/python3
|
||||
|
||||
import re
|
||||
from dijkstar import Graph, find_path
|
||||
import numpy as np
|
||||
from itertools import combinations
|
||||
import itertools as it
|
||||
from tqdm import tqdm
|
||||
|
||||
valves = list()
|
||||
|
||||
with open('inputs/day16.txt', 'r') as f:
|
||||
for line in f:
|
||||
m = re.match(r"Valve (?P<name>[A-Z]{2}) has flow rate=(?P<rate>\d+); tunnels? leads? to valves? (?P<tunnels>.*)", line.strip())
|
||||
name = m.group("name")
|
||||
rate = int(m.group("rate"))
|
||||
tunnels = m.group("tunnels").split(", ")
|
||||
|
||||
valves.append({"name": name, "rate": rate, "tunnels": tunnels})
|
||||
|
||||
indices = {}
|
||||
for i, valve in enumerate(valves):
|
||||
indices[valve["name"]] = i
|
||||
|
||||
graph = Graph()
|
||||
for v1 in valves:
|
||||
for v2 in v1["tunnels"]:
|
||||
graph.add_edge(v1["name"], v2, 1)
|
||||
graph.add_edge(v2, v1["name"], 1)
|
||||
|
||||
adjs = np.zeros((len(valves), len(valves)))
|
||||
for v1, v2 in combinations(map(lambda v: v["name"], valves), 2):
|
||||
cost = find_path(graph, v1, v2).total_cost
|
||||
adjs[indices[v1], indices[v2]] = cost
|
||||
adjs[indices[v2], indices[v1]] = cost
|
||||
|
||||
class Valve:
|
||||
def __init__(self, name, rate):
|
||||
self.name = name
|
||||
self.rate = rate
|
||||
|
||||
def value(self, start, time_left):
|
||||
cost = adjs[indices[start], indices[self.name]] + 1
|
||||
return (self.rate * (time_left - cost), cost) # one off?
|
||||
|
||||
valve_map = dict()
|
||||
valve_set = set()
|
||||
for valve in valves:
|
||||
if valve["rate"] > 0:
|
||||
valve_set.add(valve["name"])
|
||||
valve_map[valve["name"]] = Valve(valve["name"], valve["rate"])
|
||||
|
||||
def search(valve_set, current, time_left, visited):
|
||||
to_visit_set = valve_set.difference(visited)
|
||||
best_score = 0
|
||||
for to_visit in to_visit_set:
|
||||
# print("time left:", time_left)
|
||||
# print("current:", current)
|
||||
# print("going to visit:", to_visit)
|
||||
visited_copy = visited.copy()
|
||||
visited_copy.add(to_visit)
|
||||
score, dtime = valve_map[to_visit].value(current, time_left)
|
||||
# print("+score:", score, "+time", dtime)
|
||||
if time_left - dtime >= 0:
|
||||
score = score + search(valve_set, to_visit, time_left - dtime, visited_copy)
|
||||
if not best_score or score > best_score:
|
||||
best_score = score
|
||||
return best_score
|
||||
|
||||
|
||||
# print('part1', search(valve_set, "AA", 30, set()))
|
||||
|
||||
# part2 idea
|
||||
# BIGBRAIN
|
||||
# divide valve set in two disjoint sets
|
||||
# apply same search algorithm to both sets.
|
||||
# sum the scores of the sets to get total score
|
||||
# brute force set distribution
|
||||
|
||||
def partition(pred, iterable):
|
||||
t1, t2 = it.tee(iterable)
|
||||
return it.filterfalse(pred, t1), filter(pred, t2)
|
||||
|
||||
def partitions(l):
|
||||
return list(filter(lambda x: [] not in x, [[[x[1] for x in f] for f in partition(lambda x: x[0], zip(pattern, l))] for pattern in it.product([True, False], repeat=len(l))]))
|
||||
# for [lhs, rhs] in parts:
|
||||
# if (set(lhs), set(rhs)) not in result and (set(rhs), set(lhs)) not in result:
|
||||
# result.append((set(lhs), set(rhs)))
|
||||
# return result
|
||||
|
||||
best_score = 0
|
||||
|
||||
for part in tqdm(partitions(list(valve_set))):
|
||||
[part1, part2] = part
|
||||
part1 = set(part1)
|
||||
score1 = search(part1, 'AA', 26, set())
|
||||
part2 = set(part2)
|
||||
score2 = search(part2, 'AA', 26, set())
|
||||
grand_score = score1 + score2
|
||||
if grand_score > best_score:
|
||||
best_score = grand_score
|
||||
|
||||
print('part2', best_score)
|
311
2022/day17.py
Executable file
311
2022/day17.py
Executable file
|
@ -0,0 +1,311 @@
|
|||
#!/bin/python3
|
||||
|
||||
from enum import Enum
|
||||
from collections import defaultdict
|
||||
from itertools import pairwise, combinations
|
||||
|
||||
class Move(Enum):
|
||||
LEFT = 1
|
||||
RIGHT = 2
|
||||
DOWN = 3
|
||||
|
||||
moves = list()
|
||||
|
||||
with open('inputs/day17.txt', 'r') as f:
|
||||
for line in f:
|
||||
for char in line.strip():
|
||||
if char == '<':
|
||||
moves.append(Move.LEFT)
|
||||
elif char == '>':
|
||||
moves.append(Move.RIGHT)
|
||||
|
||||
def move_stream():
|
||||
while True:
|
||||
for i, d in enumerate(moves):
|
||||
yield (i, d)
|
||||
yield (i, Move.DOWN)
|
||||
|
||||
move_map = {Move.LEFT: (-1, 0), Move.RIGHT: (1, 0), Move.DOWN: (0, -1)}
|
||||
|
||||
class Rock():
|
||||
def __init__(self, shape):
|
||||
self.blocks = shape
|
||||
|
||||
def init_position(self, y_top):
|
||||
self.blocks = list(map(lambda pos: (pos[0] + 2, pos[1] + y_top + 4), self.blocks))
|
||||
|
||||
def move(self, chamber, move):
|
||||
new_blocks = self.move_blocks(move)
|
||||
if self.check_valid(chamber, new_blocks):
|
||||
self.blocks = new_blocks
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def move_blocks(self, move):
|
||||
(movex, movey) = move_map[move]
|
||||
return list(map(lambda block: (block[0] + movex, block[1] + movey), self.blocks))
|
||||
|
||||
def check_valid(self, chamber, blocks):
|
||||
for (x, y) in blocks:
|
||||
if x > 6 or x < 0 or chamber[y][x]:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
shapes = [
|
||||
[(0, 0), (1, 0), (2, 0), (3, 0)],
|
||||
[(0, 1), (1, 1), (2, 1), (1, 0), (1, 2)],
|
||||
[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)],
|
||||
[(0, 0), (0, 1), (0, 2), (0, 3)],
|
||||
[(0, 0), (1, 0), (0, 1), (1, 1)]
|
||||
]
|
||||
|
||||
def rock_stream():
|
||||
while True:
|
||||
for i, shape in enumerate(shapes):
|
||||
yield (i, Rock(shape.copy()))
|
||||
|
||||
chamber = defaultdict(lambda: defaultdict(lambda: False))
|
||||
for i in range(7):
|
||||
chamber[-1][i] = True
|
||||
|
||||
def print_chamber(chamber, rock, print_index):
|
||||
keys = list(reversed(sorted(chamber.keys())))
|
||||
for key in keys:
|
||||
if print_index:
|
||||
print(f'{key}\t', end='')
|
||||
for i in range(7):
|
||||
if chamber[key][i]:
|
||||
print('#', end='')
|
||||
elif rock and (i, key) in rock.blocks:
|
||||
print('@', end='')
|
||||
else:
|
||||
print('.', end='')
|
||||
print('')
|
||||
|
||||
def prune_chamber(chamber):
|
||||
ys = list(reversed(sorted(chamber.keys())))
|
||||
prune_height = None
|
||||
for y_high, y_low in pairwise(ys):
|
||||
prunable = True
|
||||
for x in range(7):
|
||||
if not chamber[y_high][x] and not chamber[y_low][x]:
|
||||
prunable = False
|
||||
break
|
||||
if prunable:
|
||||
prune_height = y_low
|
||||
break
|
||||
if prune_height:
|
||||
for y in ys:
|
||||
if y < prune_height:
|
||||
del chamber[y]
|
||||
return prune_height != None
|
||||
|
||||
def row_to_mask(row):
|
||||
mask = 0
|
||||
bit = 1
|
||||
for x in range(6, -1, -1):
|
||||
if row[x]:
|
||||
mask = mask | bit
|
||||
bit = bit << 1
|
||||
return mask
|
||||
|
||||
barrier_fingerprints = defaultdict(lambda: list())
|
||||
|
||||
rock_count = 20220
|
||||
prune_freq = 100
|
||||
y_top = -1
|
||||
moves_gen = move_stream()
|
||||
rocks_gen = rock_stream()
|
||||
rocks_fallen = 0
|
||||
rock_idx = None
|
||||
for rock_idx, rock in rocks_gen:
|
||||
rock.init_position(y_top)
|
||||
for move_idx, move in moves_gen:
|
||||
moved = rock.move(chamber, move)
|
||||
if not moved and move == Move.DOWN:
|
||||
for (x, y) in rock.blocks:
|
||||
if y > y_top:
|
||||
y_top = y
|
||||
chamber[y][x] = True
|
||||
rocks_fallen += 1
|
||||
break
|
||||
|
||||
ys = set(map(lambda x: x[1], rock.blocks))
|
||||
for y in ys:
|
||||
all_filled = True
|
||||
for x in range(7):
|
||||
if not chamber[y][x] and not chamber[y-1][x]:
|
||||
all_filled = False
|
||||
break
|
||||
if all_filled:
|
||||
mask_high = row_to_mask(chamber[y])
|
||||
mask_low = row_to_mask(chamber[y-1])
|
||||
fingerprint = (rock_idx, move_idx, mask_high, mask_low)
|
||||
barrier_fingerprints[fingerprint].append((rocks_fallen, y))
|
||||
|
||||
if rocks_fallen == rock_count:
|
||||
break
|
||||
print('part1', y_top + 1)
|
||||
|
||||
candidate_fp = None
|
||||
candidate_ys_count = 0
|
||||
for fp, ys in barrier_fingerprints.items():
|
||||
l = len(ys)
|
||||
if l > candidate_ys_count:
|
||||
candidate_ys_count = l
|
||||
candidate_fp = fp
|
||||
# print('candidate FP:', candidate_fp)
|
||||
first_occ = barrier_fingerprints[candidate_fp][0]
|
||||
second_occ = barrier_fingerprints[candidate_fp][1]
|
||||
height_cycle = second_occ[1] - first_occ[1]
|
||||
rock_cycle = second_occ[0] - first_occ[0]
|
||||
# print('first occurance:', 'height', first_occ[1], 'fallen', first_occ[0])
|
||||
# print('second occurance:', 'height', second_occ[1], 'fallen', second_occ[0])
|
||||
# print('height cycle:', second_occ[1] - first_occ[1])
|
||||
# print('rock cycle:', second_occ[0] - first_occ[0])
|
||||
|
||||
rocks_left = 1000000000000 - first_occ[0]
|
||||
superheight = first_occ[1]
|
||||
superheight += (rocks_left // rock_cycle) * height_cycle
|
||||
rocks_left %= rock_cycle
|
||||
print(rocks_left, superheight)
|
||||
|
||||
# We just need $rocks_left rocks more!
|
||||
# Move to the next cycle point
|
||||
# Then simulate $rocks_left movements to get the height this generates.
|
||||
# Add this to superheight then subtract one height_cycle.
|
||||
|
||||
for rock_idx, rock in rocks_gen:
|
||||
rock.init_position(y_top)
|
||||
for move_idx, move in moves_gen:
|
||||
moved = rock.move(chamber, move)
|
||||
if not moved and move == Move.DOWN:
|
||||
for (x, y) in rock.blocks:
|
||||
if y > y_top:
|
||||
y_top = y
|
||||
chamber[y][x] = True
|
||||
rocks_fallen += 1
|
||||
break
|
||||
|
||||
ys = set(map(lambda x: x[1], rock.blocks))
|
||||
cycle_start = False
|
||||
for y in ys:
|
||||
all_filled = True
|
||||
for x in range(7):
|
||||
if not chamber[y][x] and not chamber[y-1][x]:
|
||||
all_filled = False
|
||||
break
|
||||
if all_filled:
|
||||
mask_high = row_to_mask(chamber[y])
|
||||
mask_low = row_to_mask(chamber[y-1])
|
||||
fingerprint = (rock_idx, move_idx, mask_high, mask_low)
|
||||
if fingerprint == candidate_fp:
|
||||
cycle_start = True
|
||||
break
|
||||
if cycle_start:
|
||||
break
|
||||
|
||||
start_height = y_top
|
||||
|
||||
for rock_idx, rock in rocks_gen:
|
||||
rock.init_position(y_top)
|
||||
for move_idx, move in moves_gen:
|
||||
moved = rock.move(chamber, move)
|
||||
if not moved and move == Move.DOWN:
|
||||
for (x, y) in rock.blocks:
|
||||
if y > y_top:
|
||||
y_top = y
|
||||
chamber[y][x] = True
|
||||
rocks_left -= 1
|
||||
break
|
||||
|
||||
if rocks_left == 0:
|
||||
break
|
||||
|
||||
end_height = y_top
|
||||
superheight += end_height - start_height
|
||||
print('part2', superheight + 3)
|
||||
|
||||
# for fp, ys in barrier_fingerprints.items():
|
||||
# print('fingerprint:', fp)
|
||||
# print('count:', len(ys))
|
||||
|
||||
# NEW IDEA
|
||||
# Find a cycle.
|
||||
# A cycle can be characterized by: rock rotation, direction rotation and rock formation.
|
||||
# Problem is, we need to save a lot of the rock formation, because new rocks can fall down a long while.
|
||||
# Additionally, we cannot just save the height of each column, because rocks can move underneath hanging arches.
|
||||
# Possible solution: find lines that block this.
|
||||
# Possibly in one line, definitely in two lines.
|
||||
|
||||
# IDEA:
|
||||
# Create bitmap.
|
||||
# Easily compare bitmaps with eachother to find cycle
|
||||
|
||||
# def print_mask(mask):
|
||||
# bit = 1 << 6
|
||||
# for i in range(7):
|
||||
# if mask & (bit >> i):
|
||||
# print('1', end='')
|
||||
# else:
|
||||
# print('0', end='')
|
||||
# print('')
|
||||
|
||||
# def print_bitmap(bitmap):
|
||||
# for row in bitmap:
|
||||
# print_mask(row)
|
||||
|
||||
# bitmap = []
|
||||
# ys = list(reversed(sorted(chamber.keys())))
|
||||
# y_min = min(ys)
|
||||
# y_max = max(ys)
|
||||
# for y in range(y_min + 1, y_max + 1):
|
||||
# mask = 0
|
||||
# bit = 1
|
||||
# for x in range(6, -1, -1):
|
||||
# if chamber[y][x]:
|
||||
# mask = mask | bit
|
||||
# bit = bit << 1
|
||||
# print_mask(mask)
|
||||
# bitmap.append(mask)
|
||||
|
||||
# def in_order(l):
|
||||
# last = None
|
||||
# for x in l:
|
||||
# if last == None or x > last:
|
||||
# last = x
|
||||
# else:
|
||||
# return False
|
||||
# return True
|
||||
|
||||
# def same_distance(l):
|
||||
# [y1, y2, y3] = l
|
||||
# return y2 - y1 == y3 - y2
|
||||
|
||||
# def is_cycle(bitmap, l):
|
||||
# [y1, y2, y3] = l
|
||||
# distance = y3 - y2
|
||||
# for i in range(distance + 1):
|
||||
# if bitmap[y1+i] != bitmap[y2]+i:
|
||||
# return False
|
||||
# return True
|
||||
|
||||
# Now try to find the cycle!
|
||||
# We loop over every row.
|
||||
# We find all indices of this row in the whole chamber
|
||||
# checked = []
|
||||
# print('finding cycle')
|
||||
# for row in bitmap:
|
||||
# print('row:', row)
|
||||
# if row not in checked:
|
||||
# checked.append(row)
|
||||
# indices = [i for i, x in enumerate(bitmap) if x == row]
|
||||
# if len(indices) >= 3:
|
||||
# for maybe_cycle in combinations(indices, 3):
|
||||
# if in_order(maybe_cycle) and same_distance(maybe_cycle):
|
||||
# if is_cycle(bitmap, maybe_cycle):
|
||||
# print('FOUND CYCLE:', maybe_cycle)
|
||||
|
||||
# # print_bitmap(bitmap)
|
113
2022/day18.py
Executable file
113
2022/day18.py
Executable file
|
@ -0,0 +1,113 @@
|
|||
#!/bin/python3
|
||||
|
||||
from collections import defaultdict
|
||||
from queue import Queue
|
||||
|
||||
cubes = set()
|
||||
|
||||
with open('inputs/day18.txt', 'r') as f:
|
||||
for line in f:
|
||||
[x, y, z] = line.split(',')
|
||||
cubes.add((int(x), int(y), int(z)))
|
||||
|
||||
def ordered(pos1, pos2):
|
||||
if pos1 > pos2:
|
||||
return (pos1, pos2)
|
||||
else:
|
||||
return (pos2, pos1)
|
||||
|
||||
sides = defaultdict(lambda: 0)
|
||||
for cube in cubes:
|
||||
(x, y, z) = cube
|
||||
cube_sides = []
|
||||
cube_sides.append(ordered(cube, (x+1, y, z)))
|
||||
cube_sides.append(ordered(cube, (x-1, y, z)))
|
||||
cube_sides.append(ordered(cube, (x, y+1, z)))
|
||||
cube_sides.append(ordered(cube, (x, y-1, z)))
|
||||
cube_sides.append(ordered(cube, (x, y, z+1)))
|
||||
cube_sides.append(ordered(cube, (x, y, z-1)))
|
||||
|
||||
for side in cube_sides:
|
||||
sides[side] += 1
|
||||
|
||||
outer_sides = set()
|
||||
for side, count in sides.items():
|
||||
if count == 1:
|
||||
outer_sides.add(side)
|
||||
|
||||
print("part1", len(outer_sides))
|
||||
|
||||
# Determine max and min coords
|
||||
x_min = min(map(lambda a: a[0], cubes))
|
||||
x_max = max(map(lambda a: a[0], cubes))
|
||||
y_min = min(map(lambda a: a[1], cubes))
|
||||
y_max = max(map(lambda a: a[1], cubes))
|
||||
z_min = min(map(lambda a: a[2], cubes))
|
||||
z_max = max(map(lambda a: a[2], cubes))
|
||||
|
||||
# Increase bounds by 1 in all directions
|
||||
x_min -= 1
|
||||
x_max += 1
|
||||
y_min -= 1
|
||||
y_max += 1
|
||||
z_min -= 1
|
||||
z_max += 1
|
||||
|
||||
# Flood fill from 1 corner to find all reachable cubes.
|
||||
class SetQueue(Queue):
|
||||
def _init(self, maxsize):
|
||||
self.queue = set()
|
||||
def _put(self, item):
|
||||
self.queue.add(item)
|
||||
def _get(self):
|
||||
return self.queue.pop()
|
||||
|
||||
cube_queue = SetQueue()
|
||||
cube_queue.put((x_min, y_min, z_min))
|
||||
reachable_cubes = set()
|
||||
|
||||
max_cubes = (x_max - x_min) * (y_max - y_min) * (z_max - z_min)
|
||||
while True:
|
||||
if cube_queue.empty():
|
||||
break
|
||||
cube = cube_queue.get()
|
||||
(x, y, z) = cube
|
||||
reachable_cubes.add(cube)
|
||||
|
||||
neighbors = []
|
||||
neighbors.append((x+1, y, z))
|
||||
neighbors.append((x-1, y, z))
|
||||
neighbors.append((x, y+1, z))
|
||||
neighbors.append((x, y-1, z))
|
||||
neighbors.append((x, y, z+1))
|
||||
neighbors.append((x, y, z-1))
|
||||
|
||||
for neighbor in neighbors:
|
||||
(nx, ny, nz) = neighbor
|
||||
if nx < x_min or nx > x_max or ny < y_min or ny > y_max or nz < z_min or nz > z_max:
|
||||
continue
|
||||
if neighbor in reachable_cubes or neighbor in cubes:
|
||||
continue
|
||||
|
||||
# Found a new empty cube!
|
||||
cube_queue.put(neighbor)
|
||||
|
||||
# Okay, found all empty cube outside the droplet.
|
||||
|
||||
surface_sides = set()
|
||||
|
||||
for empty in reachable_cubes:
|
||||
(x, y, z) = empty
|
||||
cube_sides = []
|
||||
cube_sides.append(ordered(empty, (x+1, y, z)))
|
||||
cube_sides.append(ordered(empty, (x-1, y, z)))
|
||||
cube_sides.append(ordered(empty, (x, y+1, z)))
|
||||
cube_sides.append(ordered(empty, (x, y-1, z)))
|
||||
cube_sides.append(ordered(empty, (x, y, z+1)))
|
||||
cube_sides.append(ordered(empty, (x, y, z-1)))
|
||||
|
||||
for side in cube_sides:
|
||||
if side in outer_sides:
|
||||
surface_sides.add(side)
|
||||
|
||||
print("part2", len(surface_sides))
|
54
2022/day8.py
Executable file
54
2022/day8.py
Executable file
|
@ -0,0 +1,54 @@
|
|||
#!/bin/python3
|
||||
|
||||
forest = []
|
||||
|
||||
with open('day8.txt', 'r') as f:
|
||||
for line in f:
|
||||
forest.append(list(map(int, list(line.strip()))))
|
||||
|
||||
height = len(forest)
|
||||
width = len(forest[0])
|
||||
|
||||
heighest = -1
|
||||
heighest_x = -1
|
||||
heighest_y = -1
|
||||
|
||||
for y in range(height):
|
||||
for x in range(width):
|
||||
h = forest[x][y]
|
||||
tree_count = 1
|
||||
|
||||
tree_count_cur = 0
|
||||
for cur_x in range(x+1, width):
|
||||
tree_count_cur += 1
|
||||
if forest[cur_x][y] >= h:
|
||||
break
|
||||
tree_count *= tree_count_cur
|
||||
|
||||
tree_count_cur = 0
|
||||
for cur_x in range(x-1, -1, -1):
|
||||
tree_count_cur += 1
|
||||
if forest[cur_x][y] >= h:
|
||||
break
|
||||
tree_count *= tree_count_cur
|
||||
|
||||
tree_count_cur = 0
|
||||
for cur_y in range(y+1, height):
|
||||
tree_count_cur += 1
|
||||
if forest[x][cur_y] >= h:
|
||||
break
|
||||
tree_count *= tree_count_cur
|
||||
|
||||
tree_count_cur = 0
|
||||
for cur_y in range(y-1, -1, -1):
|
||||
tree_count_cur += 1
|
||||
if forest[x][cur_y] >= h:
|
||||
break
|
||||
tree_count *= tree_count_cur
|
||||
|
||||
if tree_count > heighest:
|
||||
heighest = tree_count
|
||||
heighest_x = x
|
||||
heighest_y = y
|
||||
|
||||
print(x, y, heighest)
|
99
2022/day8.txt
Normal file
99
2022/day8.txt
Normal file
|
@ -0,0 +1,99 @@
|
|||
113003322412033102023303501444545044215232525401341546163452453404402234201151432242402140110220101
|
||||
332001304022012142421445502213221330453061535265122314201352335233021055055200345412200440033322200
|
||||
011113132214324432134325045311145402450516101640412524056254134552334050434552541351100000142223210
|
||||
120100233011423423144030334144351644642605521663331053414601341464201040045104150001214204243212330
|
||||
032313022420343002352401031112122630544621450306410014210122655033613410314450242104133332033433110
|
||||
330133431221024552500405304311611205251454505525065601244143364343441153320511500334525320443331122
|
||||
232021314224321045040222145130205324423110304256225426345644345334310200416004113133521143332200422
|
||||
312322022143422250013255366221252062135020112327134227764002156152041134323314242255102200014240004
|
||||
212411010402324310541162616440606266620317315234166112525535542054554446314636025435501101142314410
|
||||
130420010020500305012262532345565125253527765422533261626735742433241362062404452514044512024131310
|
||||
241211034142224054050344306633445512263575724527746635663111434536510100261040501431453540340134211
|
||||
241313213114241230212646636605641533121654131662127125143714342377771455431346140255405303533314030
|
||||
200214302143123545226333105604234323144236661442633717414531213335635263423430225510502553055320124
|
||||
432210433113545424321340236152364457166745737761176472274142327714574465315263302246430530531052340
|
||||
044321111115013046066155407144655275272121513224325736736453741437462322257332111603344504052313220
|
||||
423214232334431334032453034121465736632235428586864276787383246667147623517713521254056250023050122
|
||||
341124205512002021001520535463145337475482376656634323542842654415315313467514115356311404235042224
|
||||
132001402100660310301501776141144746672773424257875288227677277663442356545463514004411150412531212
|
||||
001052001350350313612735275534436625275423778573334245773528222523563225127612470242660400232440014
|
||||
000112513501320042013743116251356437388536835723273464367352632733656224242323651012010230151310024
|
||||
432343513243516355144362617334462875826626872624526547773732534284688857151541627654520220114445210
|
||||
030155000415201011165562424113226826748747748853864385358746645352362468546644524342115335322112153
|
||||
521354124325146425431532157187775456325686557739354768338786565328828884835715454276200630310531024
|
||||
453541003326165663116714725533384334462564846638857736639973473868246353547315725644665433532024310
|
||||
550412430051564655211263423273445384473677893666497965987545884578247877687261326676604334421513240
|
||||
413054444206603631433161684337566624388758573363447988796769799695582635658423643315241325425634024
|
||||
215150330040102563666211553675525355868889739969438648979533595459347577832874756321426443250541325
|
||||
421424650534663421741533522275548697677937396576933765698789956783468276533784535453223333266121254
|
||||
422144151564541614312463257866683347483647399747895987469373443743399762878755625665635533442122100
|
||||
142126413036631514413457664863683937946499766465555784756389698779343558673226534437441452602242233
|
||||
305201320636671251145832252388563746733774564949748445664654449965453936743822654651524764154313443
|
||||
011300622102111771164477857675385967936859964787497949987577437799784855267278677674646432241223234
|
||||
340321113267666756754785648366853336456946997569954774746449465943647534953257556352535151305025463
|
||||
541411012547643576586448655984493857478575997945994447954587596973768677885376565465523461502535643
|
||||
444321100654632152854364424757747839747855469574958798776977549543479354379242483435267721134026240
|
||||
020626205154575316847673866764644374748789977457499575788744688854499953995222366237635424744520350
|
||||
335506510045711628565868794334457797677874456886875779795697459467453749364727248672726163736041204
|
||||
500111603536263112863778287468558998649869948858895979757648556554566675849574438477347434571054505
|
||||
122000100243546685578334388934875844674864976796788677978555975645687865954363424837536471770452415
|
||||
141414215752566148738527647673948945657599775586897776875597686768689334698832463748744764733053124
|
||||
100340653262173232623746876388947885855898958859977856795865855466954797947557362275815142426540331
|
||||
466303032723142355554844869739456445889568997967558595977567767954454556686589744843263767635404425
|
||||
004613266772514623473428884775998765955988667675865595697667595999549844548767382824562175546612214
|
||||
223062321176322437826876799485789855749797897795766857786556556466469876653886288833557467773301562
|
||||
413332261232125275243773533956777794896856665777776697967896558687464977634963578724434267752313063
|
||||
552404621241274462672869963657657685959857786696669988675856559577744587934439473355436162566631240
|
||||
435165353647675322378767844955594694568958979668688889986755769858696479453833942343873533447232052
|
||||
244432367557727222376845574654778567657966566799677789797957677969848457379553465846862364131450331
|
||||
500160365677454526747395979487899988575755756767767688698968968964795455975647975338665645777505164
|
||||
102431235675118652565457756594548744578555576979976998997755878856465958937486343448585657465615526
|
||||
246165542416756587676444776898888956766578897997878779867867799995588485976853457557557151277215635
|
||||
001643325345324464653748985776747945569696578767779897778688898756644945899654857626437342132540232
|
||||
012101664761176266736346897839595848575598988867686699987969655574844656549763626542283366457311330
|
||||
561504075335422826822483989945889874569866596668697889889787698578564685356683642368537236162426203
|
||||
352203514134651772748288733934776699589795768989986896977876655856647995457449532883535245357460413
|
||||
033642404423741338448747543456567587875878659898696769778857567974989696766857638532623516361132200
|
||||
616444206117715325587799743549596679896878996579778797758659755584898985549986338256726477267555103
|
||||
520455143625244274365846334377848464679657799659996799959789655886895549885388585227864441542440633
|
||||
301346217675555884462648646383444656479799855995796958569776779656497648598636775768426556776465212
|
||||
520404231326621664428744458384498945886755796967559979558788575647874897993564426835362551773515204
|
||||
316242511662326327222423774658467889697656957595795766869586965778777639684376585246752671616104436
|
||||
415146426112762185773325386754349955694758878879858887885879799994465943455896555866711732413133541
|
||||
355625411617227324663526785865944884474696755859788678978799585984575877863878686426651623174052622
|
||||
250022125746424524625262754995697689898769757895898887999798967686567449959582647242127737515510342
|
||||
525264040416627662865878845844435466984695749789657699584976867495646849545456285287242646554654353
|
||||
036123646424431555263267827839763498876769495677697448449595455554764947373454763645727333510646146
|
||||
204566364235641316654753765445963394466448895664985649465498769864394998376778764453573662441355520
|
||||
220335031661255773663868585338574847865979585777445874888879656858779783486746544464161776603563641
|
||||
222513656331342447187422756294679343838685457555849784967456454674489536467765228571211235451313300
|
||||
420041535613636672654268683685394696895377789594449696975655499485443388622338663537334646443120355
|
||||
525056224212611227113776876877874646779895859895448998785578796984395868862632743546145340000633644
|
||||
404314430546135313471247434875543567783736878545548779967377554684776373253726223752325712616213051
|
||||
353422360566111142127744587245868774578548754579967945935667489466386244448265471714226610251556141
|
||||
240135510612042471674334266253242658953336636546539684393847584358732442564537232411555541300234143
|
||||
555204024234655515726125842362866243634643845579964798949797638778425653264527614711662106606433551
|
||||
203524350135524444622315434263233285368993457879757738399643368354787234632745135155274525361620440
|
||||
340532455653452155645722264385685523579545388464998647475936784423755683487133452753535123313604354
|
||||
352152244221611331745526617386458872637865488449639856654753583624523335337272114515341203461045505
|
||||
312033003454166053225452625154365544367483828667456379835556776344278883841652574422331646601235245
|
||||
354330514213011046317425234714582372762675574834484437275552425744868747672133251365644033361512332
|
||||
044021444522010141412515121117476227878457643873272338756238823637528547351444752605411146631314215
|
||||
232413442230001100251223172352214643455635846823657522575345326788747411734266577565251164231145220
|
||||
131504320306315625216346311325345143883224276853882277427888248757813625336722630560555630113015013
|
||||
024451223151264563630623162617513241445834482436236846786748364751551471325535132540104323422105400
|
||||
124420553125506323053405346614111134556285246233525828237347884315614217572766434350535521515101401
|
||||
130200351112000250166105345316513263244676855323883356633222244252121772667652426014110503513555221
|
||||
400241412230012102424516231766252561312255446621244373337355416351623124213640652213520151043110444
|
||||
322440423504102454033133351036544434155137522762124773455775324625526553424524313460144053442544330
|
||||
324303335402501236440552111053234114555641277255456252443511634243752643304353256666504353255522122
|
||||
241434204225354100532033205000145461776516534477176114531271372735543451231303326454043352113013420
|
||||
334124213300015522546105345511323376357312632521613774424256342133105114520414061451141133554301031
|
||||
211304431150451251125020043053260563634374764226536222654742522421115640025331113215553523303422011
|
||||
123324243323523142132445503461621106650437431517676417742653314226115466013230223030345414021112341
|
||||
100121244242050431353422620202033056213213561562676642451361622463016135301034322504250003434240420
|
||||
202331344430130314251310046312513630614136423111235233115234253411664210435541154434125202004300041
|
||||
311142442400021052335032430131001522121243633355511015105456130306054020525345400331240114301233431
|
||||
303333210333101445104545232532514231420245342044224564606555504302423403203123103211431303412444103
|
||||
322112022033322224210512330414230625446520203533135512231066520423212314402311345154232414213413203
|
||||
210220340333424334214524143431005502542403323230305103516410534415015522312221415410344021130000212
|
106
2022/day9.py
Executable file
106
2022/day9.py
Executable file
|
@ -0,0 +1,106 @@
|
|||
#!/bin/python3
|
||||
|
||||
moves = []
|
||||
|
||||
with open('day9.txt', 'r') as f:
|
||||
for line in f:
|
||||
[direc, count] = line.split(' ')
|
||||
count = int(count)
|
||||
for i in range(count):
|
||||
moves.append(direc)
|
||||
|
||||
hlocs = []
|
||||
hloc = (0, 0)
|
||||
|
||||
for move in moves:
|
||||
if move == 'U':
|
||||
hloc = (hloc[0], hloc[1]-1)
|
||||
if move == 'D':
|
||||
hloc = (hloc[0], hloc[1]+1)
|
||||
if move == 'R':
|
||||
hloc = (hloc[0]+1, hloc[1])
|
||||
if move == 'L':
|
||||
hloc = (hloc[0]-1, hloc[1])
|
||||
hlocs.append(hloc)
|
||||
|
||||
tlocs = set([(0, 0)])
|
||||
tloc = (0, 0)
|
||||
|
||||
for hloc in hlocs:
|
||||
if abs(hloc[0] - tloc[0]) > 1 or abs(hloc[1] - tloc[1]) > 1:
|
||||
if hloc[0] < tloc[0]:
|
||||
tloc = (tloc[0]-1, tloc[1])
|
||||
elif hloc[0] > tloc[0]:
|
||||
tloc = (tloc[0]+1, tloc[1])
|
||||
if hloc[1] < tloc[1]:
|
||||
tloc = (tloc[0], tloc[1]-1)
|
||||
elif hloc[1] > tloc[1]:
|
||||
tloc = (tloc[0], tloc[1]+1)
|
||||
else:
|
||||
if hloc[0] == tloc[0]+2:
|
||||
tloc = (tloc[0]+1, tloc[1])
|
||||
elif hloc[0] == tloc[0]-2:
|
||||
tloc = (tloc[0]-1, tloc[1])
|
||||
elif hloc[1] == tloc[1]+2:
|
||||
tloc = (tloc[0], tloc[1]+1)
|
||||
elif hloc[1] == tloc[1]-2:
|
||||
tloc = (tloc[0], tloc[1]-1)
|
||||
tlocs.add(tloc)
|
||||
|
||||
print("part1", len(tlocs))
|
||||
|
||||
def print_state(n, parts):
|
||||
for y in range(-n, n):
|
||||
for x in range(-n, n):
|
||||
printed = False
|
||||
for i in range(10):
|
||||
if parts[i][0] == x and parts[i][1] == y:
|
||||
printed = True
|
||||
print(str(i), end='')
|
||||
break
|
||||
if not printed:
|
||||
print('#', end='')
|
||||
print('')
|
||||
print('')
|
||||
|
||||
parts = []
|
||||
visited = set([(0, 0)])
|
||||
for i in range(10):
|
||||
parts.append((0, 0))
|
||||
for move in moves:
|
||||
print(move)
|
||||
for i in range(10):
|
||||
if i == 0:
|
||||
if move == 'R':
|
||||
parts[0] = (parts[0][0]+1, parts[0][1])
|
||||
if move == 'L':
|
||||
parts[0] = (parts[0][0]-1, parts[0][1])
|
||||
if move == 'U':
|
||||
parts[0] = (parts[0][0], parts[0][1]-1)
|
||||
if move == 'D':
|
||||
parts[0] = (parts[0][0], parts[0][1]+1)
|
||||
else:
|
||||
(prevx, prevy) = parts[i-1]
|
||||
if abs(prevx - parts[i][0]) > 1 or abs(prevy - parts[i][1]) > 1:
|
||||
if prevx < parts[i][0]:
|
||||
parts[i] = (parts[i][0]-1, parts[i][1])
|
||||
elif prevx > parts[i][0]:
|
||||
parts[i] = (parts[i][0]+1, parts[i][1])
|
||||
if prevy < parts[i][1]:
|
||||
parts[i] = (parts[i][0], parts[i][1]-1)
|
||||
elif prevy > parts[i][1]:
|
||||
parts[i] = (parts[i][0], parts[i][1]+1)
|
||||
else:
|
||||
if prevx == parts[i][0]+2:
|
||||
parts[i] = (parts[i][0]+1, parts[i][1])
|
||||
elif prevx == parts[i][0]-2:
|
||||
parts[i] = (parts[i][0]-1, parts[i][1])
|
||||
elif prevy == parts[i][1]+2:
|
||||
parts[i] = (parts[i][0], parts[i][1]+1)
|
||||
elif prevy == parts[i][1]-2:
|
||||
parts[i] = (parts[i][0], parts[i][1]-1)
|
||||
if i == 9:
|
||||
visited.add(parts[-1])
|
||||
print_state(5, parts)
|
||||
|
||||
print('part2', len(visited))
|
2000
2022/day9.txt
Normal file
2000
2022/day9.txt
Normal file
File diff suppressed because it is too large
Load diff
8
2022/day9test.txt
Normal file
8
2022/day9test.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
R 4
|
||||
U 4
|
||||
L 3
|
||||
D 1
|
||||
R 4
|
||||
D 1
|
||||
L 5
|
||||
R 2
|
46
2022/lib/day.ex
Normal file
46
2022/lib/day.ex
Normal file
|
@ -0,0 +1,46 @@
|
|||
defmodule AOC.Day do
|
||||
defmacro __using__(opts) do
|
||||
day = Keyword.get(opts, :day)
|
||||
debug = Keyword.get(opts, :debug, false)
|
||||
trim = Keyword.get(opts, :trim, true)
|
||||
input_file = Keyword.get(opts, :input, nil)
|
||||
|
||||
quote do
|
||||
def solve do
|
||||
input =
|
||||
AOC.Day.input_lines(unquote(day), unquote(trim), unquote(input_file))
|
||||
|> parse_input()
|
||||
|
||||
if unquote(debug) do
|
||||
IO.inspect(input)
|
||||
end
|
||||
|
||||
part1_solution = part1(input)
|
||||
IO.puts("Part 1: #{part1_solution}")
|
||||
|
||||
part2_solution = part2(input)
|
||||
IO.puts("Part 2: #{part2_solution}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def input_lines(day, trim, input_file) do
|
||||
lines =
|
||||
input_file_name(day, input_file)
|
||||
|> File.stream!()
|
||||
|
||||
if trim do
|
||||
Enum.map(lines, &String.trim/1)
|
||||
else
|
||||
lines
|
||||
end
|
||||
end
|
||||
|
||||
def input_file_name(day, input_file) do
|
||||
if input_file do
|
||||
Path.join([File.cwd!(), "inputs", "day#{day}_#{input_file}.txt"])
|
||||
else
|
||||
Path.join([File.cwd!(), "inputs", "day#{day}.txt"])
|
||||
end
|
||||
end
|
||||
end
|
24
2022/lib/days/day1.ex
Normal file
24
2022/lib/days/day1.ex
Normal file
|
@ -0,0 +1,24 @@
|
|||
defmodule AOC.Day1 do
|
||||
use AOC.Day, day: 1
|
||||
|
||||
def parse_input(lines) do
|
||||
lines
|
||||
|> Enum.chunk_by(&(&1 == ""))
|
||||
|> Enum.reject(&(&1 == [""]))
|
||||
|> Enum.map(fn l -> Enum.map(l, &String.to_integer/1) end)
|
||||
end
|
||||
|
||||
def part1(input) do
|
||||
input
|
||||
|> Enum.map(&Enum.sum/1)
|
||||
|> Enum.max()
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
input
|
||||
|> Enum.map(&Enum.sum/1)
|
||||
|> Enum.sort(:desc)
|
||||
|> Enum.take(3)
|
||||
|> Enum.sum()
|
||||
end
|
||||
end
|
93
2022/lib/days/day11.ex
Normal file
93
2022/lib/days/day11.ex
Normal file
|
@ -0,0 +1,93 @@
|
|||
defmodule AOC.Day11 do
|
||||
use AOC.Day, day: 11
|
||||
alias AOC.Day11.{MonkeyRegistry, Monkey}
|
||||
|
||||
def parse_input(lines) do
|
||||
monkeys =
|
||||
lines
|
||||
|> Enum.chunk_by(&(&1 == ""))
|
||||
|> Enum.reject(&(&1 == [""]))
|
||||
|> Enum.map(&parse_monkey/1)
|
||||
|
||||
supermod =
|
||||
monkeys
|
||||
|> Enum.map(& &1.modulo)
|
||||
|> Enum.reduce(&Kernel.*/2)
|
||||
|
||||
{:ok, _} = Registry.start_link(keys: :unique, name: MonkeyRegistry)
|
||||
|
||||
Enum.each(monkeys, fn %{id: id} = monkey ->
|
||||
GenServer.start_link(Monkey, Map.put(monkey, :supermod, supermod),
|
||||
name: {:via, Registry, {MonkeyRegistry, id}}
|
||||
)
|
||||
end)
|
||||
|
||||
Enum.count(monkeys)
|
||||
end
|
||||
|
||||
def parse_monkey([
|
||||
"Monkey " <> monkey_id,
|
||||
"Starting items: " <> items,
|
||||
"Operation: " <> operation,
|
||||
"Test: divisible by " <> modulo,
|
||||
"If true: throw to monkey " <> true_monkey_id,
|
||||
"If false: throw to monkey " <> false_monkey_id
|
||||
]) do
|
||||
%{
|
||||
id: monkey_id |> String.slice(0..-2) |> String.to_integer(),
|
||||
items: items |> String.split(", ") |> Enum.map(&String.to_integer/1),
|
||||
operation: parse_operation(operation),
|
||||
modulo: String.to_integer(modulo),
|
||||
true_monkey_id: String.to_integer(true_monkey_id),
|
||||
false_monkey_id: String.to_integer(false_monkey_id)
|
||||
}
|
||||
end
|
||||
|
||||
def parse_operation(operation) do
|
||||
["new", "=", lhs, op, rhs] = String.split(operation)
|
||||
|
||||
fn old ->
|
||||
lhs = if lhs == "old", do: old, else: String.to_integer(lhs)
|
||||
rhs = if rhs == "old", do: old, else: String.to_integer(rhs)
|
||||
|
||||
op =
|
||||
case op do
|
||||
"*" -> &Kernel.*/2
|
||||
"+" -> &Kernel.+/2
|
||||
end
|
||||
|
||||
op.(lhs, rhs)
|
||||
end
|
||||
end
|
||||
|
||||
def part1(monkey_count) do
|
||||
# monkey_business(monkey_count, 20, false)
|
||||
end
|
||||
|
||||
def part2(monkey_count) do
|
||||
monkey_business(monkey_count, 10000, true)
|
||||
end
|
||||
|
||||
def monkey_business(monkey_count, rounds, ridiculous) do
|
||||
execute_rounds(monkey_count, rounds, ridiculous)
|
||||
|
||||
Enum.map(0..(monkey_count - 1), fn id ->
|
||||
[{pid, _}] = Registry.lookup(MonkeyRegistry, id)
|
||||
Monkey.get_activeness(pid)
|
||||
end)
|
||||
|> Enum.sort(:desc)
|
||||
|> Enum.take(2)
|
||||
|> Enum.reduce(&Kernel.*/2)
|
||||
end
|
||||
|
||||
def execute_rounds(monkey_count, rounds, ridiculous) do
|
||||
Enum.each(0..(rounds - 1), fn _ -> execute_round(monkey_count, ridiculous) end)
|
||||
end
|
||||
|
||||
def execute_round(monkey_count, ridiculous) do
|
||||
Enum.each(0..(monkey_count - 1), fn id ->
|
||||
[{pid, _}] = Registry.lookup(MonkeyRegistry, id)
|
||||
Monkey.execute_turn(pid, ridiculous)
|
||||
end)
|
||||
end
|
||||
end
|
63
2022/lib/days/day11/monkey.ex
Normal file
63
2022/lib/days/day11/monkey.ex
Normal file
|
@ -0,0 +1,63 @@
|
|||
defmodule AOC.Day11.Monkey do
|
||||
use GenServer
|
||||
alias AOC.Day11.{MonkeyRegistry, Monkey}
|
||||
|
||||
@impl true
|
||||
def init(state) do
|
||||
{:ok, Map.put(state, :activeness, 0)}
|
||||
end
|
||||
|
||||
def execute_turn(pid, ridiculous) do
|
||||
GenServer.call(pid, {:execute_turn, ridiculous}, :infinity)
|
||||
end
|
||||
|
||||
def throw(pid, item) do
|
||||
GenServer.call(pid, {:throw, item})
|
||||
end
|
||||
|
||||
def get_items(pid) do
|
||||
GenServer.call(pid, :get_items)
|
||||
end
|
||||
|
||||
def get_activeness(pid) do
|
||||
GenServer.call(pid, :get_activeness)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_call(
|
||||
{:execute_turn, ridiculous},
|
||||
_from,
|
||||
%{
|
||||
items: items,
|
||||
operation: operation,
|
||||
modulo: modulo,
|
||||
true_monkey_id: true_monkey_id,
|
||||
false_monkey_id: false_monkey_id,
|
||||
activeness: activeness,
|
||||
supermod: supermod
|
||||
} = state
|
||||
) do
|
||||
Enum.each(items, fn item ->
|
||||
item = operation.(item)
|
||||
item = if ridiculous, do: item, else: Integer.floor_div(item, 3)
|
||||
item = Integer.mod(item, supermod)
|
||||
recipient = if Integer.mod(item, modulo) == 0, do: true_monkey_id, else: false_monkey_id
|
||||
[{pid, _}] = Registry.lookup(MonkeyRegistry, recipient)
|
||||
Monkey.throw(pid, item)
|
||||
end)
|
||||
|
||||
{:reply, :ok, %{state | items: [], activeness: activeness + length(items)}}
|
||||
end
|
||||
|
||||
def handle_call({:throw, item}, _from, %{items: items} = state) do
|
||||
{:reply, :ok, Map.put(state, :items, items ++ [item])}
|
||||
end
|
||||
|
||||
def handle_call(:get_items, _from, %{items: items} = state) do
|
||||
{:reply, items, state}
|
||||
end
|
||||
|
||||
def handle_call(:get_activeness, _from, %{activeness: activeness} = state) do
|
||||
{:reply, activeness, state}
|
||||
end
|
||||
end
|
67
2022/lib/days/day13.ex
Normal file
67
2022/lib/days/day13.ex
Normal file
|
@ -0,0 +1,67 @@
|
|||
defmodule AOC.Day13 do
|
||||
use AOC.Day, day: 13
|
||||
alias AOC.Day13.Packet
|
||||
|
||||
defmodule Packet do
|
||||
def compare({p1, p2}) do
|
||||
compare(p1, p2)
|
||||
end
|
||||
|
||||
def compare([], []), do: :eq
|
||||
def compare([], _l), do: :lt
|
||||
def compare(_l, []), do: :gt
|
||||
def compare(x, l) when is_number(x) and is_list(l), do: compare([x], l)
|
||||
def compare(l, x) when is_number(x) and is_list(l), do: compare(l, [x])
|
||||
|
||||
def compare([h1 | tl1], [h2 | tl2]) do
|
||||
case compare(h1, h2) do
|
||||
:eq -> compare(tl1, tl2)
|
||||
x -> x
|
||||
end
|
||||
end
|
||||
|
||||
def compare(x, y) when x < y, do: :lt
|
||||
def compare(x, y) when x == y, do: :eq
|
||||
def compare(x, y) when x > y, do: :gt
|
||||
end
|
||||
|
||||
def parse_input(lines) do
|
||||
lines
|
||||
|> Enum.chunk_by(&(&1 == ""))
|
||||
|> Enum.reject(&(&1 == [""]))
|
||||
|> Enum.map(fn [p1, p2] ->
|
||||
{parse_packet(p1), parse_packet(p2)}
|
||||
end)
|
||||
end
|
||||
|
||||
def parse_packet(packet) do
|
||||
packet
|
||||
|> String.to_charlist()
|
||||
|> Code.string_to_quoted()
|
||||
|> elem(1)
|
||||
end
|
||||
|
||||
def part1(pairs) do
|
||||
pairs
|
||||
|> Enum.map(&Packet.compare/1)
|
||||
|> Enum.with_index()
|
||||
|> Enum.filter(&(elem(&1, 0) == :lt))
|
||||
|> Enum.map(&elem(&1, 1))
|
||||
|> Enum.map(&Kernel.+(&1, 1))
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
@divider_packets [[[2]], [[6]]]
|
||||
|
||||
def part2(pairs) do
|
||||
pairs
|
||||
|> Enum.flat_map(fn {p1, p2} -> [p1, p2] end)
|
||||
|> Kernel.++(@divider_packets)
|
||||
|> Enum.sort(Packet)
|
||||
|> Enum.with_index()
|
||||
|> Enum.filter(&(elem(&1, 0) in @divider_packets))
|
||||
|> Enum.map(&elem(&1, 1))
|
||||
|> Enum.map(&Kernel.+(&1, 1))
|
||||
|> Enum.reduce(&Kernel.*/2)
|
||||
end
|
||||
end
|
81
2022/lib/days/day16.ex
Normal file
81
2022/lib/days/day16.ex
Normal file
|
@ -0,0 +1,81 @@
|
|||
defmodule AOC.Day16 do
|
||||
use AOC.Day, day: 16, debug: true, input: "example"
|
||||
alias AOC.Day16.{ValveRegistry, Valve}
|
||||
|
||||
defmodule Valve do
|
||||
use GenServer
|
||||
|
||||
@impl true
|
||||
def init(state) do
|
||||
state = Map.put(state, :released, 0)
|
||||
state = Map.put(state, :open?, false)
|
||||
{:ok, state}
|
||||
end
|
||||
|
||||
def get_rate(valve) do
|
||||
GenServer.call(valve, :get_rate)
|
||||
end
|
||||
|
||||
def tick(valve) do
|
||||
GenServer.call(valve, :tick)
|
||||
end
|
||||
|
||||
def open(valve) do
|
||||
GenServer.call(valve, :open)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_call(:get_rate, _from, %{rate: rate} = state) do
|
||||
{:reply, rate, state}
|
||||
end
|
||||
|
||||
def handle_call(:tick, _from, %{open?: open?, released: released, rate: rate} = state) do
|
||||
released = if open?, do: released + rate, else: released
|
||||
{:reply, :ok, %{state | released: released}}
|
||||
end
|
||||
|
||||
def handle_call(:open, _from, state) do
|
||||
{:reply, :ok, %{state | open?: true}}
|
||||
end
|
||||
end
|
||||
|
||||
@line_regex ~r/Valve (?<name>[A-Z]{2}) has flow rate=(?<rate>\d+); tunnels? leads? to valves? (?<tunnels>.*)/
|
||||
|
||||
def parse_input(lines) do
|
||||
{:ok, _} = Registry.start_link(keys: :unique, name: ValveRegistry)
|
||||
|
||||
lines
|
||||
|> Enum.map(fn line ->
|
||||
%{"name" => name, "rate" => rate, "tunnels" => tunnels} =
|
||||
Regex.named_captures(@line_regex, line)
|
||||
|
||||
%{name: name, rate: String.to_integer(rate), tunnels: String.split(tunnels, ", ")}
|
||||
end)
|
||||
|> Enum.into(%{}, fn %{name: name} = valve ->
|
||||
{:ok, pid} =
|
||||
GenServer.start_link(Valve, valve, name: {:via, Registry, {ValveRegistry, name}})
|
||||
|
||||
{name, pid}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(valves) do
|
||||
Enum.map(valves, fn {name, valve} ->
|
||||
rate = Valve.get_rate(valve)
|
||||
{name, rate}
|
||||
end)
|
||||
|> Enum.sort_by(&elem(&1, 1), :desc)
|
||||
|> IO.inspect()
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
def tick(valves) do
|
||||
Enum.each(valves, fn {_, valve} ->
|
||||
Valve.tick(valve)
|
||||
end)
|
||||
end
|
||||
|
||||
def part2(_input) do
|
||||
end
|
||||
end
|
68
2022/lib/days/day2.ex
Normal file
68
2022/lib/days/day2.ex
Normal file
|
@ -0,0 +1,68 @@
|
|||
defmodule AOC.Day2 do
|
||||
use AOC.Day, day: 2
|
||||
|
||||
def parse_input(lines) do
|
||||
Enum.map(lines, fn line ->
|
||||
[move1, move2] =
|
||||
line
|
||||
|> String.split(" ")
|
||||
|> Enum.map(fn c ->
|
||||
c
|
||||
|> String.to_charlist()
|
||||
|> hd()
|
||||
end)
|
||||
|
||||
{move1, move2}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(input) do
|
||||
input
|
||||
|> Enum.map(fn {move1, move2} ->
|
||||
score =
|
||||
case move2 do
|
||||
?X -> 1
|
||||
?Y -> 2
|
||||
?Z -> 3
|
||||
end
|
||||
|
||||
score +
|
||||
case {move1, move2} do
|
||||
{?A, ?Y} -> 6
|
||||
{?B, ?Z} -> 6
|
||||
{?C, ?X} -> 6
|
||||
{?A, ?X} -> 3
|
||||
{?B, ?Y} -> 3
|
||||
{?C, ?Z} -> 3
|
||||
_ -> 0
|
||||
end
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
input
|
||||
|> Enum.map(fn {move1, result} ->
|
||||
score =
|
||||
case result do
|
||||
?X -> 0
|
||||
?Y -> 3
|
||||
?Z -> 6
|
||||
end
|
||||
|
||||
score +
|
||||
case {move1, result} do
|
||||
{?A, ?X} -> 3
|
||||
{?A, ?Y} -> 1
|
||||
{?A, ?Z} -> 2
|
||||
{?B, ?X} -> 1
|
||||
{?B, ?Y} -> 2
|
||||
{?B, ?Z} -> 3
|
||||
{?C, ?X} -> 2
|
||||
{?C, ?Y} -> 3
|
||||
{?C, ?Z} -> 1
|
||||
end
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
end
|
39
2022/lib/days/day3.ex
Normal file
39
2022/lib/days/day3.ex
Normal file
|
@ -0,0 +1,39 @@
|
|||
defmodule AOC.Day3 do
|
||||
use AOC.Day, day: 3
|
||||
|
||||
def parse_input(lines), do: lines
|
||||
|
||||
def part1(input) do
|
||||
input
|
||||
|> Enum.map(fn line ->
|
||||
comp_size = line |> String.length() |> div(2)
|
||||
{comp1, comp2} = line |> String.to_charlist() |> Enum.split(comp_size)
|
||||
comp1 = MapSet.new(comp1)
|
||||
comp2 = MapSet.new(comp2)
|
||||
|
||||
MapSet.intersection(comp1, comp2)
|
||||
|> MapSet.to_list()
|
||||
|> hd()
|
||||
|> get_priority()
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
input
|
||||
|> Enum.chunk_every(3)
|
||||
|> Enum.map(fn group ->
|
||||
group
|
||||
|> Enum.map(&String.to_charlist/1)
|
||||
|> Enum.map(&MapSet.new/1)
|
||||
|> Enum.reduce(&MapSet.intersection/2)
|
||||
|> MapSet.to_list()
|
||||
|> hd()
|
||||
|> get_priority()
|
||||
end)
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def get_priority(char) when char >= ?a, do: char - 96
|
||||
def get_priority(char), do: char - 38
|
||||
end
|
38
2022/lib/days/day4.ex
Normal file
38
2022/lib/days/day4.ex
Normal file
|
@ -0,0 +1,38 @@
|
|||
defmodule AOC.Day4 do
|
||||
use AOC.Day, day: 4
|
||||
|
||||
def parse_input(lines) do
|
||||
Enum.map(lines, fn line ->
|
||||
[assign1, assign2] =
|
||||
line
|
||||
|> String.split(",")
|
||||
|> Enum.map(fn assign ->
|
||||
[from, to] =
|
||||
assign
|
||||
|> String.split("-")
|
||||
|> Enum.map(&String.to_integer/1)
|
||||
|
||||
MapSet.new(from..to)
|
||||
end)
|
||||
|
||||
{assign1, assign2}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(input) do
|
||||
input
|
||||
|> Enum.map(fn {set1, set2} ->
|
||||
MapSet.subset?(set1, set2) or MapSet.subset?(set2, set1)
|
||||
end)
|
||||
|> Enum.count(& &1)
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
input
|
||||
|> Enum.map(fn {set1, set2} ->
|
||||
MapSet.intersection(set1, set2)
|
||||
|> Enum.any?()
|
||||
end)
|
||||
|> Enum.count(& &1)
|
||||
end
|
||||
end
|
70
2022/lib/days/day5.ex
Normal file
70
2022/lib/days/day5.ex
Normal file
|
@ -0,0 +1,70 @@
|
|||
defmodule AOC.Day5 do
|
||||
use AOC.Day, day: 5, trim: false
|
||||
|
||||
def parse_input(lines) do
|
||||
[init, ops] =
|
||||
lines
|
||||
|> Enum.chunk_by(&(&1 == "\n"))
|
||||
|> Enum.reject(&(&1 == ["\n"]))
|
||||
|
||||
{parse_init(init), parse_ops(ops)}
|
||||
end
|
||||
|
||||
def parse_init(init) do
|
||||
init
|
||||
|> Enum.split(-1)
|
||||
|> elem(0)
|
||||
|> Enum.map(fn line ->
|
||||
line
|
||||
|> String.to_charlist()
|
||||
|> tl()
|
||||
|> Enum.take_every(4)
|
||||
end)
|
||||
|> Enum.zip_with(&Function.identity/1)
|
||||
|> Enum.map(fn stack ->
|
||||
Enum.reject(stack, &(&1 == ?\s))
|
||||
end)
|
||||
end
|
||||
|
||||
def parse_ops(ops) do
|
||||
Enum.map(ops, fn op ->
|
||||
%{"count" => count, "from" => from, "to" => to} =
|
||||
Regex.named_captures(~r/move (?<count>\d+) from (?<from>\d+) to (?<to>\d+)\n/, op)
|
||||
|
||||
%{
|
||||
count: String.to_integer(count),
|
||||
from: String.to_integer(from) - 1,
|
||||
to: String.to_integer(to) - 1
|
||||
}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(input) do
|
||||
move(input, true)
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
move(input, false)
|
||||
end
|
||||
|
||||
def move({init, ops}, reverse) do
|
||||
ops
|
||||
|> Enum.reduce(init, fn %{count: count, from: from, to: to}, acc ->
|
||||
{acc, removed} = remove(acc, from, count)
|
||||
removed = if reverse, do: Enum.reverse(removed), else: removed
|
||||
add(acc, to, removed)
|
||||
end)
|
||||
|> Enum.map(&hd/1)
|
||||
end
|
||||
|
||||
def remove(stacks, from, count) do
|
||||
{removed, new} = Enum.split(Enum.at(stacks, from), count)
|
||||
stacks = List.update_at(stacks, from, fn _ -> new end)
|
||||
{stacks, removed}
|
||||
end
|
||||
|
||||
def add(stacks, to, removed) do
|
||||
added = Enum.concat(removed, Enum.at(stacks, to))
|
||||
List.update_at(stacks, to, fn _ -> added end)
|
||||
end
|
||||
end
|
29
2022/lib/days/day6.ex
Normal file
29
2022/lib/days/day6.ex
Normal file
|
@ -0,0 +1,29 @@
|
|||
defmodule AOC.Day6 do
|
||||
use AOC.Day, day: 6
|
||||
|
||||
def parse_input(lines), do: lines |> hd() |> String.to_charlist()
|
||||
|
||||
def part1(input) do
|
||||
find_marker(input, 0, 4)
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
find_marker(input, 0, 14)
|
||||
end
|
||||
|
||||
def find_marker(signal, index, length) do
|
||||
distinct =
|
||||
signal
|
||||
|> Enum.take(length)
|
||||
|> MapSet.new()
|
||||
|> Enum.count()
|
||||
|
||||
if distinct == length do
|
||||
index + length
|
||||
else
|
||||
signal
|
||||
|> tl()
|
||||
|> find_marker(index + 1, length)
|
||||
end
|
||||
end
|
||||
end
|
82
2022/lib/days/day7.ex
Normal file
82
2022/lib/days/day7.ex
Normal file
|
@ -0,0 +1,82 @@
|
|||
defmodule AOC.Day7 do
|
||||
use AOC.Day, day: 7
|
||||
|
||||
def parse_input(lines) do
|
||||
Enum.map(lines, fn
|
||||
"$ cd " <> arg ->
|
||||
{:cd, arg}
|
||||
|
||||
"$ ls" ->
|
||||
:ls
|
||||
|
||||
"dir " <> arg ->
|
||||
{:dir, arg}
|
||||
|
||||
line ->
|
||||
[size, file] = String.split(line)
|
||||
{:file, String.to_integer(size), file}
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(input) do
|
||||
input
|
||||
|> get_file_sizes()
|
||||
|> get_directory_sizes()
|
||||
|> Enum.map(fn {_, size} -> size end)
|
||||
|> Enum.filter(&(&1 <= 100_000))
|
||||
|> Enum.sum()
|
||||
end
|
||||
|
||||
def part2(input) do
|
||||
file_sizes = get_file_sizes(input)
|
||||
|
||||
total_size =
|
||||
file_sizes
|
||||
|> Enum.map(&elem(&1, 1))
|
||||
|> Enum.sum()
|
||||
|
||||
size_needed = total_size - 40_000_000
|
||||
|
||||
file_sizes
|
||||
|> get_directory_sizes()
|
||||
|> Enum.map(&elem(&1, 1))
|
||||
|> Enum.filter(fn size -> size >= size_needed end)
|
||||
|> Enum.min()
|
||||
end
|
||||
|
||||
def get_file_sizes(input) do
|
||||
Enum.reduce(input, {[], []}, fn
|
||||
{:cd, "/"}, {_, sizes} ->
|
||||
{["/"], sizes}
|
||||
|
||||
{:cd, ".."}, {[_ | path], sizes} ->
|
||||
{path, sizes}
|
||||
|
||||
{:cd, dir}, {path, sizes} ->
|
||||
{[dir | path], sizes}
|
||||
|
||||
{:file, size, file}, {path, sizes} ->
|
||||
{path, [{[file | path], size} | sizes]}
|
||||
|
||||
_, acc ->
|
||||
acc
|
||||
end)
|
||||
|> elem(1)
|
||||
end
|
||||
|
||||
def get_directory_sizes(file_sizes) do
|
||||
file_sizes
|
||||
|> Enum.reduce(%{}, fn {[_ | path], size}, acc ->
|
||||
path = Enum.reverse(path)
|
||||
update_directory_size(acc, size, path)
|
||||
end)
|
||||
end
|
||||
|
||||
def update_directory_size(sizes, file_size, file_path) do
|
||||
Enum.reduce(file_path, {sizes, []}, fn dir, {sizes, cur_path} ->
|
||||
cur_path = [dir | cur_path]
|
||||
{Map.update(sizes, cur_path, file_size, &(&1 + file_size)), cur_path}
|
||||
end)
|
||||
|> elem(0)
|
||||
end
|
||||
end
|
53
2022/lib/days/day8.ex
Normal file
53
2022/lib/days/day8.ex
Normal file
|
@ -0,0 +1,53 @@
|
|||
defmodule AOC.Day8 do
|
||||
use AOC.Day, day: 8, debug: true
|
||||
|
||||
def parse_input(lines) do
|
||||
Enum.map(lines, fn line ->
|
||||
line
|
||||
|> String.split("", trim: true)
|
||||
|> Enum.map(&String.to_integer/1)
|
||||
end)
|
||||
end
|
||||
|
||||
def part1(rows) do
|
||||
rows = with_index(rows)
|
||||
|
||||
cols = Enum.zip(rows) |> Enum.map(&Tuple.to_list/1)
|
||||
rrows = Enum.map(rows, &Enum.reverse/1)
|
||||
rcols = Enum.map(cols, &Enum.reverse/1)
|
||||
|
||||
[rows, cols, rrows, rcols]
|
||||
|> Enum.map(&count_visible/1)
|
||||
|> Enum.reduce(&MapSet.union/2)
|
||||
|> Enum.count()
|
||||
end
|
||||
|
||||
def part2(rows) do
|
||||
rows
|
||||
end
|
||||
|
||||
def with_index(rows) do
|
||||
Enum.with_index(rows, fn row, y ->
|
||||
Enum.with_index(row, fn el, x ->
|
||||
%{height: el, x: x, y: y}
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
def count_visible(rows) do
|
||||
rows
|
||||
|> Enum.map(&count_visible_row/1)
|
||||
|> Enum.map(&elem(&1, 0))
|
||||
|> Enum.reduce(&MapSet.union/2)
|
||||
end
|
||||
|
||||
def count_visible_row(row) do
|
||||
Enum.reduce(row, {MapSet.new(), -1}, fn
|
||||
%{height: h, x: x, y: y}, {trees, highest} when h > highest ->
|
||||
{MapSet.put(trees, {x, y}), h}
|
||||
|
||||
_, acc ->
|
||||
acc
|
||||
end)
|
||||
end
|
||||
end
|
28
2022/mix.exs
Normal file
28
2022/mix.exs
Normal file
|
@ -0,0 +1,28 @@
|
|||
defmodule Aoc2022.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
def project do
|
||||
[
|
||||
app: :aoc2022,
|
||||
version: "0.1.0",
|
||||
elixir: "~> 1.14",
|
||||
start_permanent: Mix.env() == :prod,
|
||||
deps: deps()
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help compile.app" to learn about applications.
|
||||
def application do
|
||||
[
|
||||
extra_applications: [:logger]
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help deps" to learn about dependencies.
|
||||
defp deps do
|
||||
[
|
||||
# {:dep_from_hexpm, "~> 0.3.0"},
|
||||
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
|
||||
]
|
||||
end
|
||||
end
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# aoc
|
||||
|
||||
Collection of my Advent of Code solutions.
|
Loading…
Reference in a new issue