commit c8754bf04f3274926474b81b7e28dba748a53eb4
parent 17ffe5782313190d2f2eced88436b2504c4e4e03
Author: Louis Burda <quent.burda@gmail.com>
Date: Fri, 5 Nov 2021 17:09:33 +0100
Add day 7
Diffstat:
22 files changed, 1671 insertions(+), 15 deletions(-)
diff --git a/data/helper/template/Makefile b/data/helper/template/Makefile
@@ -9,4 +9,4 @@ clean:
lib:
make -C ../../libs
-main: main.c ../../libs/build/libaoc.so
+main: main.c ../../libs/build/libaoc.a
diff --git a/libs/include/icc.h b/libs/include/icc.h
@@ -39,6 +39,7 @@ struct icc {
int icc_init(struct icc *icc);
void icc_free(struct icc *icc);
+void icc_copy(struct icc *dst, struct icc *src);
int icc_parse_inst(struct icc *icc, const char *str, size_t len);
void icc_step_inst(struct icc *icc);
diff --git a/libs/include/memvec.h b/libs/include/memvec.h
@@ -3,6 +3,8 @@
#include "util.h"
+#define MEMVEC_GET(mv, i, type) (*(type*) memvec_get(mv, i))
+
struct memvec {
void *data;
size_t cap, len, itemsize;
@@ -10,7 +12,9 @@ struct memvec {
int memvec_init(struct memvec *v, size_t cap, size_t itemsize);
void memvec_free(struct memvec *v);
-int memvec_add(struct memvec *v, void *item);
-void* memvec_get(struct memvec *v, size_t index);
+void * memvec_add(struct memvec *v, void *item);
+void * memvec_get(struct memvec *v, size_t index);
void memvec_set(struct memvec *v, size_t index, void *item);
int memvec_in_range(struct memvec *v, size_t index);
+size_t memvec_len(struct memvec *v);
+void memvec_copy(struct memvec *dst, struct memvec *src);
diff --git a/libs/src/icc.c b/libs/src/icc.c
@@ -14,6 +14,16 @@ icc_free(struct icc *icc)
memvec_free(&icc->instructions);
}
+void
+icc_copy(struct icc *dst, struct icc *src)
+{
+ dst->instp = src->instp;
+ dst->in = src->in;
+ dst->out = src->out;
+ dst->status = src->status;
+ memvec_copy(&dst->instructions, &src->instructions);
+}
+
int
icc_parse_inst(struct icc *icc, const char *str, size_t len)
{
@@ -27,7 +37,7 @@ icc_parse_inst(struct icc *icc, const char *str, size_t len)
val = strtoul(line, &endptr, 10);
if (endptr && !memchr(",\n", *endptr, 3))
return FAIL;
- if (memvec_add(&icc->instructions, &val) == FAIL)
+ if (!memvec_add(&icc->instructions, &val))
return FAIL;
line = nline;
} while (nline);
@@ -50,7 +60,7 @@ icc_param_str(struct icc *icc, int param)
void
icc_debug_op(struct icc *icc, const char *opstr, int n)
{
- int i, val, inst;
+ int i, val, val2, inst;
if (!aoc.debug) return;
@@ -66,7 +76,8 @@ icc_debug_op(struct icc *icc, const char *opstr, int n)
fprintf(stderr, "%i", val);
break;
case ICC_PARAM_POS:
- fprintf(stderr, "[%i]", val);
+ icc_get_inst(icc, val, &val2);
+ fprintf(stderr, "[%i]=%i", val, val2);
break;
default:
die("ICC: Unknown parmeter mode\n");
@@ -207,6 +218,13 @@ icc_inst_test_eq(struct icc *icc)
}
void
+icc_inst_halt(struct icc *icc)
+{
+ icc_debug_op(icc, "HALT", 0);
+ icc->status = ICC_HALT;
+}
+
+void
icc_step_inst(struct icc *icc)
{
int inst;
@@ -240,7 +258,7 @@ icc_step_inst(struct icc *icc)
icc_inst_test_eq(icc);
break;
case ICC_INST_HALT:
- icc->status = ICC_HALT;
+ icc_inst_halt(icc);
break;
default:
die("ICC: Unknown instruction: '%i'\n", inst);
@@ -299,7 +317,7 @@ icc_get_dest(struct icc *icc, int param, int *out)
void*
icc_inst_copy(struct icc *icc)
{
- return memdup(icc->instructions.data, icc->instructions.len);
+ return CHKP(memdup(icc->instructions.data, icc->instructions.len));
}
void
diff --git a/libs/src/memvec.c b/libs/src/memvec.c
@@ -3,7 +3,8 @@
int
memvec_init(struct memvec *v, size_t cap, size_t itemsize)
{
- v->cap = cap ? cap : 10 * itemsize;
+ if (!cap) cap = 10;
+ v->cap = cap * itemsize;
v->itemsize = itemsize;
v->len = 0;
v->data = malloc(v->cap);
@@ -15,9 +16,10 @@ void
memvec_free(struct memvec *v)
{
free(v->data);
+ v->data = NULL;
}
-int
+void *
memvec_add(struct memvec *v, void *item)
{
void *tmp;
@@ -25,16 +27,16 @@ memvec_add(struct memvec *v, void *item)
if (v->len == v->cap) {
v->cap *= 2;
tmp = realloc(v->data, v->cap);
- if (!tmp) return FAIL;
+ if (!tmp) return NULL;
v->data = tmp;
}
memcpy(v->data + v->len, item, v->itemsize);
v->len += v->itemsize;
- return OK;
+ return v->data + v->len - v->itemsize;
}
-void*
+void *
memvec_get(struct memvec *v, size_t index)
{
return v->data + v->itemsize * index;
@@ -53,3 +55,19 @@ memvec_in_range(struct memvec *v, size_t index)
{
return index < v->len / v->itemsize;
}
+
+size_t
+memvec_len(struct memvec *v)
+{
+ return v->len / v->itemsize;
+}
+
+void
+memvec_copy(struct memvec *dst, struct memvec *src)
+{
+ dst->itemsize = src->itemsize;
+ dst->len = src->len;
+ dst->cap = src->cap;
+ dst->data = CHKP(malloc(src->cap));
+ memcpy(dst->data, src->data, src->cap);
+}
diff --git a/libs/src/wrapper.c b/libs/src/wrapper.c
@@ -35,8 +35,8 @@ main(int argc, const char **argv)
/* call solution */
aoc.answer = NULL;
aoc.solution = NULL;
- if (aoc.part == 1) part1(&aoc);
- else if (aoc.part == 2) part2(&aoc);
+ if (aoc.part == 1) part1();
+ else if (aoc.part == 2) part2();
else die("Invalid part number\n");
/* check answer if given */
@@ -46,5 +46,6 @@ main(int argc, const char **argv)
die("\nIncorrect solution!\n");
}
+ free(aoc.answer);
free(aoc.input);
}
diff --git a/src/day6/Makefile b/src/day6/Makefile
@@ -0,0 +1,12 @@
+CFLAGS = -g -I ../../libs/include -L ../../libs/build
+LDLIBS = -laoc
+
+all: lib main
+
+clean:
+ rm main
+
+lib:
+ make -C ../../libs
+
+main: main.c ../../libs/build/libaoc.a
diff --git a/src/day6/input b/src/day6/input
@@ -0,0 +1,933 @@
+6WF)DRK
+2PT)PSM
+H42)FN8
+1XR)LQD
+HRK)9KL
+TD6)H8W
+98Z)BJM
+RCQ)LVG
+RWQ)Q7H
+2PS)X94
+NHB)25X
+PXC)W57
+L8L)MVX
+CFK)D8K
+R1B)43T
+PDY)QKX
+FQK)82K
+JJ6)MQJ
+FB6)6V1
+R28)5MZ
+BN2)5HN
+6BQ)JVC
+W57)22C
+MQJ)DL2
+MTC)84R
+RH8)CRN
+Y27)3GN
+CKQ)31C
+R7V)9BK
+ZDY)PDY
+X2Q)Y6S
+Q8B)SAN
+1Z3)PVT
+R87)57R
+KCJ)44X
+PWQ)9CB
+HLC)VYW
+HFP)9XS
+X33)MC3
+RYS)R7R
+JRF)VHW
+79R)FXZ
+YQQ)STV
+8J6)JWX
+Q6D)RV6
+LL9)B4D
+6R1)T1Z
+VK9)42M
+PQP)17N
+K6C)HMK
+GLY)N47
+KDW)CDC
+DQ4)RY5
+SND)FDR
+7YF)1VN
+MDT)B3S
+D3F)98Z
+5VH)MR7
+KNR)2L8
+CJW)QDL
+FWY)14X
+SJD)79R
+COM)BXW
+T2B)FPB
+B2Q)BRJ
+Z21)HYC
+VHW)5XR
+WZ4)2JM
+8HF)342
+PYR)X9Y
+RKF)P43
+S1S)9WT
+2PB)BSB
+QF7)M9T
+HML)HMC
+7J9)7Q6
+8F1)29K
+DH1)NDM
+1YC)PXC
+P32)HR7
+PMX)7Y9
+STV)SLW
+NYY)NF1
+TG9)998
+DMB)DLW
+XGL)1Z3
+GK8)WCS
+YHR)HQC
+9Q5)B6D
+R2T)CM5
+6KC)J5G
+ZM9)L8L
+J8T)F89
+3LN)YOU
+T2T)Z8F
+SCY)FKG
+9W4)195
+QLM)DD7
+4QY)JCB
+WKM)3JF
+693)YM8
+61M)B6Y
+DSP)X2M
+YZ5)DPL
+BC9)3B1
+BDB)JTG
+3TJ)TW1
+W5M)SF6
+K4Q)X56
+5HT)YHX
+YJG)DM5
+68N)X2Q
+2YP)DS5
+BLK)MY3
+6WV)VZ4
+2JQ)ZT8
+G93)V2W
+WN1)SBD
+SS7)DY9
+X56)8HP
+JY1)VS4
+XQ6)L94
+98Z)DMC
+V6S)NWT
+D9L)Y44
+V6G)GVS
+JDW)FZW
+FJT)S38
+L2Z)VPL
+7ZX)DKK
+X2M)8WM
+YVZ)XWS
+HMK)P87
+47M)TD6
+TDZ)21T
+19R)95B
+GD9)Q1L
+9QX)DFR
+Y64)XGN
+CRG)6VY
+V3L)61D
+RJ4)C9Z
+XXG)P53
+VJ8)QTF
+CPQ)2M9
+JRN)8V1
+KMH)K94
+DLW)VQ4
+91W)2QQ
+G4B)RWQ
+4P1)MKS
+K6G)DZ7
+WCS)JR9
+LXM)7RY
+6ZB)K6G
+HMC)622
+Z21)BLK
+Q6N)48V
+66S)MK4
+PDK)6WV
+Y6S)GY1
+2L8)ZMG
+42W)ZN6
+6MS)8TZ
+JBY)STQ
+NSF)3ZM
+5CV)X9N
+K4V)WFL
+J6R)DT8
+N3N)CX4
+PTD)YXT
+F74)4T5
+C51)3FW
+KRW)DS1
+NWT)CKQ
+195)6G6
+HVQ)S18
+Q7H)BKM
+SKN)4D4
+GK2)MLX
+MVX)TG9
+YPK)RHQ
+Y9F)Z8W
+42M)WNL
+84R)6JP
+KNC)NHF
+FZW)PGM
+3FW)HGX
+DBK)FB6
+45T)HLT
+L11)JVN
+HB5)K6C
+QH5)888
+BTJ)J55
+8BT)8ZS
+FR1)XGL
+S87)PS9
+C4K)BN2
+N2Q)18C
+KTF)ZM9
+TN2)B2Q
+DF3)CFK
+9T3)TMR
+P29)3P1
+P1W)7SQ
+4D4)1DJ
+LML)ZJ3
+Q4L)RKF
+MW2)79T
+LVG)CPQ
+BDC)JH5
+DNZ)232
+998)GTM
+YGS)4WH
+GY1)C51
+J55)QBT
+B8Z)34W
+FJ2)H42
+58J)326
+T1Z)DCJ
+1ZH)GLV
+1YC)JG6
+14K)22B
+RY5)QRY
+7V2)2WT
+4GQ)XHV
+ZJ3)TQ8
+2G8)SN3
+FPB)HMN
+SC4)57D
+5LQ)R2T
+LXM)R8Z
+JQ6)G4B
+WNL)GK2
+42M)P75
+LM3)YPK
+ZN6)753
+PN4)835
+C4H)JY1
+LR4)VD5
+PSM)P1W
+VWL)C6C
+G2V)WBC
+85M)R24
+B1V)QW7
+175)2PM
+Y1V)1ZH
+34W)3MJ
+WN7)TTB
+3PV)CQD
+N7Y)9T3
+223)8D4
+RV6)LJ9
+HFP)JRF
+VMT)DNB
+GJP)D3F
+J5G)KMS
+7Q6)ZW2
+YCB)JBY
+XGN)MNL
+888)DSP
+X61)Q6N
+WT5)X12
+SDN)FD1
+2QC)54W
+V98)964
+T7S)YVZ
+MLX)9VZ
+FR8)QH5
+TVQ)2PS
+2PV)FHY
+F4S)MPT
+3J9)JNB
+J6M)GDC
+Q4C)MJN
+9VZ)BZK
+P2P)B69
+WBC)M1W
+D97)HPF
+JKB)9L4
+593)6YJ
+RMB)4Q5
+QZB)38C
+H12)6R1
+MKY)DDD
+HGX)CRG
+P53)WY7
+22B)GMM
+44X)2D8
+DT8)L7H
+3Y2)D3S
+FB8)68N
+3BC)1XR
+4XF)TVQ
+VPL)R7V
+Z4V)JSK
+B3S)FW5
+49Z)YQQ
+99V)D13
+54Q)SS7
+CYC)TXH
+PQ3)78W
+X4M)G9H
+WFL)M99
+ZYY)3Y2
+12Y)PSW
+W38)P29
+H8W)JJ6
+P66)VPH
+GK2)45T
+H5F)FJT
+JDJ)SNV
+14F)96Q
+JG6)TQ4
+2L6)52Q
+SCY)CBJ
+3GN)KNC
+KLM)XPR
+DH1)QZB
+DMB)X7G
+DPL)7SX
+D97)N3N
+GNS)T95
+53P)GW2
+BHR)HNB
+YHX)XQV
+2CR)Y1V
+C9D)Z7P
+FN8)2PT
+6LF)FCQ
+JNL)LQR
+SPV)YCB
+HGX)N83
+VS4)8BT
+5RH)FTX
+HYC)X2J
+69V)J6S
+9XS)PN4
+SD7)5Q3
+2RN)82D
+QRY)FFY
+K2Y)3X2
+79Z)S2Z
+YN2)Y64
+JKB)MDT
+KJ8)NDH
+N57)5VH
+3XK)1Q1
+SCH)FJ6
+17N)GMP
+QR4)7V2
+GLV)GLY
+NHF)ZDY
+QDL)S14
+QF1)BMC
+ZLF)DHN
+3JF)7TR
+MKS)GCY
+964)91R
+9L4)L5G
+RRX)6ZB
+CD7)73M
+3X2)PGC
+HNB)S9Z
+L94)KLM
+8MQ)SCR
+18C)3TJ
+M4Y)BTJ
+BC9)5YR
+TV5)SCY
+2NX)8CC
+C9Z)MTC
+B69)3QP
+HR7)CHJ
+8ZS)JRN
+31C)TJW
+D43)4NH
+93Q)X9X
+T95)DNZ
+LQ5)BC9
+9T5)S2C
+RP8)DH1
+GCY)SD7
+Y44)9B5
+VG5)ZYY
+7RY)V3L
+PWV)Q4L
+NF1)7YF
+DRK)Y8V
+D13)GYG
+TW1)2PB
+ZVZ)2VV
+BRJ)V2V
+9CB)Y7B
+MK4)9CJ
+TMR)6XS
+HWF)GK8
+QTF)S1S
+DFW)6LF
+N3S)WN1
+N2Q)MSW
+CZ5)X61
+FXZ)C4H
+SCQ)MF7
+9LY)3LN
+5MZ)PMX
+CN9)WF9
+FHY)PR8
+S38)NWH
+M29)G5S
+4NH)GZJ
+5YR)54H
+CLX)MNY
+TJD)HQL
+RRZ)4GQ
+YHB)CZ5
+P37)93Q
+YJG)3Q3
+95B)QMF
+CMQ)BLZ
+QD9)45M
+JSK)R28
+YCW)CLX
+8K3)JGB
+N8M)PQW
+P75)1HL
+XBS)T2T
+22C)PVW
+689)6MS
+FFY)RWX
+YHL)2G8
+Y8V)4P1
+Y7B)62Z
+YKJ)JDJ
+1HL)5LQ
+PZ3)B1C
+52Q)7HB
+3Q2)ZV7
+YBF)Z4V
+J95)SDH
+NM6)YBF
+8YN)J3M
+J6S)KNR
+PVT)N4X
+SDH)RFW
+RFW)7Y1
+JCB)52B
+3MJ)H58
+4QF)XHZ
+F62)DFW
+7LJ)KDW
+JHL)C9D
+B4D)Q8B
+342)YGS
+PFR)ZQT
+Z9K)TNS
+8F8)WLB
+94N)DMB
+QBT)RYS
+3VR)KRR
+8D4)ST6
+X9N)2PV
+632)8K3
+MX5)XNP
+57D)Y27
+18D)PQP
+D3F)RJ4
+PLS)PBL
+1JP)YDC
+79V)BG2
+S14)2NX
+4Q5)NCQ
+FTX)555
+2PM)KMH
+HQC)RMB
+9Z9)BNZ
+XHV)Y94
+7ZP)YHR
+BNZ)49Z
+W6D)LX6
+SLS)JL3
+PVW)P9W
+Z1L)HB5
+DS5)G2V
+Z9Q)RV8
+DFR)LPJ
+836)693
+K94)VWL
+HRG)836
+J3V)593
+52N)LPK
+9KL)Y7M
+LX6)F7D
+JL3)511
+L4G)D97
+1RH)Y9F
+NJ2)LML
+GW2)9WV
+8KZ)NRC
+XQV)G6D
+R8Z)QF7
+326)HML
+R7R)8PM
+622)YCW
+WQY)LGS
+NF1)FF3
+5LQ)QF1
+5XR)PTD
+V2V)PFR
+9T5)JQ6
+CBQ)8KZ
+VZ4)HVQ
+TJW)DQT
+9WT)5M6
+CFK)YHL
+JR9)1JP
+Y1K)CF4
+8WS)JPY
+VYC)1D6
+GKK)7J9
+JTG)RRX
+6V1)F74
+1H5)QR4
+SN3)NMG
+MF7)GQ1
+RYK)SCH
+BNZ)9LY
+1DJ)9LP
+L6W)5BK
+FCQ)BFL
+DCJ)3RD
+MXD)8MQ
+RWX)1RH
+NBF)WKM
+K6C)WNH
+H58)L6W
+Y7B)BJH
+PGC)NBF
+96Q)Q2W
+F7D)BSN
+223)Z9K
+K94)VYC
+X9X)7M3
+Q1M)3J9
+QXF)XQ6
+DD7)3Q2
+Q1L)NHB
+79T)LXQ
+8TZ)M29
+21T)Q4C
+B1C)NSF
+8D8)FJ2
+LJH)HGJ
+QS2)PS1
+5KX)Z2L
+C6C)6BQ
+VQ2)2YP
+P87)N8M
+ST5)L4G
+8SP)W5M
+T4H)69V
+9WF)GHS
+FF3)SND
+C5G)GKK
+VQ2)X4M
+P43)8J6
+TD6)384
+66V)CN9
+CX4)T9T
+NCQ)2JQ
+29K)K8K
+RY5)K4Q
+GQ3)T4H
+FNH)P32
+3BC)PRQ
+5HN)4QY
+M1W)BGT
+84R)ST5
+S45)CJW
+CK4)W7G
+SGX)19R
+S2C)7ZX
+DHN)W5Y
+8D9)HM2
+BSB)SPV
+D8K)DFV
+JHL)2L6
+KYP)12Y
+KDN)6X7
+Y44)SQZ
+6G6)SJD
+N7D)QGF
+Q84)8WJ
+F89)LL9
+LYJ)2RN
+25X)Q84
+HM3)53P
+JNB)QD9
+SLW)1DQ
+384)3BC
+PR8)NGV
+49N)7ZP
+65H)LHJ
+6XS)S45
+ZMG)FR1
+X2M)Y86
+QD3)QLM
+P4R)PQ3
+RTK)4M3
+4YW)N7D
+R7V)M4M
+73M)CBF
+DFV)64R
+Z7P)LMK
+HRG)Y1K
+3ZM)BCZ
+WY7)QXP
+DMC)9Q5
+PSW)1H5
+8CC)TV5
+TTB)S88
+BZK)K2Y
+T2B)CBQ
+HJB)Y19
+DQW)KML
+Z8W)8ZL
+PBL)5TK
+1D6)MX5
+3MJ)4YW
+MDT)HJB
+62Z)X33
+DZ7)BDC
+9CJ)FRD
+82D)KDN
+LK7)18D
+9QQ)61M
+Y34)DZG
+J4T)6KC
+971)QD3
+511)GQ3
+MJN)F62
+RNM)NKG
+BGW)KJ8
+DL2)1YH
+ZQT)RYZ
+1YH)ZJ6
+2WT)YYQ
+7HB)DYQ
+3BN)WQY
+2M9)62D
+TSK)YR1
+N7Y)VJ8
+WZ4)FWT
+MNY)YN2
+DYQ)RRZ
+3RG)YT3
+2SM)VK9
+JH5)ZXH
+GYG)K2M
+PKF)V6G
+JGB)S87
+X94)N57
+MSW)L2Z
+X4N)25G
+BLZ)4QF
+JPY)GD9
+WLB)V6S
+KML)2SM
+TXH)9X1
+48V)KTR
+8PM)WZ4
+ZW2)967
+PS9)3BN
+4WH)9T5
+8M1)R6V
+N7M)VWK
+S88)978
+N4X)8KH
+6VY)PLS
+NRC)874
+QGF)QWJ
+NMG)J3V
+B8Z)WPF
+45M)2QC
+KDW)VQ2
+FZW)223
+BXW)QXF
+FRD)PWV
+8HP)4G7
+KDN)YYL
+LHJ)SDN
+P6P)XMC
+W5Y)RYK
+HX8)KW3
+Z2L)H12
+WPF)T2B
+L7H)BGW
+MNL)17B
+GHS)66V
+QKX)XWV
+FW5)W38
+PDK)Y34
+FKG)Q6D
+DQT)YJG
+15G)79V
+4VK)51Y
+BJH)LR4
+48V)6GC
+DM5)Y1F
+CM5)VG5
+KB8)HRK
+5HN)RCQ
+6JP)SDQ
+LGH)NJ2
+L94)N7Y
+4Y2)ZLF
+25G)C4K
+K8K)SLS
+232)ZVZ
+GQ1)58J
+RV8)H5F
+78W)565
+YCF)8D9
+DZG)99V
+N83)CKR
+TN2)ZCX
+NGV)8SP
+BSN)FTN
+LPJ)94N
+3Q3)Q1M
+JVX)971
+54W)LGH
+67Y)P66
+R24)P37
+3QP)QTY
+YHR)FLT
+GMP)NM6
+NDH)632
+PWV)8D8
+LMK)3PV
+ZWJ)KB8
+967)4VK
+3B1)WN7
+XWS)5CV
+YR1)FNH
+565)4PH
+5BK)V98
+W5Y)FR8
+PS1)HX8
+38C)XXG
+XWV)1YC
+M4M)LQ5
+S9Z)49N
+XMC)R1B
+YYL)VC9
+GMM)SCQ
+LXQ)J95
+51Y)RP8
+HLT)XBS
+82K)B8Z
+NR5)7K3
+K2M)67Y
+SF6)W6D
+CF4)85M
+MC3)LXM
+HMN)RNM
+BFL)4XF
+MT2)PM4
+VWK)JKB
+3JF)ZTZ
+QWJ)9QQ
+KRR)TJD
+VYW)Z9Q
+CK4)QS2
+8NQ)NR5
+57R)BHR
+8WM)YHB
+Y86)GNS
+2Y2)Z21
+X12)9QX
+LJ9)YKJ
+3RD)8F1
+7SQ)CK4
+ZXH)3XK
+DDD)5KX
+ZCX)PYR
+GZJ)KXL
+KC5)52N
+PM4)RYP
+14X)ZWJ
+FJ6)175
+17B)689
+HQL)14F
+LQR)DBK
+LGS)4Y2
+2QQ)SGR
+2VV)8F8
+J6S)LM3
+RTP)YZ5
+XDD)14K
+VQ4)MT2
+KMH)KYC
+CKR)RTP
+VD5)MRM
+CM5)KRW
+BG3)XDD
+PGM)J4T
+MY3)JVX
+Z8F)WNP
+BKM)WT5
+FLT)KTF
+N7D)8M1
+Y19)CMQ
+HPF)WDL
+65H)JJP
+2MQ)66S
+4Q5)54Q
+Q2W)ZL4
+QTY)659
+MRM)9Z9
+X2J)SC4
+YWH)RB3
+FTN)LYJ
+LMK)N7M
+SGX)15G
+KW3)FQK
+3VV)JNL
+JWX)R8R
+9Z3)9MB
+BMC)N3S
+W7G)Z1L
+SD7)MW2
+376)RH8
+NWT)JHL
+7CD)N2Z
+KTR)HM3
+1Q1)TDZ
+DY9)2CR
+6YJ)14G
+FWT)JDW
+C2S)C5G
+SNV)J6M
+5TK)YWH
+J3M)8HF
+HM2)GJP
+P9W)7CD
+1VN)SGX
+KMS)RBK
+64R)B1V
+62D)3VV
+61D)F4S
+XPR)SKN
+FJT)N3P
+9WV)D43
+TQ8)BDB
+46H)K4V
+8WJ)MXD
+NDM)9WF
+8ZL)1QJ
+SCR)2MQ
+7Y9)LJH
+VPH)MKY
+YDC)PDK
+4G7)65H
+2JM)NYY
+T9T)VMT
+8M1)TSK
+G5S)X4N
+6FH)KYP
+D98)DQW
+G6D)C2S
+6X7)N2Q
+1QJ)T7S
+ZL4)J8T
+5BT)3VR
+835)KCJ
+YM8)3RG
+Y7M)PWQ
+54W)9W4
+CBF)7LJ
+4T5)8WS
+RHQ)HBK
+CQD)D98
+HGJ)J6R
+JVC)79Z
+FD1)PKF
+VC9)5BT
+C4H)6WF
+D3S)P6P
+MR7)BG3
+R6V)DF3
+9X1)NQ5
+ZTZ)2Y2
+8WM)HFP
+CDC)376
+TQ4)M4Y
+9MB)N1R
+HBK)DQ4
+1DQ)CYC
+WNP)DM8
+CBJ)LK7
+ZT8)FWY
+LQD)PNN
+555)9Z3
+TNS)D9L
+QMF)L11
+FR8)5RH
+WF9)R87
+NKG)5HT
+L5G)91W
+N2Z)YV9
+9B5)CD7
+ZV7)8NQ
+ST6)74T
+ZJ6)CQV
+S18)47M
+74T)8YN
+WNH)TN2
+874)46H
+3VV)PZ3
+Y1F)42W
+MPT)2LP
+FDR)HWF
+X7G)RTK
+52B)P4R
+RYP)G93
+NWH)YCF
+7TR)FB8
+RWQ)6FH
+8F8)HLC
+CRN)P2P
+B6D)KC5
+PNN)HRG
diff --git a/src/day6/main.c b/src/day6/main.c
@@ -0,0 +1,138 @@
+#include "aoc.h"
+#include "memvec.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+struct planet {
+ char *name;
+ struct planet *parent;
+ struct memvec children;
+};
+
+struct memvec planets;
+
+// TODO: implement hashmap to replace array search
+
+struct planet *
+get_planet(const char *name)
+{
+ struct planet *p;
+ int i;
+
+ for (i = 0; i < memvec_len(&planets); i++) {
+ p = MEMVEC_GET(&planets, i, struct planet *);
+ if (!strcmp(p->name, name))
+ return p;
+ }
+
+ return NULL;
+}
+
+struct planet *
+add_planet(const char *name)
+{
+ struct planet *p;
+
+ p = CHKP(malloc(sizeof(struct planet)));
+ p->name = CHKP(strdup(name));
+ p->parent = NULL;
+ ASSERT(memvec_init(&p->children, 3, sizeof(struct planet *)) == OK);
+ CHKP(memvec_add(&planets, &p));
+
+ return p;
+}
+
+void
+init_planets()
+{
+ char *tok, *sep, *next;
+ struct planet *parent, *child;
+
+ memvec_init(&planets, 100, sizeof(struct planet *));
+
+ tok = aoc.input;
+ do {
+ next = strchr(tok, '\n');
+ if (!next) break;
+
+ sep = CHKP(strchr(tok, ')'));
+ *next = *sep = '\0';
+
+ parent = get_planet(tok);
+ if (!parent) parent = add_planet(tok);
+
+ child = get_planet(sep+1);
+ if (!child) child = add_planet(sep+1);
+
+ CHKP(memvec_add(&parent->children, child));
+ ASSERT(child->parent == NULL);
+ child->parent = parent;
+
+ tok = next + 1;
+ } while (next);
+}
+
+void
+free_planets()
+{
+ struct planet *p;
+ int i;
+
+ for (i = 0; i < memvec_len(&planets); i++) {
+ p = MEMVEC_GET(&planets, i, struct planet *);
+ memvec_free(&p->children);
+ free(p->name);
+ free(p);
+ }
+ memvec_free(&planets);
+}
+
+void
+part1(void)
+{
+ struct planet *p;
+ int i, orbits;
+
+ init_planets();
+
+ orbits = 0;
+ for (i = 0; i < memvec_len(&planets); i++) {
+ p = MEMVEC_GET(&planets, i, struct planet *);
+ while (p->parent) {
+ orbits += 1;
+ p = p->parent;
+ }
+ }
+
+ aoc.answer = CHKP(aprintf("%i", orbits));
+ aoc.solution = "119831";
+
+ free_planets();
+}
+
+void
+part2(void)
+{
+ struct planet *p1, *p2, *san, *you;
+ int i, s1, s2;
+
+ init_planets();
+
+ san = CHKP(get_planet("SAN"));
+ you = CHKP(get_planet("YOU"));
+
+ for (s1 = 0, p1 = you; p1; p1 = p1->parent, s1++) {
+ for (s2 = 0, p2 = san; p2; p2 = p2->parent, s2++) {
+ if (!strcmp(p1->name, p2->name))
+ goto exit;
+ }
+ }
+exit:
+
+ aoc.answer = CHKP(aprintf("%i", s1 + s2 - 2));
+ aoc.solution = "322";
+
+ free_planets();
+}
diff --git a/src/day6/part1 b/src/day6/part1
@@ -0,0 +1,71 @@
+--- Day 6: Universal Orbit Map ---
+
+You've landed at the Universal Orbit Map facility on Mercury. Because navigation in space often
+involves transferring between orbits, the orbit maps here are useful for finding efficient routes
+between, for example, you and Santa. You download a map of the local orbits (your puzzle input).
+
+Except for the universal Center of Mass (COM), every object in space is in orbit around exactly one
+other object. An orbit looks roughly like this:
+
+ \
+ \
+ |
+ |
+AAA--> o o <--BBB
+ |
+ |
+ /
+ /
+
+In this diagram, the object BBB is in orbit around AAA. The path that BBB takes around AAA (drawn
+with lines) is only partly shown. In the map data, this orbital relationship is written AAA)BBB,
+which means "BBB is in orbit around AAA".
+
+Before you use your map data to plot a course, you need to make sure it wasn't corrupted during the
+download. To verify maps, the Universal Orbit Map facility uses [1m[37morbit count checksums[0m
+- the total number of [1m[37mdirect orbits[0m (like the one shown above) and [1m[37mindirect
+orbits[0m.
+
+Whenever A orbits B and B orbits C, then A [1m[37mindirectly orbits[0m C. This chain can be any
+number of objects long: if A orbits B, B orbits C, and C orbits D, then A indirectly orbits D.
+For example, suppose you have the following map:
+
+COM)B
+B)C
+C)D
+D)E
+E)F
+B)G
+G)H
+D)I
+E)J
+J)K
+K)L
+
+Visually, the above map of orbits looks like this:
+
+ G - H J - K - L
+ / /
+COM - B - C - D - E - F
+ \
+ I
+
+In this visual representation, when two objects are connected by a line, the one on the right
+directly orbits the one on the left.
+
+Here, we can count the total number of orbits as follows:
+
+
+ - D directly orbits C and indirectly orbits B and COM, a total of 3 orbits.
+
+ - L directly orbits K and indirectly orbits J, E, D, C, B, and COM, a total of 7 orbits.
+
+ - COM orbits nothing.
+
+
+The total number of direct and indirect orbits in this example is [1m[37m42[0m.
+
+[1m[37mWhat is the total number of direct and indirect orbits[0m in your map data?
+
+
+
diff --git a/src/day6/part2 b/src/day6/part2
@@ -0,0 +1,62 @@
+--- Part Two ---
+
+Now, you just need to figure out how many [1m[37morbital transfers[0m you (YOU) need to take to
+get to Santa (SAN).
+
+You start at the object YOU are orbiting; your destination is the object SAN is orbiting. An orbital
+transfer lets you move from any object to an object orbiting or orbited by that object.
+
+For example, suppose you have the following map:
+
+COM)B
+B)C
+C)D
+D)E
+E)F
+B)G
+G)H
+D)I
+E)J
+J)K
+K)L
+K)YOU
+I)SAN
+
+Visually, the above map of orbits looks like this:
+
+ [1m[37mYOU[0m
+ [1m[37m/[0m
+ G - H [1m[37mJ - K[0m - L
+ / [1m[37m/[0m
+COM - B - C - [1m[37mD - E[0m - F
+ [1m[37m\[0m
+ [1m[37mI - SAN[0m
+
+In this example, YOU are in orbit around K, and SAN is in orbit around I. To move from K to I, a
+minimum of 4 orbital transfers are required:
+
+
+ - K to J
+
+ - J to E
+
+ - E to D
+
+ - D to I
+
+
+Afterward, the map of orbits looks like this:
+
+ G - H J - K - L
+ / /
+COM - B - C - D - E - F
+ \
+ I - SAN
+ [1m[37m\[0m
+ [1m[37mYOU[0m
+
+[1m[37mWhat is the minimum number of orbital transfers required[0m to move from the object YOU
+are orbiting to the object SAN is orbiting? (Between the objects they are orbiting -
+[1m[37mnot[0m between YOU and SAN.)
+
+
diff --git a/src/day6/test.input b/src/day6/test.input
@@ -0,0 +1,11 @@
+COM)B
+B)C
+C)D
+D)E
+E)F
+B)G
+G)H
+D)I
+E)J
+J)K
+K)L
diff --git a/src/day6/test.input2 b/src/day6/test.input2
@@ -0,0 +1,13 @@
+COM)B
+B)C
+C)D
+D)E
+E)F
+B)G
+G)H
+D)I
+E)J
+J)K
+K)L
+K)YOU
+I)SAN
diff --git a/src/day7/2 b/src/day7/2
@@ -0,0 +1,35 @@
+#include "aoc.h"
+#include "icc.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+void
+run_amp(int phase, int input, int *out)
+{
+
+}
+
+void
+part1(void)
+{
+ struct icc icc;
+ void *inst;
+
+ ASSERT(icc_init(&icc) == OK);
+ ASSERT(icc_parse_inst(&icc, aoc.input, aoc.input_size) == OK);
+ inst = icc_inst_copy(&icc);
+
+
+ icc_reset(&icc, inst);
+ while (icc.status != ICC_HALT)
+ icc_step_inst(&icc);
+
+ icc_free(&icc);
+}
+
+void
+part2(void)
+{
+
+}
diff --git a/src/day7/Makefile b/src/day7/Makefile
@@ -0,0 +1,12 @@
+CFLAGS = -g -I ../../libs/include -L ../../libs/build
+LDLIBS = -laoc
+
+all: lib main
+
+clean:
+ rm main
+
+lib:
+ make -C ../../libs
+
+main: main.c ../../libs/build/libaoc.a
diff --git a/src/day7/input b/src/day7/input
@@ -0,0 +1 @@
+3,8,1001,8,10,8,105,1,0,0,21,42,67,76,89,110,191,272,353,434,99999,3,9,102,2,9,9,1001,9,2,9,1002,9,2,9,1001,9,2,9,4,9,99,3,9,1001,9,4,9,102,4,9,9,101,3,9,9,1002,9,2,9,1001,9,4,9,4,9,99,3,9,102,5,9,9,4,9,99,3,9,1001,9,3,9,1002,9,3,9,4,9,99,3,9,102,3,9,9,101,2,9,9,1002,9,3,9,101,5,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,99
diff --git a/src/day7/main.c b/src/day7/main.c
@@ -0,0 +1,187 @@
+#include "aoc.h"
+#include "icc.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+void
+run_amp(struct icc *icc, int phase, int input, int *out)
+{
+ int in_cnt, out_cnt;
+
+ in_cnt = out_cnt = 0;
+ while (icc->status != ICC_HALT) {
+ icc_step_inst(icc);
+ switch (icc->status) {
+ case ICC_INPUT:
+ ASSERT(in_cnt <= 1);
+ icc->in = (in_cnt == 0) ? phase : input;
+ in_cnt++;
+ break;
+ case ICC_OUTPUT:
+ ASSERT(out_cnt == 0);
+ *out = icc->out;
+ out_cnt++;
+ break;
+ }
+ }
+}
+
+void
+bf_phase(struct icc *icc, void *inst, int *state,
+ int max_depth, int depth, int in, int *max, int *maxstate)
+{
+ int i, k, out;
+
+ if (depth == max_depth) {
+ debug("SETTING %i%i%i%i%i -> %i\n", state[0], state[1],
+ state[2], state[3], state[4], in);
+ if (*max == 0 || in > *max) {
+ *max = in;
+ memcpy(maxstate, state, sizeof(int) * max_depth);
+ }
+ return;
+ }
+
+ for (i = 0; i < max_depth; i++) {
+ /* dont reuse phase setting */
+ for (k = 0; k < depth; k++)
+ if (state[k] == i) break;
+ if (k != depth) continue;
+
+ state[depth] = i;
+ icc_reset(icc, inst);
+ debug("START AMP %i (%i):\n", depth, i);
+ run_amp(icc, i, in, &out);
+ debug("END AMP %i (%i): %i -> %i\n", depth, i, in, out);
+ bf_phase(icc, inst, state, max_depth, depth + 1, out, max, maxstate);
+ }
+}
+
+int
+run_phase_loop(struct icc *iccs, void *inst, int *state, int n)
+{
+ int i, passes, done;
+ int *ins, out, in_cnt;
+
+ ins = CHKP(malloc(n * sizeof(int)));
+
+ for (i = 0; i < n; i++)
+ icc_reset(&iccs[i], inst);
+
+ ins[0] = 0;
+ passes = done = 0;
+ while (!done) {
+ for (i = 0; i < n; i++) {
+ in_cnt = 0;
+ debug("START AMP %i (%i):\n", i, state[i]);
+ while (iccs[i].status != ICC_HALT) {
+ icc_step_inst(&iccs[i]);
+ switch (iccs[i].status) {
+ case ICC_INPUT:
+ iccs[i].in = (!passes && !in_cnt) ? state[i] : ins[i];
+ in_cnt++;
+ break;
+ case ICC_OUTPUT:
+ ins[(i+1) % n] = iccs[i].out;
+ break;
+ }
+ if (iccs[i].status == ICC_OUTPUT)
+ break;
+ }
+ if (iccs[i].status == ICC_HALT)
+ done = 1;
+ debug("END AMP %i (%i): %i -> %i\n", i,
+ state[i], ins[i], ins[(i+1) % n]);
+ }
+ passes += 1;
+ }
+
+ out = ins[0];
+ free(ins);
+
+ return out;
+}
+
+void
+bf_phase_loop(int *state, int max_depth, int depth,
+ struct icc *iccs, void *inst, int *max, int *maxstate)
+{
+ int i, k, out;
+
+ if (depth == max_depth) {
+ out = run_phase_loop(iccs, inst, state, max_depth);
+ debug("SETTING %i%i%i%i%i -> %i\n", state[0], state[1],
+ state[2], state[3], state[4], out);
+ if (*max == 0 || out > *max) {
+ *max = out;
+ memcpy(maxstate, state, sizeof(int) * max_depth);
+ }
+ return;
+ }
+
+ for (i = 0; i < max_depth; i++) {
+ for (k = 0; k < depth; k++)
+ if (state[k] - 5 == i) break;
+ if (k != depth) continue;
+
+ state[depth] = i + 5;
+ bf_phase_loop(state, max_depth, depth + 1, iccs, inst, max, maxstate);
+ }
+}
+
+// TODO: step inst should give err on fail not die
+// TODO: create better disassembly (showing values in position mode and values received on input)
+// TODO: add icc initializer from instruction memvec
+// TODO: add function to parse input instructions into singe memvec
+// TODO: pad icc debug op output and add operation specific pseudocode
+
+void
+part1(void)
+{
+ struct icc icc;
+ void *inst;
+ int max, state[5], maxstate[5];
+
+ ASSERT(icc_init(&icc) == OK);
+ ASSERT(icc_parse_inst(&icc, aoc.input, aoc.input_size) == OK);
+ inst = icc_inst_copy(&icc);
+
+ max = 0;
+ bf_phase(&icc, inst, state, 5, 0, 0, &max, maxstate);
+
+ debug("\nMAX SETTING: %i%i%i%i%i\n", maxstate[0], maxstate[1],
+ maxstate[2], maxstate[3], maxstate[4]);
+ aoc.answer = CHKP(aprintf("%i", max));
+ aoc.solution = "24625";
+
+ free(inst);
+ icc_free(&icc);
+}
+
+void
+part2(void)
+{
+ struct icc iccs[5];
+ void *inst;
+ int i, max, state[5], maxstate[5];
+
+ ASSERT(icc_init(&iccs[0]) == OK);
+ ASSERT(icc_parse_inst(&iccs[0], aoc.input, aoc.input_size) == OK);
+ inst = icc_inst_copy(&iccs[0]);
+ for (i = 1; i < 5; i++)
+ icc_copy(&iccs[i], &iccs[0]);
+
+ max = 0;
+ bf_phase_loop(state, 5, 0, iccs, inst, &max, maxstate);
+
+ debug("\nMAX SETTING: %i%i%i%i%i\n", maxstate[0], maxstate[1],
+ maxstate[2], maxstate[3], maxstate[4]);
+ aoc.answer = CHKP(aprintf("%i", max));
+ aoc.solution = "36497698";
+
+ free(inst);
+ for (i = 0; i < 5; i++)
+ icc_free(&iccs[i]);
+}
diff --git a/src/day7/part1 b/src/day7/part1
@@ -0,0 +1,81 @@
+--- Day 7: Amplification Circuit ---
+
+Based on the navigational maps, you're going to need to send more power to your ship's thrusters to
+reach Santa in time. To do this, you'll need to configure a series of amplifiers already installed
+on the ship.
+
+There are five amplifiers connected in series; each one receives an input signal and produces an
+output signal. They are connected such that the first amplifier's output leads to the second
+amplifier's input, the second amplifier's output leads to the third amplifier's input, and so on.
+The first amplifier's input value is 0, and the last amplifier's output leads to your ship's
+thrusters.
+
+ O-------O O-------O O-------O O-------O O-------O
+0 ->| Amp A |->| Amp B |->| Amp C |->| Amp D |->| Amp E |-> (to thrusters)
+ O-------O O-------O O-------O O-------O O-------O
+
+The Elves have sent you some [1m[37mAmplifier Controller Software[0m (your puzzle input), a
+program that should run on your existing Intcode computer. Each amplifier will need to run a copy of
+the program.
+
+When a copy of the program starts running on an amplifier, it will first use an input instruction to
+ask the amplifier for its current [1m[37mphase setting[0m (an integer from 0 to 4). Each phase
+setting is used [1m[37mexactly once[0m, but the Elves can't remember which amplifier needs which
+phase setting.
+
+The program will then call another input instruction to get the amplifier's input signal, compute
+the correct output signal, and supply it back to the amplifier with an output instruction. (If the
+amplifier has not yet received an input signal, it waits until one arrives.)
+
+Your job is to [1m[37mfind the largest output signal that can be sent to the thrusters[0m by
+trying every possible combination of phase settings on the amplifiers. Make sure that memory is not
+shared or reused between copies of the program.
+
+For example, suppose you want to try the phase setting sequence 3,1,2,4,0, which would mean setting
+amplifier A to phase setting 3, amplifier B to setting 1, C to 2, D to 4, and E to 0. Then, you
+could determine the output signal that gets sent from amplifier E to the thrusters with the
+following steps:
+
+
+ - Start the copy of the amplifier controller software that will run on amplifier A. At its first
+input instruction, provide it the amplifier's phase setting, 3. At its second input instruction,
+provide it the input signal, 0. After some calculations, it will use an output instruction to
+indicate the amplifier's output signal.
+
+ - Start the software for amplifier B. Provide it the phase setting (1) and then whatever output
+signal was produced from amplifier A. It will then produce a new output signal destined for
+amplifier C.
+
+ - Start the software for amplifier C, provide the phase setting (2) and the value from amplifier B,
+then collect its output signal.
+
+ - Run amplifier D's software, provide the phase setting (4) and input value, and collect its output
+signal.
+
+ - Run amplifier E's software, provide the phase setting (0) and input value, and collect its output
+signal.
+
+
+The final output signal from amplifier E would be sent to the thrusters. However, this phase setting
+sequence may not have been the best one; another sequence might have sent a higher signal to the
+thrusters.
+
+Here are some example programs:
+
+
+ - Max thruster signal [1m[37m43210[0m (from phase setting sequence 4,3,2,1,0):
+3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0
+
+ - Max thruster signal [1m[37m54321[0m (from phase setting sequence 0,1,2,3,4):
+3,23,3,24,1002,24,10,24,1002,23,-1,23,
+101,5,23,23,1,24,23,23,4,23,99,0,0
+
+ - Max thruster signal [1m[37m65210[0m (from phase setting sequence 1,0,4,3,2):
+3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,
+1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0
+
+
+Try every combination of phase settings on the amplifiers. [1m[37mWhat is the highest signal that
+can be sent to the thrusters?[0m
+
+
diff --git a/src/day7/part2 b/src/day7/part2
@@ -0,0 +1,55 @@
+--- Part Two ---
+
+It's no good - in this configuration, the amplifiers can't generate a large enough output signal to
+produce the thrust you'll need. The Elves quickly talk you through rewiring the amplifiers into a
+[1m[37mfeedback loop[0m:
+
+ O-------O O-------O O-------O O-------O O-------O
+0 -+->| Amp A |->| Amp B |->| Amp C |->| Amp D |->| Amp E |-.
+ | O-------O O-------O O-------O O-------O O-------O |
+ | |
+ '--------------------------------------------------------+
+ |
+ v
+ (to thrusters)
+
+Most of the amplifiers are connected as they were before; amplifier A's output is connected to
+amplifier B's input, and so on. [1m[37mHowever,[0m the output from amplifier E is now connected
+into amplifier A's input. This creates the feedback loop: the signal will be sent through the
+amplifiers [1m[37mmany times[0m.
+
+In feedback loop mode, the amplifiers need [1m[37mtotally different phase settings[0m: integers
+from 5 to 9, again each used exactly once. These settings will cause the Amplifier Controller
+Software to repeatedly take input and produce output many times before halting. Provide each
+amplifier its phase setting at its first input instruction; all further input/output instructions
+are for signals.
+
+Don't restart the Amplifier Controller Software on any amplifier during this process. Each one
+should continue receiving and sending signals until it halts.
+
+All signals sent or received in this process will be between pairs of amplifiers except the very
+first signal and the very last signal. To start the process, a 0 signal is sent to amplifier A's
+input [1m[37mexactly once[0m.
+
+Eventually, the software on the amplifiers will halt after they have processed the final loop. When
+this happens, the last output signal from amplifier E is sent to the thrusters. Your job is to
+[1m[37mfind the largest output signal that can be sent to the thrusters[0m using the new phase
+settings and feedback loop arrangement.
+
+Here are some example programs:
+
+
+ - Max thruster signal [1m[37m139629729[0m (from phase setting sequence 9,8,7,6,5):
+3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,
+27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5
+
+ - Max thruster signal [1m[37m18216[0m (from phase setting sequence 9,7,8,5,6):
+3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,
+-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,
+53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10
+
+
+Try every combination of the new phase settings on the amplifier feedback loop. [1m[37mWhat is
+the highest signal that can be sent to the thrusters?[0m
+
+
diff --git a/src/day7/test.input b/src/day7/test.input
@@ -0,0 +1 @@
+3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0
diff --git a/src/day7/test.input2 b/src/day7/test.input2
@@ -0,0 +1 @@
+3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0
diff --git a/src/day7/test.input3 b/src/day7/test.input3
@@ -0,0 +1 @@
+3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5