Skip to content

Instantly share code, notes, and snippets.

@badp
Last active December 20, 2019 15:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save badp/94066e553794458704ef1b2ba4d6e30a to your computer and use it in GitHub Desktop.
Save badp/94066e553794458704ef1b2ba4d6e30a to your computer and use it in GitHub Desktop.
awful code done quick

This AoC2019 gist has commit messages :C

git clone ssh://git@gist.github.com/94066e553794458704ef1b2ba4d6e30a
git log

TOC:

#include <stdio.h>
#include <assert.h>
const int data[] = {50669, 83199, 108957, 102490, 121216, 57848, 76120, 121042, 143774, 106490, 76671, 119551, 109598, 124949, 148026, 119862, 112854, 96289, 73573, 142714, 109875, 126588, 69748, 62766, 104446, 61766, 133199, 118306, 141410, 64420, 129370, 69444, 104178, 109696, 54654, 126517, 138265, 87100, 130934, 138946, 118078, 135109, 137330, 130913, 50681, 53071, 63070, 144616, 64122, 122603, 86612, 144666, 62572, 72247, 79005, 102223, 82585, 54975, 68539, 107964, 148333, 100269, 134101, 115960, 75866, 99371, 56685, 142199, 102107, 84075, 112733, 92180, 131056, 142803, 145495, 70900, 73129, 60764, 77576, 99160, 61897, 78675, 100890, 74787, 131911, 93106, 91267, 142663, 130649, 103857, 81178, 78896, 73745, 84463, 92926, 121715, 74959, 71911, 89102, 53428};
#define fuel(mass) (mass / 3 - 2)
static_assert(fuel(12) == 2, "fuel(12) != 2");
static_assert(fuel(14) == 2, "fuel(14) != 2");
static_assert(fuel(1969) == 654, "fuel(1969) != 654");
static_assert(fuel(100756) == 33583, "fuel(100756) != 33583");
int real_fuel(int mass) {
int total_fuel = fuel(mass);
int addtl_fuel = fuel(total_fuel);
while (addtl_fuel > 0) {
total_fuel += addtl_fuel;
addtl_fuel = fuel(addtl_fuel);
};
return total_fuel;
}
int main() {
int total_fuel = 0;
int stars = sizeof(data) / sizeof(data[0]);
for(int i = 0; i < stars; i++) {
int mass = data[i];
total_fuel += real_fuel(mass);
}
printf("%d", total_fuel);
}
#include <stdio.h>
#include <string.h>
char halt_and_catch_fire = 0;
const int original_tape[] = {1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,19,9,23,1,5,23,27,1,27,9,31,1,6,31,35,2,35,9,39,1,39,6,43,2,9,43,47,1,47,6,51,2,51,9,55,1,5,55,59,2,59,6,63,1,9,63,67,1,67,10,71,1,71,13,75,2,13,75,79,1,6,79,83,2,9,83,87,1,87,6,91,2,10,91,95,2,13,95,99,1,9,99,103,1,5,103,107,2,9,107,111,1,111,5,115,1,115,5,119,1,10,119,123,1,13,123,127,1,2,127,131,1,131,13,0,99,2,14,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
int tape[len_tape];
#define get(idx) (idx <= len_tape? tape[idx] : -1)
void op1(int lop, int rop, int dest) {
tape[dest] = tape[lop] + tape[rop];
}
void op2(int lop, int rop, int dest) {
tape[dest] = tape[lop] * tape[rop];
}
void bug(int what, int lol, int nope) {
halt_and_catch_fire = 1;
printf("well we shouldn't be here");
}
void op99(int lol, int nothing, int matters) {
halt_and_catch_fire = 1;
}
void (*ops[100])(int lop, int rop, int dest) = {*bug, *op1, *op2, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *bug, *op99};
int main() {
for(int i = 0; i < 100; i++) {
for(int j = 0; j < 100; j++) {
memcpy(tape, original_tape, sizeof(original_tape));
tape[1] = i;
tape[2] = j;
int ic = 0;
halt_and_catch_fire = 0;
while(!halt_and_catch_fire) {
int op = get(ic);
int x = get(ic + 1);
int y = get(ic + 2);
int z = get(ic + 3);
(*ops[op])(x, y, z);
ic += 4;
}
// for(int k = 0; k < len_tape; k++) printf("%10d\t", get(k));
if(get(0) == 19690720) {
printf("\n%d %d => %d\n", i, j, get(0));
}
}
}
printf("done!");
}
#!/usr/bin/env swipl
:- initialization(main, main).
wirelatency(0, 0, _, 0).
trace(X, Y, [], Latency, Atom) :- assert(wirelatency(X, Y, Atom, Latency)).
trace(X, Y, ["L1" | Rest], Latency, Atom) :-
Xnew is X-1, Ynew is Y,
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, Atom, LatencyNew)),
trace(Xnew, Ynew, Rest, LatencyNew, Atom).
trace(X, Y, ["R1" | Rest], Latency, Atom) :-
Xnew is X+1, Ynew is Y,
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, Atom, LatencyNew)),
trace(Xnew, Ynew, Rest, LatencyNew, Atom).
trace(X, Y, ["U1" | Rest], Latency, Atom) :-
Xnew is X, Ynew is Y+1,
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, Atom, LatencyNew)),
trace(Xnew, Ynew, Rest, LatencyNew, Atom).
trace(X, Y, ["D1" | Rest], Latency, Atom) :-
Xnew is X, Ynew is Y-1,
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, Atom, LatencyNew)),
trace(Xnew, Ynew, Rest, LatencyNew, Atom).
trace(X, Y, [Step | Rest], Latency, Atom) :-
sub_string(Step, 0, 1, _, "L"),
sub_string(Step, 1, _, 0, LengthString),
number_string(Length, LengthString),
Xnew is X-1, Ynew is Y,
LatencyNew is Latency + 1,
LengthNew is Length - 1,
LengthNew > 0, /* this should not be necessary but prolog keeps trying to try this */
number_string(LengthNew, LengthNewString),
string_concat("L", LengthNewString, NewStep),
/* write(["Rule", "L", "Coords", X, Y, "Step", Step, "Rest", "NewStep", NewStep, "NewCoords", Xnew, Ynew, Rest]), nl, */
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, LatencyNew, Atom)),
trace(Xnew, Ynew, [NewStep | Rest], LatencyNew, Atom).
trace(X, Y, [Step | Rest], Latency, Atom) :-
sub_string(Step, 0, 1, _, "R"),
sub_string(Step, 1, _, 0, LengthString),
number_string(Length, LengthString),
Xnew is X+1, Ynew is Y,
LengthNew is Length - 1,
LengthNew > 0, /* this should not be necessary but prolog keeps trying to try this */
number_string(LengthNew, LengthNewString),
string_concat("R", LengthNewString, NewStep),
/* write(["Rule", "R", "Coords", X, Y, "Step", Step, "Rest", "NewStep", NewStep, "NewCoords", Xnew, Ynew, Rest]), nl, */
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, LatencyNew, Atom)),
trace(Xnew, Ynew, [NewStep | Rest], LatencyNew, Atom).
trace(X, Y, [Step | Rest], Latency, Atom) :-
sub_string(Step, 0, 1, _, "U"),
sub_string(Step, 1, _, 0, LengthString),
number_string(Length, LengthString),
Xnew is X, Ynew is Y+1,
LengthNew is Length - 1,
LengthNew > 0, /* this should not be necessary but prolog keeps trying to try this */
number_string(LengthNew, LengthNewString),
string_concat("U", LengthNewString, NewStep),
/* write(["Rule", "U", "Coords", X, Y, "Step", Step, "Rest", "NewStep", NewStep, "NewCoords", Xnew, Ynew, Rest]), nl, */
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, LatencyNew, Atom)),
trace(Xnew, Ynew, [NewStep | Rest], LatencyNew, Atom).
trace(X, Y, [Step | Rest], Latency, Atom) :-
sub_string(Step, 0, 1, _, "D"),
sub_string(Step, 1, _, 0, LengthString),
number_string(Length, LengthString),
Xnew is X, Ynew is Y-1,
LengthNew is Length - 1,
LengthNew > 0, /* this should not be necessary but prolog keeps trying to try this */
number_string(LengthNew, LengthNewString),
string_concat("D", LengthNewString, NewStep),
/* write(["Rule", "D", "Coords", X, Y, "Step", Step, "Rest", "NewStep", NewStep, "NewCoords", Xnew, Ynew, Rest]), nl, */
LatencyNew is Latency + 1,
assert(wirelatency(Xnew, Ynew, LatencyNew, Atom)),
trace(Xnew, Ynew, [NewStep | Rest], LatencyNew, Atom).
main :-
trace(
0, 0,
["R995","D933","L284","U580","R453","U355","L352","U363","L506","D130","R300","D112","L751","U245","R174","U901","L586","D70","L348","U307","R596","D401","R311","D328","L612","D214","L161","U488","L813","U298","L299","D807","L791","D813","R946","U958","R258","D972","L72","U698","L170","D131","L552","D14","L760","U812","L203","D92","R483","U698","R800","U345","L947","D206","L991","D447","R832","D52","L134","D946","R108","D477","L818","D101","R784","U409","R23","U359","R981","D458","R786","U445","R874","U244","R381","U206","R86","U279","L787","U683","R52","U740","R210","U162","L748","U747","R283","D964","R782","D386","R205","D898","R774","U421","R908","D280","L567","D667","L302","D795","L822","D908","L160","U279","L58","D914","R828","U621","R338","U982","R471","U724","L509","U444","R377","D473","R307","U331","L529","U855","L474","U725","L905","U409","L881","U702","R162","D717","R498","U458","R119","U744","R2","D82","R337","D988","L235","U831","L373","D122","L310","D107","R685","U864","L356","U213","R246","U373","L809","U593","R582","U488","R847","U792","L182","U219","L232","D695","R183","U164","L730","D660","L581","D931","R36","D291","R614","U408","R928","D93","L685","D879","R37","D113","L563","D340","L212","D907","L557","D522","L610","D927","R11","U556","R571","U668","L834","U603","L407","U966","R245","D408","R822","U163","L265","D230","L144","D786","R479","U208","L781","D787","L146","U476","R561","U70","R879","U562","R805","D897","L44","U709","L773","U747","L806","U140","R953","D628","L752","D666","R916","D351","R175","D504","R232","U463","R415","U492","L252","D30","L574","U100","L333","U313","R403","D68","L976","D702","L205","D992","L552","U55","R216","U548","L894","U764","L919","U475","R656","U712","L754","U638","R33","U709","R643","U299","R151","U762","R767","D542","R581","D752","L701","D589","L312","U189","R922","D915","R975","U26","R244","U48","L971","U755","R889","D726","R126","U978","L275","D435","L732","D982","L654","D704","L98","U153","L983","U770","L429","U530","L545","D44","L36","U456","R442","D58","L321","U473","R657","U307","R314"],
0,
left),
trace(
0, 0,
["L999","U880","L754","D995","R105","U651","R762","U451","R612","U424","L216","D210","L946","U57","R685","U185","R234","D768","L927","U592","R545","U770","R456","D118","R22","U371","L721","D937","R144","U173","R337","D17","L948","U720","R617","D588","L57","U258","L979","U232","L473","D451","L829","D85","L985","D333","L492","D749","L972","U188","R214","D108","R247","U379","L218","D490","R451","U582","R674","D881","R725","U404","L916","U137","R745","D969","L206","D480","R634","U672","R897","D184","L768","D766","L529","U317","L909","D74","R529","D31","R483","D906","R961","D535","L937","D751","L564","U478","L439","U556","R385","D590","L518","D991","L232","D358","L962","U242","R856","U66","L847","U146","R196","U515","L892","U18","L535","U343","R430","U77","L967","U956","L64","D510","L29","D305","L954","U186","R624","D693","R354","D243","L145","D622","R456","U904","L233","D940","L82","D83","L726","D993","L338","D793","R340","D823","R147","D595","R296","D388","L106","D362","R114","U808","L496","U614","L809","U911","R480","D29","L802","U900","R920","U952","R237","D383","L480","U362","L761","U949","L920","D82","L511","U365","R657","U465","L256","U124","L810","U43","L668","U146","L847","D245","R937","D778","L995","D316","R423","U515","L626","D788","R453","U98","R886","U821","R749","D365","R915","U980","R322","D114","L556","D921","L551","D397","R232","D485","L842","D455","R940","U913","L196","D239","L221","D200","R438","U71","L979","U527","L86","U959","R768","D557","R553","D709","L838","U191","L916","D703","L687","U34","R463","D809","L3","U335","L231","D212","L674","U177","L51","D557","L939","U390","L28","U53","L653","D182","R329","D449","L563","D476","R258","D299","L142","U847","L38","U322","R294","U320","R314","D257","R622","U59","R501","D677","L880","U589","R599","D245","L851","U369","R262","D63","R722","D253","L546","U578","R909","U678","L63","U256","L237","U798","R465","D420","R797","D452","R548","U875","R523","D527","L467","U49","R726","D840","R882","U97","L398","D621","R38","U952","R196","D597","R627","D721","L441","D710","L18","D679","R218"],
0,
right),
wirelatency(X, Y, LeftLat, left),
wirelatency(X, Y, RightLat, right),
[X,Y] \= [0,0],
BestScore is LeftLat + RightLat,
\+ (
wirelatency(XX, YY, LeftAlt, left),
wirelatency(XX, YY, RightAlt, right),
[XX, YY] \= [X,Y],
[XX, YY] \= [0,0],
Alternative is LeftAlt + RightAlt,
Alternative < BestScore
),
write([X, Y, BestScore]), nl.
const range = [138241, 674034]
function isok(pw) {
pw += '';
return ! pw.match(/9[876543210]|8[76543210]|7[6543210]|6[543210]|5[43210]|4[3210]|3[210]|2[10]|10/) && (pw.match(/(.)\1+/g) || []).filter(x => x.length == 2).length > 0;
}
let count = 0;
for(i = range[0]; i < range[1]; i++) {
if(isok(i)) {
// console.debug(i);
count++;
}
}
console.info(count);
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
char halt_and_catch_fire = 0;
const int original_tape[] = {3,225,1,225,6,6,1100,1,238,225,104,0,101,71,150,224,101,-123,224,224,4,224,102,8,223,223,101,2,224,224,1,224,223,223,2,205,209,224,1001,224,-3403,224,4,224,1002,223,8,223,101,1,224,224,1,223,224,223,1101,55,24,224,1001,224,-79,224,4,224,1002,223,8,223,101,1,224,224,1,223,224,223,1,153,218,224,1001,224,-109,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1002,201,72,224,1001,224,-2088,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,70,29,225,102,5,214,224,101,-250,224,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,1101,12,52,225,1101,60,71,225,1001,123,41,224,1001,224,-111,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1102,78,66,224,1001,224,-5148,224,4,224,1002,223,8,223,1001,224,2,224,1,223,224,223,1101,29,77,225,1102,41,67,225,1102,83,32,225,1101,93,50,225,1102,53,49,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,677,677,224,1002,223,2,223,1005,224,329,101,1,223,223,7,677,677,224,1002,223,2,223,1005,224,344,1001,223,1,223,7,226,677,224,102,2,223,223,1006,224,359,101,1,223,223,1108,226,226,224,1002,223,2,223,1005,224,374,1001,223,1,223,8,226,677,224,1002,223,2,223,1006,224,389,1001,223,1,223,1108,226,677,224,1002,223,2,223,1006,224,404,101,1,223,223,1107,677,226,224,102,2,223,223,1006,224,419,101,1,223,223,1007,677,677,224,1002,223,2,223,1005,224,434,101,1,223,223,7,677,226,224,102,2,223,223,1006,224,449,1001,223,1,223,1008,226,677,224,1002,223,2,223,1006,224,464,101,1,223,223,8,677,677,224,1002,223,2,223,1006,224,479,101,1,223,223,108,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,1107,226,677,224,1002,223,2,223,1006,224,509,101,1,223,223,107,226,226,224,1002,223,2,223,1006,224,524,1001,223,1,223,107,677,677,224,1002,223,2,223,1005,224,539,101,1,223,223,1007,226,226,224,102,2,223,223,1006,224,554,101,1,223,223,108,677,677,224,102,2,223,223,1005,224,569,101,1,223,223,107,677,226,224,102,2,223,223,1005,224,584,101,1,223,223,1008,226,226,224,102,2,223,223,1006,224,599,101,1,223,223,1108,677,226,224,1002,223,2,223,1006,224,614,101,1,223,223,8,677,226,224,102,2,223,223,1005,224,629,1001,223,1,223,1008,677,677,224,102,2,223,223,1006,224,644,101,1,223,223,1007,226,677,224,102,2,223,223,1005,224,659,101,1,223,223,108,226,677,224,102,2,223,223,1006,224,674,101,1,223,223,4,223,99,226};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
int tape[len_tape];
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define opmodeL ((get(*ic) / 100) % 10)
#define opmodeR ((get(*ic) / 1000) % 10)
#define opmodeD ((get(*ic) / 10000) % 10)
vector <int> in;
vector <int> out;
void bug(int *ic, int what, int lol, int nope) {
halt_and_catch_fire = 1;
printf("(ic: %d), well we shouldn't be here (%d, %d, %d, %d)\n", *ic, tape[*ic], what, lol, nope);
printf("tape (from ic %d): %d %d %d %d %d %d %d %d %d [%d] %d %d %d %d\n", *ic-9, get(*ic-9), get(*ic-8), get(*ic-7), get(*ic-6), get(*ic-5), get(*ic-4), get(*ic-3), get(*ic-2), get(*ic-1), get(*ic), get(*ic+1), get(*ic+2), get(*ic+3), get(*ic+4));
}
void op1(int *ic, int lop, int rop, int dest) {
if(opmodeD) bug(ic, lop, rop, dest);
tape[dest] = (opmodeL? lop: tape[lop]) + (opmodeR? rop: tape[rop]);
*ic += 4;
}
void op2(int *ic, int lop, int rop, int dest) {
if(opmodeD) bug(ic, lop, rop, dest);
tape[dest] = (opmodeL? lop: tape[lop]) * (opmodeR? rop: tape[rop]);
*ic += 4;
}
void op3(int *ic, int lop, int _, int __) {
if(opmodeD) bug(ic, lop, _, __);
tape[lop] = in.back();
in.pop_back();
*ic += 2;
}
void op4(int *ic, int lop, int _, int __) {
if(opmodeR) bug(ic, lop, _, __);
if(opmodeD) bug(ic, lop, _, __);
int o = opmodeL? lop: tape[lop];
printf("(ic: %d), op4: %d\n", *ic, o);
out.push_back(o);
if(o != 0) {
printf("(ic: %d), well we shouldn't be here (%d, %d, %d, %d) just printed %d\n", *ic, tape[*ic], lop, _, __, o);
}
*ic += 2;
printf("tape (from ic %d): %d %d %d %d %d %d %d %d %d [%d] %d %d %d %d %d %d %d %d %d %d\n",
*ic-9, get(*ic-9), get(*ic-8), get(*ic-7), get(*ic-6), get(*ic-5), get(*ic-4), get(*ic-3), get(*ic-2), get(*ic-1), get(*ic),
get(*ic+1), get(*ic+2), get(*ic+3), get(*ic+4), get(*ic+5), get(*ic+6), get(*ic+7), get(*ic+8), get(*ic+9), get(*ic+10));
}
void op5(int *ic, int lop, int rop, int _) {
if(opmodeD) bug(ic, lop, rop, _);
if(opmodeL? lop: tape[lop]) {
*ic = opmodeR? rop: tape[rop];
} else {
*ic += 3;
};
}
void op6(int *ic, int lop, int rop, int _) {
if(opmodeD) bug(ic, lop, rop, _);
if(opmodeL? lop: tape[lop]) {
*ic += 3;
} else {
*ic = opmodeR? rop: tape[rop];
};
}
void op7(int *ic, int lop, int rop, int dest) {
if(opmodeD) bug(ic, lop, rop, dest);
int left = opmodeL? lop: tape[lop];
int right = opmodeR? rop: tape[rop];
tape[dest] = (left < right);
*ic += 4;
}
void op8(int *ic, int lop, int rop, int dest) {
if(opmodeD) bug(ic, lop, rop, dest);
int left = opmodeL? lop: tape[lop];
int right = opmodeR? rop: tape[rop];
tape[dest] = (left == right);
*ic += 4;
}
void op99(int *ic, int lol, int _, int __) {
halt_and_catch_fire = 1;
*ic += 1;
}
void (*ops [100])(int*, int, int, int) = {bug, op1, op2, op3, op4, op5, op6, op7, op8, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, op99};
int main() {
memcpy(tape, original_tape, sizeof(original_tape));
in.clear();
in.push_back(5);
int ic = 0;
halt_and_catch_fire = 0;
while(!halt_and_catch_fire) {
int opcode = get(ic);
int op = opcode % 100;
int x = get(ic + 1);
int y = get(ic + 2);
int z = get(ic + 3);
(ops[op])(&ic, x, y, z);
}
printf("Unused in: ");
for(int value: in) {
printf("%d ", value);
}
printf("\nOut: ");
for(int value: out) {
printf("%d ", value);
}
printf("\ndone... out: %lu elements", out.size());
}
#!/usr/bin/env swipl
/* https://www.swi-prolog.org/FAQ/ReadDynamicFromFile.html */
:- use_module(library(error)).
:- dynamic arc/2.
:- initialization(main, main).
:- consult("data6.pro").
main :-
starchart(Starchart),
transitive_closure(Starchart, Data),
edges(Data, List),
length(List, Answer),
write(Answer).
#!/usr/bin/env swipl
/* https://www.swi-prolog.org/FAQ/ReadDynamicFromFile.html */
:- use_module(library(error)).
:- dynamic arc/2.
:- initialization(main, main).
:- consult("data6.pro").
distance(objYOU, 0).
trace(Starchart, From, Distance, [To-From | _], Visited) :-
\+ member(To, Visited),
/* write(["Following", Distance, From, To, Distance]), nl, */
DistanceNew is Distance + 1,
del_edges(Starchart, [To-From], SmallerChart),
edges(SmallerChart, NewEdges),
trace(SmallerChart, To, DistanceNew, NewEdges, [To | Visited]).
trace(Starchart, From, Distance, [From-To | _], Visited) :-
\+ member(To, Visited),
/* write(["Following", Distance, From, To, Distance]), nl, */
DistanceNew is Distance + 1,
del_edges(Starchart, [To-From], SmallerChart),
edges(SmallerChart, NewEdges),
trace(SmallerChart, To, DistanceNew, NewEdges, [To | Visited]).
trace(Starchart, From, Distance, [_| Rest], Visited) :-
/* write(["Branching", Distance, From, To, Distance]), nl, */
trace(Starchart, From, Distance, Rest, Visited).
trace(_, X, Distance, [X-objSAN | _], _):-
/* write(["Found!!!!", Distance]), nl, */
assert(distance(objSAN, Distance)).
trace(_, X, Distance, [objSAN-X | _], _):-
/* write(["Found!!!!", Distance]), nl, */
assert(distance(objSAN, Distance)).
main :-
starchart(Starchart),
edges(Starchart, Edges),
trace(Starchart, objYOU, 0, Edges, []),
distance(objSAN, Best),
\+ (
distance(objSAN, Other),
Other < Best
),
Answer is Best - 1,
write(Answer), nl.
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
const int original_tape[] = {3,8,1001,8,10,8,105,1,0,0,21,42,51,60,77,94,175,256,337,418,99999,3,9,1001,9,4,9,102,5,9,9,1001,9,3,9,102,5,9,9,4,9,99,3,9,102,2,9,9,4,9,99,3,9,1001,9,3,9,4,9,99,3,9,101,4,9,9,1002,9,4,9,101,5,9,9,4,9,99,3,9,1002,9,5,9,101,3,9,9,102,2,9,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,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,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,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,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,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,99,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,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,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,99};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL ((gett(c->ic) / 100) % 10)
#define opmodeR ((gett(c->ic) / 1000) % 10)
#define opmodeD ((gett(c->ic) / 10000) % 10)
class computor {
public:
char name = '*';
int ic = 0;
bool halt = false;
bool catch_fire = false;
bool block = false;
int tape[len_tape];
queue<int> *in;
queue<int> *out;
void run();
computor() {
in = new queue<int>;
out = new queue<int>;
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, int what, int lol, int nope) {
c->catch_fire = true;
int ic = c->ic;
printf("(comp %c, ic: %d), well we shouldn't be here (%d, %d, %d, %d)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %d): %d %d %d %d %d %d %d %d %d [%d] %d %d %d %d\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, int lop, int rop, int dest) { // 1
if(opmodeD) bug(c, lop, rop, dest);
c->tape[dest] = (opmodeL? lop: c->tape[lop]) + (opmodeR? rop: c->tape[rop]);
c->ic += 4;
}
void mul(computor *c, int lop, int rop, int dest) { // 2
if(opmodeD) bug(c, lop, rop, dest);
c->tape[dest] = (opmodeL? lop: c->tape[lop]) * (opmodeR? rop: c->tape[rop]);
c->ic += 4;
}
void in(computor *c, int lop, int _, int __) { // 3
if(opmodeD) bug(c, lop, _, __);
// if you need more data then you have, block
if(c->in->size() == 0) {
// printf("(comp %c, ic: %d), nothing to read, blocking\n", c->name, c->ic);
c->block = true;
return;
}
int in = c->in->front();
c->in->pop();
// printf("(comp %c, ic: %d), read: %d, left to read: %lu\n", c->name, c->ic, in, c->in->size());
c->tape[lop] = in;
c->ic += 2;
}
void out(computor *c, int lop, int _, int __) { // 4
if(opmodeR) bug(c, lop, _, __);
if(opmodeD) bug(c, lop, _, __);
int o = opmodeL? lop: c->tape[lop];
// printf("(comp %c, ic: %d), write: %d\n", c->name, c->ic, o);
c->out->push(o);
c->ic += 2;
/* int ic = c->ic;
printf("tape (from ic %d): %d %d %d %d %d %d %d %d %d [%d] %d %d %d %d %d %d %d %d %d %d\n",
ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic),
gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4), gett(ic+5), gett(ic+6), gett(ic+7), gett(ic+8), gett(ic+9), gett(ic+10)); */
}
void jne(computor *c, int lop, int rop, int _) { // 5
if(opmodeD) bug(c, lop, rop, _);
if(opmodeL? lop: c->tape[lop]) {
c->ic = opmodeR? rop: c->tape[rop];
} else {
c->ic += 3;
};
}
void jeq(computor *c, int lop, int rop, int _) { // 6
if(opmodeD) bug(c, lop, rop, _);
if(opmodeL? lop: c->tape[lop]) {
c->ic += 3;
} else {
c->ic = opmodeR? rop: c->tape[rop];
};
}
void lt (computor *c, int lop, int rop, int dest) { // 7
if(opmodeD) bug(c, lop, rop, dest);
int left = opmodeL? lop: c->tape[lop];
int right = opmodeR? rop: c->tape[rop];
c->tape[dest] = (left < right);
c->ic += 4;
}
void eq(computor *c, int lop, int rop, int dest) { // 8
if(opmodeD) bug(c, lop, rop, dest);
int left = opmodeL? lop: c->tape[lop];
int right = opmodeR? rop: c->tape[rop];
c->tape[dest] = (left == right);
c->ic += 4;
}
void halt(computor *c, int lol, int _, int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, int, int, int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
int opcode = get(ic);
int op = opcode % 100;
int x = get(ic + 1);
int y = get(ic + 2);
int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
int main() {
int bA, bB, bC, bD, bE;
int bResult = 0;
for(int a = 5; a < 10; a++)
for(int b = 5; b < 10; b++)
for(int c = 5; c < 10; c++)
for(int d = 5; d < 10; d++)
for(int e = 5; e < 10; e++)
if(!(a == b || a == c || a == d || a == e || b == c || b == d || b == e || c == d || c == e || d == e)){
computor cA, cB, cC, cD, cE;
cA.name = 'a';
cB.name = 'b';
cC.name = 'c';
cD.name = 'd';
cE.name = 'e';
// I'm leaking a bunch of queues here but oh well
cB.in = cA.out;
cC.in = cB.out;
cD.in = cC.out;
cE.in = cD.out;
cA.in = cE.out;
cA.in->push(a);
cA.in->push(0);
cB.in->push(b);
cC.in->push(c);
cD.in->push(d);
cE.in->push(e);
// printf("%d %d %d %d %d => \n", a, b, c, d, e);
while(!cE.halt) {
if(cA.in->size() == 0) printf("deadlock! cA (ic %d) has nothing to read :C", cA.ic);
cA.run();
if(cA.catch_fire) return -1;
cB.run();
if(cB.catch_fire) return -1;
cC.run();
if(cC.catch_fire) return -1;
cD.run();
if(cD.catch_fire) return -1;
cE.run();
if(cE.catch_fire) return -1;
}
int result = cE.out->front();
if(result > bResult) {
bA = a; bB = b; bC = c; bD = d; bE = e; bResult = result;
}
}
printf("Best: %d %d %d %d %d => %d", bA, bB, bC, bD, bE, bResult);
}
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
const long long int original_tape[] = {1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1102,1,3,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1101,0,0,1020,1102,1,800,1023,1101,0,388,1025,1101,0,31,1012,1102,1,1,1021,1101,22,0,1014,1101,0,30,1002,1101,0,716,1027,1102,32,1,1009,1101,0,38,1017,1102,20,1,1015,1101,33,0,1016,1101,0,35,1007,1101,0,25,1005,1102,28,1,1011,1102,1,36,1008,1101,0,39,1001,1102,1,21,1006,1101,397,0,1024,1102,1,807,1022,1101,0,348,1029,1101,0,23,1003,1101,29,0,1004,1102,1,26,1013,1102,34,1,1018,1102,1,37,1010,1101,0,27,1019,1102,24,1,1000,1101,353,0,1028,1101,0,723,1026,109,14,2101,0,-9,63,1008,63,27,63,1005,63,205,1001,64,1,64,1106,0,207,4,187,1002,64,2,64,109,-17,2108,24,6,63,1005,63,223,1105,1,229,4,213,1001,64,1,64,1002,64,2,64,109,7,2101,0,2,63,1008,63,21,63,1005,63,255,4,235,1001,64,1,64,1106,0,255,1002,64,2,64,109,-7,2108,29,7,63,1005,63,273,4,261,1106,0,277,1001,64,1,64,1002,64,2,64,109,10,1208,-5,31,63,1005,63,293,1105,1,299,4,283,1001,64,1,64,1002,64,2,64,109,2,1207,-1,35,63,1005,63,315,1106,0,321,4,305,1001,64,1,64,1002,64,2,64,109,8,1205,3,333,1106,0,339,4,327,1001,64,1,64,1002,64,2,64,109,11,2106,0,0,4,345,1106,0,357,1001,64,1,64,1002,64,2,64,109,-15,21108,40,40,6,1005,1019,379,4,363,1001,64,1,64,1106,0,379,1002,64,2,64,109,16,2105,1,-5,4,385,1001,64,1,64,1105,1,397,1002,64,2,64,109,-25,2102,1,-1,63,1008,63,26,63,1005,63,421,1001,64,1,64,1106,0,423,4,403,1002,64,2,64,109,-8,1202,9,1,63,1008,63,25,63,1005,63,445,4,429,1105,1,449,1001,64,1,64,1002,64,2,64,109,5,1207,0,40,63,1005,63,467,4,455,1106,0,471,1001,64,1,64,1002,64,2,64,109,-6,2107,24,8,63,1005,63,487,1105,1,493,4,477,1001,64,1,64,1002,64,2,64,109,15,21107,41,40,1,1005,1011,509,1106,0,515,4,499,1001,64,1,64,1002,64,2,64,109,12,1205,-1,529,4,521,1105,1,533,1001,64,1,64,1002,64,2,64,109,-20,2102,1,2,63,1008,63,29,63,1005,63,555,4,539,1105,1,559,1001,64,1,64,1002,64,2,64,109,15,1201,-9,0,63,1008,63,38,63,1005,63,579,1105,1,585,4,565,1001,64,1,64,1002,64,2,64,109,-2,21102,42,1,-3,1008,1012,44,63,1005,63,609,1001,64,1,64,1106,0,611,4,591,1002,64,2,64,109,-21,2107,29,8,63,1005,63,629,4,617,1106,0,633,1001,64,1,64,1002,64,2,64,109,15,1202,0,1,63,1008,63,30,63,1005,63,657,1001,64,1,64,1106,0,659,4,639,1002,64,2,64,109,15,21102,43,1,-8,1008,1016,43,63,1005,63,681,4,665,1105,1,685,1001,64,1,64,1002,64,2,64,109,-10,21107,44,45,-4,1005,1010,707,4,691,1001,64,1,64,1106,0,707,1002,64,2,64,109,11,2106,0,2,1001,64,1,64,1106,0,725,4,713,1002,64,2,64,109,-16,21101,45,0,8,1008,1017,43,63,1005,63,749,1001,64,1,64,1105,1,751,4,731,1002,64,2,64,109,-3,1208,2,36,63,1005,63,773,4,757,1001,64,1,64,1106,0,773,1002,64,2,64,109,18,1206,-4,787,4,779,1105,1,791,1001,64,1,64,1002,64,2,64,109,-8,2105,1,7,1001,64,1,64,1106,0,809,4,797,1002,64,2,64,109,-2,21108,46,44,2,1005,1016,825,1105,1,831,4,815,1001,64,1,64,1002,64,2,64,109,7,21101,47,0,-8,1008,1013,47,63,1005,63,857,4,837,1001,64,1,64,1105,1,857,1002,64,2,64,109,-17,1201,-4,0,63,1008,63,24,63,1005,63,883,4,863,1001,64,1,64,1105,1,883,1002,64,2,64,109,10,1206,7,895,1106,0,901,4,889,1001,64,1,64,4,64,99,21102,1,27,1,21102,1,915,0,1105,1,922,21201,1,24405,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,942,0,0,1106,0,922,22102,1,1,-1,21201,-2,-3,1,21101,0,957,0,1106,0,922,22201,1,-1,-2,1106,0,968,21201,-2,0,-2,109,-3,2106,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
queue<long long int> *in;
queue<long long int> *out;
void run();
computor() {
in = new queue<long long int>;
out = new queue<long long int>;
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
// if you need more data then you have, block
if(c->in->size() == 0) {
// printf("(comp %c, ic: %lld), nothing to read, blocking\n", c->name, c->ic);
c->block = true;
return;
}
long long int in = c->in->front();
c->in->pop();
printf("(comp %c, ic: %lld), read: %lld, into: %lld; left to read: %lu\n", c->name, c->ic, in, to, c->in->size());
c->tape[to] = in;
c->ic += 2;
}
void out(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
// printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->out->push(from);
long long int ic = c->ic;
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",
ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic),
gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4), gett(ic+5), gett(ic+6), gett(ic+7), gett(ic+8), gett(ic+9), gett(ic+10));
c->ic += 2;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
int main() {
computor c;
c.in->push(2);
c.run();
printf("Outs: ");
while(c.out->size()) {
printf("%lld ", c.out->front());
c.out->pop();
}
}
#!/usr/bin/racket
#lang racket
(define (angle xy xxyy)
(let*
; 0 points towards left, range (-pi, pi]
([radians (atan (- (second xy) (second xxyy)) (- (first xy) (first xxyy)))]
; 0 points towards up, range (-3/2 pi, pi/2]
[uprand (- radians (/ pi 2))]
)
; 0 points towards up, range (0, 2 pi]
(if (>= uprand 0)
uprand
(+ uprand (* 2 pi))
)
)
)
(define board #<<EOF
##.##..#.####...#.#.####
##.###..##.#######..##..
..######.###.#.##.######
.#######.####.##.#.###.#
..#...##.#.....#####..##
#..###.#...#..###.#..#..
###..#.##.####.#..##..##
.##.##....###.#..#....#.
########..#####..#######
##..#..##.#..##.#.#.#..#
##.#.##.######.#####....
###.##...#.##...#.######
###...##.####..##..#####
##.#...#.#.....######.##
.#...####..####.##...##.
#.#########..###..#.####
#.##..###.#.######.#####
##..##.##...####.#...##.
###...###.##.####.#.##..
####.#.....###..#.####.#
##.####..##.#.##..##.#.#
#####..#...####..##..#.#
.##.##.##...###.##...###
..###.########.#.###..#.
EOF
)
(define X 24)
(define Y 24)
(define (pos xy)
(+ (first xy) (* (second xy) (+ X 1)))
)
(define (lookup xy)
(string-ref board (pos xy))
)
(define coords
(cartesian-product
(range 0 Y)
(range 0 X)
)
)
(define asteroids
(filter
(lambda (xy)
(char=? #\#
(lookup xy)
)
)
coords))
(define starting-point
(argmax
(lambda (x) (second x))
(map (lambda (xy) `(
,xy
,(length (remove-duplicates (map
(lambda (xxyy)
(angle xy xxyy)
)
(filter
(lambda (xxyy)
(not (equal? xy xxyy))
)
asteroids
)
)))))
asteroids
)
)
)
(write starting-point)
#!/usr/bin/racket
#lang racket
(define (angle xy xxyy)
(let*
; 0 points towards left, range (-pi, pi]
([radians (atan (- (second xy) (second xxyy)) (- (first xy) (first xxyy)))]
; 0 points towards up, range (-3/2 pi, pi/2]
[uprand (- radians (/ pi 2))]
)
; 0 points towards up, range (0, 2 pi]
(if (>= uprand 0)
uprand
(+ uprand (* 2 pi))
)
)
)
(define board #<<EOF
##.##..#.####...#.#.####
##.###..##.#######..##..
..######.###.#.##.######
.#######.####.##.#.###.#
..#...##.#.....#####..##
#..###.#...#..###.#..#..
###..#.##.####.#..##..##
.##.##....###.#..#....#.
########..#####..#######
##..#..##.#..##.#.#.#..#
##.#.##.######.#####....
###.##...#.##...#.######
###...##.####..##..#####
##.#...#.#.....######.##
.#...####..####.##...##.
#.#########..###..#.####
#.##..###.#.######.#####
##..##.##...####.#...##.
###...###.##.####.#.##..
####.#.....###..#.####.#
##.####..##.#.##..##.#.#
#####..#...####..##..#.#
.##.##.##...###.##...###
..###.########.#.###..#.
EOF
)
(define X 24)
(define Y 24)
(define (pos xy)
(+ (first xy) (* (second xy) (+ X 1)))
)
(define (distance xy xxyy)
(let* (
[y (first xy)]
[yy (first xxyy)]
[x (second xy)]
[xx (second xxyy)]
)
(sqrt (+ (expt (- x xx) 2) (expt (- y yy) 2)))
)
)
(define (lookup board xy)
(string-ref board (pos xy))
)
(define (asplode board xy)
(define newboard (string-copy board))
(string-set! newboard (pos xy) #\.)
newboard
)
(define coords
(cartesian-product
(range 0 Y)
(range 0 X)
)
)
(writeln (map (lambda (xy) (lookup board xy)) coords))
(define (asteroids board)
(filter
(lambda (xy)
(char=? #\#
(lookup board xy)
)
)
coords
)
)
(define starting-point
(argmax
(lambda (xy)
(length (remove-duplicates
(map
(lambda (xxyy)
(angle xy xxyy)
)
(filter
(lambda (xxyy)
(not (equal? xy xxyy))
)
(asteroids board)
)
)
))
)
(asteroids board)
)
)
(define (iterate curboard startangle asplosions base)
(define candidates
(filter
(lambda (xy) (equal? (angle base xy) startangle))
(asteroids curboard)
))
(writeln `(,startangle ,asplosions ,base ,(length (asteroids curboard)) ,candidates))
(define next
(argmin (lambda (xy) (distance base xy)) candidates))
(define newboard
(asplode curboard next))
(set! candidates
(filter
(lambda (xy) (> (angle base xy) startangle))
(asteroids newboard)))
(define newangle
(if (equal? (length candidates) 0)
0.0
(apply min (map (lambda (xy) (angle base xy)) candidates))))
(set! asplosions
(+ 1 asplosions))
(if (eq? asplosions 200)
next
(iterate newboard newangle asplosions base))
)
(iterate (asplode board starting-point) 0.0 0 starting-point)
//pipe into less -S and /[.]
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <utility>
using namespace std;
const long long int original_tape[] = {3,8,1005,8,352,1106,0,11,0,0,0,104,1,104,0,3,8,102,-1,8,10,101,1,10,10,4,10,108,1,8,10,4,10,102,1,8,28,1,1003,20,10,2,106,11,10,2,1107,1,10,1,1001,14,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,1002,8,1,67,2,1009,7,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,101,0,8,92,1,105,9,10,1006,0,89,1,108,9,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,1,10,4,10,1002,8,1,126,1,1101,14,10,1,1005,3,10,1006,0,29,1006,0,91,3,8,102,-1,8,10,101,1,10,10,4,10,108,1,8,10,4,10,1002,8,1,161,1,1,6,10,1006,0,65,2,106,13,10,1006,0,36,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,1,10,4,10,102,1,8,198,1,105,15,10,1,1004,0,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,101,0,8,228,2,1006,8,10,2,1001,16,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,0,8,10,4,10,1001,8,0,257,1006,0,19,2,6,10,10,2,4,13,10,2,1002,4,10,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,1,10,4,10,1002,8,1,295,3,8,1002,8,-1,10,101,1,10,10,4,10,108,0,8,10,4,10,101,0,8,316,2,101,6,10,1006,0,84,2,1004,13,10,1,1109,3,10,101,1,9,9,1007,9,1046,10,1005,10,15,99,109,674,104,0,104,1,21101,387365315340,0,1,21102,369,1,0,1105,1,473,21101,666685514536,0,1,21102,380,1,0,1106,0,473,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21102,1,46266346536,1,21102,427,1,0,1105,1,473,21101,235152829659,0,1,21101,438,0,0,1105,1,473,3,10,104,0,104,0,3,10,104,0,104,0,21102,838337188620,1,1,21101,461,0,0,1105,1,473,21102,988753429268,1,1,21102,1,472,0,1106,0,473,99,109,2,22101,0,-1,1,21101,40,0,2,21101,504,0,3,21102,494,1,0,1106,0,537,109,-2,2105,1,0,0,1,0,0,1,109,2,3,10,204,-1,1001,499,500,515,4,0,1001,499,1,499,108,4,499,10,1006,10,531,1101,0,0,499,109,-2,2106,0,0,0,109,4,2101,0,-1,536,1207,-3,0,10,1006,10,554,21102,1,0,-3,21202,-3,1,1,21201,-2,0,2,21102,1,1,3,21101,573,0,0,1105,1,578,109,-4,2105,1,0,109,5,1207,-3,1,10,1006,10,601,2207,-4,-2,10,1006,10,601,21201,-4,0,-4,1105,1,669,22101,0,-4,1,21201,-3,-1,2,21202,-2,2,3,21101,620,0,0,1106,0,578,22102,1,1,-4,21101,0,1,-1,2207,-4,-2,10,1006,10,639,21101,0,0,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,661,22101,0,-1,1,21102,661,1,0,106,0,536,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2106,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
pair<int, int> directions[4] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; // up right down left
#define PANEL_SIZE 80
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
char ship[PANEL_SIZE][PANEL_SIZE] = {0};
char tainted[PANEL_SIZE][PANEL_SIZE] = {0};
pair<int, int> position = {PANEL_SIZE/2, PANEL_SIZE/8};
char directionIdx = 0; // up
void run();
computor() {
memcpy(tape, original_tape, sizeof(original_tape));
};
};
#define declare_op(name) void name(computor*, long long int, long long int, long long int);
declare_op(bug)
declare_op(add)
declare_op(mul)
declare_op(in)
declare_op(out_advance)
declare_op(out_assignment)
declare_op(jne)
declare_op(jeq)
declare_op(lt)
declare_op(eq)
declare_op(bps)
declare_op(halt)
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out_assignment, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->ship[c->position.first][c->position.second];
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in != 1 && in != 0) bug(c, dest, 0, to);
}
void out_assignment(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from != 1 && from != 0) bug(c, lop, 0, from);
// printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
// spray
c->ship[c->position.first][c->position.second] = from;
c->tainted[c->position.first][c->position.second] = 1;
c->ic += 2;
ops[4] = out_advance;
/* long long int ic = c->ic;
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",
ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic),
gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4), gett(ic+5), gett(ic+6), gett(ic+7), gett(ic+8), gett(ic+9), gett(ic+10));
c->ic += 2;*/
}
void out_advance(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from != 1 && from != 0) bug(c, lop, 0, from);
// printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
// turn
c->directionIdx += from == 0? 1: -1;
c->directionIdx &= 3; // -1 % 4 is -1 but -1 & 3 is 3.
// step forward
c->position.first += directions[c->directionIdx].first;
c->position.second += directions[c->directionIdx].second;
c->ic += 2;
ops[4] = out_assignment;
/* long long int ic = c->ic;
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",
ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic),
gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4), gett(ic+5), gett(ic+6), gett(ic+7), gett(ic+8), gett(ic+9), gett(ic+10));
c->ic += 2;*/
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
int main() {
computor c;
c.ship[c.position.first][c.position.second] = 1;
c.run();
int cnt;
for(int i = 0; i < PANEL_SIZE; i++) {
for(int j = 0; j < PANEL_SIZE; j++) {
printf("%c", c.ship[i][j]? '.' : ' ');
cnt += c.tainted[i][j];
}
printf("\n");
}
printf("Tainted: %d\n", cnt);
}
Object subclass: Moon [
| X Y Z XX YY ZZ Xin Yin Zin |
init [
X := 0. XX := 0. Xin := 0.
Y := 0. YY := 0. Yin := 0.
Z := 0. YY := 0. Zin := 0.
]
Moon class >> new [
| moon |
moon := super new.
moon init.
^moon
]
x: xx y: yy z: zz [
X := xx. XX := 0. Xin := xx.
Y := yy. YY := 0. Yin := yy.
Z := zz. ZZ := 0. Zin := zz.
]
x [ ^X ] xx [ ^XX ]
y [ ^Y ] yy [ ^YY ]
z [ ^Z ] zz [ ^ZZ ]
pot [ ^ (X abs) + (Y abs) + (Z abs) ]
kin [ ^ (XX abs) + (YY abs) + (ZZ abs) ]
energy [ ^ (self pot) * (self kin) ]
pull: moon [
(self x > moon x) ifTrue: [ XX := XX -1 ].
(self x < moon x) ifTrue: [ XX := XX +1 ].
(self y > moon y) ifTrue: [ YY := YY -1 ].
(self y < moon y) ifTrue: [ YY := YY +1 ].
(self z > moon z) ifTrue: [ ZZ := ZZ -1 ].
(self z < moon z) ifTrue: [ ZZ := ZZ +1 ].
]
update [
X := X + XX. Y := Y + YY. Z := Z + ZZ.
]
initialX [ ^XX == 0 & Xin == X. ]
initialY [ ^YY == 0 & Yin == Y. ]
initialZ [ ^ZZ == 0 & Zin == Z. ]
]
moonA := Moon new.
moonA x: 1 y: 2 z: -9.
moonB := Moon new.
moonB x: -1 y: -9 z: -4.
moonC := Moon new.
moonC x: 17 y: 6 z: 8.
moonD := Moon new.
moonD x: 12 y: 4 z: 2.
moons := Array with: moonA with: moonB with: moonC with: moonD.
cnt := 0. cntX := 0. cntY := 0. cntZ := 0.
cntX > 0.
cntY > 0.
cntZ > 0.
"moons do: [:each | each inspect.]."
[(cntX > 0) & (cntY > 0) & (cntZ > 0)] whileFalse: [
moons do: [ :left |
moons do: [ :right |
left pull: right.
] ].
moons do: [ :each |
each update.
].
cnt := cnt + 1.
cntX = 0 & moonA initialX & moonB initialX & moonC initialX & moonD initialX ifTrue: [
cntX := cnt.
].
cntY = 0 & moonA initialY & moonB initialY & moonC initialY & moonD initialY ifTrue: [
cntY := cnt.
].
cntZ = 0 & moonA initialZ & moonB initialZ & moonC initialZ & moonD initialZ ifTrue: [
cntZ := cnt.
].
].
((cntX lcm: cntY) lcm: cntZ) printNl.
//pipe into less -S and /[.]
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <utility>
using namespace std;
const long long int original_tape[] = {1,380,379,385,1008,2399,519291,381,1005,381,12,99,109,2400,1102,0,1,383,1101,0,0,382,20101,0,382,1,20102,1,383,2,21101,37,0,0,1106,0,578,4,382,4,383,204,1,1001,382,1,382,1007,382,44,381,1005,381,22,1001,383,1,383,1007,383,20,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1102,1,-1,384,1105,1,119,1007,392,42,381,1006,381,161,1102,1,1,384,20102,1,392,1,21102,18,1,2,21101,0,0,3,21102,138,1,0,1105,1,549,1,392,384,392,20102,1,392,1,21102,1,18,2,21101,3,0,3,21102,1,161,0,1105,1,549,1102,1,0,384,20001,388,390,1,20102,1,389,2,21102,180,1,0,1105,1,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,20102,1,389,2,21102,1,205,0,1106,0,393,1002,390,-1,390,1101,0,1,384,20101,0,388,1,20001,389,391,2,21101,0,228,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,21002,388,1,1,20001,389,391,2,21101,0,253,0,1105,1,393,1002,391,-1,391,1101,0,1,384,1005,384,161,20001,388,390,1,20001,389,391,2,21102,1,279,0,1105,1,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,304,0,0,1105,1,393,1002,390,-1,390,1002,391,-1,391,1102,1,1,384,1005,384,161,20101,0,388,1,21001,389,0,2,21101,0,0,3,21101,338,0,0,1106,0,549,1,388,390,388,1,389,391,389,21001,388,0,1,20102,1,389,2,21102,4,1,3,21102,1,365,0,1106,0,549,1007,389,19,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,193,20,15,1,1,22,109,3,22102,1,-2,1,22102,1,-1,2,21101,0,0,3,21102,414,1,0,1106,0,549,22101,0,-2,1,22102,1,-1,2,21101,429,0,0,1105,1,601,2101,0,1,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,21201,-3,0,-7,109,-8,2105,1,0,109,4,1202,-2,44,566,201,-3,566,566,101,639,566,566,1202,-1,1,0,204,-3,204,-2,204,-1,109,-4,2106,0,0,109,3,1202,-1,44,593,201,-2,593,593,101,639,593,593,21001,0,0,-2,109,-3,2105,1,0,109,3,22102,20,-2,1,22201,1,-1,1,21101,0,443,2,21101,0,386,3,21102,880,1,4,21101,0,630,0,1105,1,456,21201,1,1519,-2,109,-3,2106,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,2,0,0,0,0,0,0,2,0,0,2,0,2,0,2,0,0,2,2,2,2,2,0,2,2,2,2,0,2,2,2,2,0,0,0,0,0,0,1,1,0,0,2,2,0,2,0,0,0,2,2,0,0,2,0,2,2,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,2,0,2,2,2,0,0,0,1,1,0,0,0,2,2,0,2,2,0,0,0,2,0,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,2,2,0,2,0,0,2,0,0,0,0,1,1,0,2,0,0,2,2,2,2,0,2,2,0,2,0,0,2,2,0,0,2,2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,1,1,0,2,2,0,0,2,0,0,0,0,2,0,2,0,0,2,0,2,2,0,2,2,0,0,2,0,0,0,0,0,0,2,2,2,2,0,0,0,2,0,0,0,1,1,0,2,2,2,2,0,0,2,0,2,0,0,2,2,0,0,0,0,0,0,2,2,0,2,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,0,0,0,1,1,0,2,0,2,0,0,0,0,0,0,2,0,2,0,2,2,2,2,0,2,0,2,2,0,2,2,0,2,2,0,0,2,0,0,2,0,0,0,0,0,2,0,1,1,0,0,0,2,0,0,0,2,2,0,0,2,2,0,0,2,0,2,0,0,2,0,2,0,0,0,2,0,0,0,0,0,2,2,2,0,0,2,2,0,2,0,1,1,0,0,0,2,0,0,2,0,2,0,2,2,2,2,0,2,0,2,0,0,0,0,0,0,2,2,0,0,2,0,2,0,0,0,2,2,2,2,0,0,0,0,1,1,0,0,0,0,0,0,2,0,2,0,0,2,2,0,2,0,0,0,2,2,0,0,0,2,0,0,2,0,2,2,0,0,0,0,0,0,0,2,2,2,2,0,1,1,0,0,2,2,0,2,0,2,0,2,0,0,2,0,0,2,2,2,2,0,0,2,0,2,2,2,0,2,2,2,0,0,2,0,0,2,2,2,0,2,0,0,1,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,2,0,2,0,0,0,0,2,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,70,58,29,33,6,46,59,57,27,46,31,1,33,3,13,87,13,93,53,58,97,48,1,76,24,32,17,5,56,47,11,8,83,35,15,60,92,90,87,4,31,29,46,91,13,80,65,89,30,23,63,61,93,96,92,10,69,8,19,57,49,29,51,31,43,12,63,55,20,34,69,73,75,10,58,42,38,18,22,72,53,78,47,96,40,39,19,93,44,60,61,23,31,30,78,67,66,37,1,29,42,78,40,90,55,82,27,33,82,51,81,76,89,34,17,52,83,19,79,62,77,75,36,72,97,20,22,63,69,90,10,51,82,88,16,82,8,2,72,93,70,87,97,85,81,55,93,33,7,40,54,37,58,41,41,93,97,8,16,3,98,73,37,40,98,69,92,56,15,1,8,13,35,27,75,96,50,62,42,63,16,10,86,74,65,69,6,95,57,48,86,46,4,34,2,61,40,18,96,6,55,60,81,62,45,42,15,25,1,85,20,5,5,84,41,63,19,40,89,9,37,67,68,83,37,10,31,28,98,7,81,64,9,87,29,30,42,54,66,54,66,35,94,85,78,29,38,34,37,12,54,39,94,63,46,77,75,53,71,10,63,94,9,66,1,8,19,10,41,16,85,57,55,24,5,95,27,62,39,95,56,30,48,33,78,45,67,48,46,14,10,81,12,62,5,63,12,20,52,63,46,43,8,18,36,37,38,20,57,45,86,82,7,35,95,89,71,9,50,23,42,74,54,40,31,89,75,10,9,20,16,41,89,4,26,5,65,37,91,87,78,3,36,56,34,45,97,87,52,60,80,7,12,92,23,21,28,73,76,71,7,23,92,53,56,33,24,35,60,22,56,36,94,1,36,85,16,38,62,56,50,93,77,26,65,42,65,41,97,84,96,70,56,71,61,58,97,71,37,93,46,21,74,90,87,9,69,3,38,78,81,63,79,4,9,13,20,28,88,1,10,68,57,64,43,62,38,69,50,71,38,23,14,24,35,52,16,95,47,66,6,7,34,35,15,41,4,81,56,72,83,13,69,67,46,17,52,56,69,86,39,36,98,48,65,98,73,6,62,73,17,3,35,40,27,61,69,6,55,38,63,27,5,7,16,40,96,63,70,10,26,3,91,61,94,61,6,60,13,37,65,21,52,28,57,76,52,32,5,77,64,54,12,73,82,50,72,17,33,88,97,86,71,96,24,36,89,84,15,80,11,4,51,44,67,58,62,21,4,38,69,64,26,36,88,35,70,49,24,34,59,65,31,81,35,23,90,56,63,80,49,48,95,59,3,67,53,46,69,45,11,64,64,71,56,79,29,83,43,79,82,76,47,85,65,49,12,45,81,80,98,84,47,4,90,73,85,40,17,44,61,47,66,58,7,45,32,82,45,16,97,30,96,77,39,66,28,47,32,35,77,85,18,14,95,40,89,69,19,95,18,85,74,42,30,80,87,15,57,25,38,39,68,35,5,73,34,3,43,61,72,23,26,81,86,15,1,36,43,65,42,70,16,78,70,72,81,43,20,76,34,73,63,6,42,87,6,66,86,87,69,45,54,11,40,38,17,79,36,85,76,69,9,79,80,67,26,49,85,54,12,63,34,89,12,86,33,63,50,91,18,41,64,98,88,15,83,88,95,22,68,92,59,68,20,82,44,51,11,26,22,87,41,20,76,56,54,58,75,30,65,89,70,30,93,89,28,92,70,12,80,38,59,48,90,30,5,76,5,91,34,67,88,87,77,27,3,82,35,49,27,68,43,21,40,7,62,26,2,48,9,38,95,87,94,93,58,45,48,96,65,17,33,62,45,74,24,93,88,29,93,20,19,48,11,80,88,31,61,30,69,14,3,95,48,4,33,82,38,24,33,88,48,87,67,48,22,34,49,94,78,10,71,9,19,74,74,10,39,28,4,2,96,12,40,26,12,3,10,90,62,37,61,32,86,81,98,45,56,59,47,50,48,86,1,42,96,27,22,40,51,95,23,14,26,17,4,30,17,52,519291};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define PANEL_SIZE 44
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
long long int score = 0;
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
int screen[PANEL_SIZE][PANEL_SIZE] = {0};
pair<int, int> position = {0, 0};
void run();
int (*input_handler)(const computor);
computor() {
memcpy(tape, original_tape, sizeof(original_tape));
};
};
#define declare_op(name) void name(computor*, long long int, long long int, long long int);
declare_op(bug)
declare_op(add)
declare_op(mul)
declare_op(in)
declare_op(out_x)
declare_op(out_y)
declare_op(out_write)
declare_op(jne)
declare_op(jeq)
declare_op(lt)
declare_op(eq)
declare_op(bps)
declare_op(halt)
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out_x, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->input_handler(*c);
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in != 1 && in != 0 && in != -1) bug(c, dest, 0, to);
}
void out_x(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < -1) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->position.first = from;
c->ic += 2;
ops[4] = out_y;
}
void out_y(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < 0) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->position.second = from;
c->ic += 2;
ops[4] = out_write;
}
void out_write(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < 0) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
if(c->position.first == -1 && c->position.second == 0)
c->score = from;
else
c->screen[c->position.first][c->position.second] = from;
c->ic += 2;
ops[4] = out_x;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
char tiles[] = {' ', '#', 'X', '=', 'O'};
int UNBEATABLE_PONG_PLAYA(const computor c) {
// determine where the ball is
int x; int xx;
for(int i = 0; i < PANEL_SIZE; i++) {
for(int j = 0; j < PANEL_SIZE; j++) {
// printf("%c", tiles[c.screen[j][i]]);
if(c.screen[j][i] == 4) { // ball
x = j;
} else if (c.screen[j][i] == 3) { // paddle
xx = j;
};
}
// printf("\n");
}
// track the paddle
int out = (x > xx) - (x < xx);
return out;
}
int main() {
computor c;
c.tape[0] = 2;
c.input_handler = UNBEATABLE_PONG_PLAYA;
c.run();
printf("%lld\n", c.score);
}
use strict; use warnings; use v5.24; use POSIX qw(ceil floor); use List::Util qw(first sum min max); no warnings 'recursion';
# output looks like $res[14] = [
# 'A', {
# 'from' => ['10 ORE'],
# 'to' => '10 A'
# },
# 'C', {
# 'from' => ['7 A', '1 B'],
# 'to' => '1 C'
# }
# ]
my $input = <<EOF;
4 NZGF => 6 WBMZG
20 FWMN, 2 QTMF, 5 FMVDV, 1 CVBPJ, 2 KVJK, 20 XSTBX, 7 NBFS => 5 SHPSF
7 LVQM => 5 NXDHX
1 FNDMP, 1 QZJV, 12 RMTG => 7 JBFW
10 GKVF, 1 NXDHX => 8 NZGF
12 QZJV => 8 RSMC
8 RWTD => 7 NBFS
4 CZGXS, 25 QTMF, 2 PHFQB => 3 BWQN
3 WQZD => 9 CTZKV
2 DCTQ, 18 CTZKV => 4 QLHZW
31 QLHZW, 11 FNDMP => 6 WFDXN
8 RLQC => 2 ZPJS
2 SWSQG, 13 CVBPJ => 9 DWCND
7 PBXB, 6 HKSWM, 4 BDPC, 4 KVJK, 2 ZLGKH, 9 LXFG, 1 ZPJS => 4 SWCWH
6 QZJV => 7 RLQC
3 QZJV, 11 MRQHX, 15 GKVF => 4 FMVDV
3 NXDHX, 1 GKNQL => 3 VMDS
1 VMDS => 2 RHSQ
13 GKNQL, 4 NXDHX, 2 GKVF => 8 MRQHX
4 PVRN => 2 WBSL
2 CVBPJ => 9 PVRN
3 FNDMP => 9 BZKC
180 ORE => 6 FWMN
13 DCTQ, 2 RHSQ => 5 CVBPJ
1 DWCND, 12 BZKC, 2 WBRBV => 6 HTLZ
1 LMGL, 11 XDVL, 7 DWCND => 5 ZLGKH
3 FMFTD => 3 HKSWM
1 FNDMP, 5 RMTG, 3 QLHZW => 9 CZGXS
7 DCTQ => 3 FNDMP
1 SHPSF, 2 SWCWH, 40 WFDXN, 67 WBMZG, 53 WBSL, 2 CQJDJ, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC => 1 FUEL
3 VMDS, 1 BHRZ => 9 DCTQ
22 DCTQ, 4 NZGF => 7 RMTG
29 RWTD, 3 FMFTD => 5 LMGL
12 WBRBV, 13 PDRJ, 36 RSRG => 4 LXFG
1 SWSQG, 2 NLPB => 3 WBRBV
7 HTKLM, 8 CTZKV => 2 RWTD
4 BQXL, 1 FWMN => 9 GKNQL
4 WFDXN => 9 HTKLM
2 XDVL => 5 QTMF
1 PHFQB, 21 LMGL, 2 SWSQG => 7 GMQVW
23 CZGXS, 11 FMVDV => 3 PDRJ
1 DWCND, 1 NPMXR, 1 RSRG, 1 JBFW, 12 VXWKZ, 9 KVJK => 4 CQJDJ
106 ORE => 4 BQXL
4 PHFQB => 8 NPMXR
1 GKNQL => 8 WQZD
6 BDPC => 2 PHFQB
1 DWCND => 7 PBXB
1 RSMC, 1 PDRJ => 8 SWSQG
1 LVQM => 4 BHRZ
7 CVBPJ, 1 SWSQG, 1 NLPB => 2 VXWKZ
1 BHRZ, 1 JBFW => 6 XDVL
12 LMGL, 8 RWTD => 4 XSTBX
4 RSMC => 6 BDPC
1 BHRZ, 5 NXDHX => 3 GKVF
6 FMVDV, 6 VXWKZ, 37 CVBPJ => 5 KVJK
7 NLPB, 3 HTLZ => 4 RSRG
1 PDRJ => 1 FMFTD
6 RHSQ, 1 NZGF => 5 QZJV
127 ORE => 3 LVQM
3 RHSQ, 2 RLQC, 1 WFDXN => 1 NLPB
EOF
my %cookbook = map { my $semiparsed = [m/(.+) => (.+)/]; [split " ", $semiparsed->[1]]->[1], {from => [split ", ", $semiparsed->[0]], to => $semiparsed->[1]} } split "\n", $input;
# starting from the bottom of the tech tree, ORE, find things that only require ORE
# important assumptions that were true of this puzzle:
# - there is only 1 recipe from our inputs to our outputs
# - the network of "needed to build this" relationships between elements is acyclical
# basically, imagine asking graphviz to lay out that network for you
# with FUEL at the TOP and ORE at the bottom
# graphviz will layout the nodes vertically such that no arrow goes upwards
# e.g. it will arrange the 60 elements in 19 tiers, from tier #19 (FUEL) down towards ORE,
# such that no element from a lower tier is produced from elements of a higher tier
# in other words, if we read the graph, top to bottom, left to right, we get
# FUEL SWCWH CQJDJ SHPSF LXFG ZLGKH GMQVW XSTBX RSRG KVJK LMGL HTLZ HKSWM PBXB DWCND FMFTD WBRBV BWQN VXWKZ QTMF SWSQG NBFS PDRJ XDVL JBFW RWTD CZGXS NPMXR PHFQB RMTG NLPB BDPC ZPJS WBSL HTKLM WFDXN BZKC RLQC FMVDV PVRN RSMC QZJV QLHZW FNDMP WBMZG CVBPJ CTZKV RHSQ DCTQ NZGF MRQHX VMDS WQZD GKVF BHRZ NXDHX GKNQL BQXL FWMN LVQM
# (the output of build_techtree), and we know that:
# - once we produce FUEL, we'll never need to do it again, because none of the other
# rules produce fuel:
# 1 FUEL => 1 SHPSF, 2 SWCWH, 40 WFDXN, 67 WBMZG, 53 WBSL, 2 CQJDJ, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC
# (none of these contain, or WILL contain FUEL, because the graph is acyclic)
# - once we produce SWCWH, we'll never need to do it again, because none of the other
# rules produce SWCWH vvvvv
# 1 FUEL => 1 SHPSF, 2 SWCWH , 40 WFDXN, 67 WBMZG, 53 WBSL, 2 CQJDJ, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC
# => 1 SHPSF, 7 PBXB, 6 HKSWM, 4 BDPC, 4 KVJK, 2 ZLGKH, 9 LXFG, 1 ZPJS, 40 WFDXN, 67 WBMZG, 53 WBSL, 2 CQJDJ, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC
# (none of these contain, or WILL contain FUEL or SWCWH, because the graph is acyclic)
# - once we produce CQJDJ, we'll never need to do it again, because none of the other
# rules produce CQJDJ vvvvv
# 1 FUEL => 1 SHPSF, 2 SWCWH , 40 WFDXN, 67 WBMZG, 53 WBSL, 2 CQJDJ, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC
# => 1 SHPSF, 7 PBXB, 6 HKSWM, 4 BDPC, 4 KVJK, 2 ZLGKH, 9 LXFG, 1 ZPJS, 40 WFDXN, 67 WBMZG, 53 WBSL, 1 DWCND, 1 NPMXR, 1 RSRG, 1 JBFW, 12 VXWKZ, 9 KVJK, 41 BWQN, 12 GMQVW, 48 PDRJ, 42 RSMC
# (none of these contain, or WILL contain FUEL or SWCWH or CQJDJ, because the graph is acyclic)
# (note how I produced KVJK twice, but that's fine: once I get to apply that rule, I'll know exactly how much KVJK I'll need)
# - etc. etc.
# basically we just need to apply each of these rules once in this order and we're done.
sub build_techtree {
my %tech_tree = ("ORE" => 0);
my @unclassified = keys %cookbook;
my $level = 0;
while(@unclassified) {
my @next_level; $level++;
for my $candidate (@unclassified) {
my @more_advanced = grep { !defined $tech_tree{$_} } map {s/[0-9]+ //r} $cookbook{$candidate}->{from}->@*;
if(@more_advanced == 0) {
push @next_level, $candidate;
@unclassified = grep {$_ ne $candidate} @unclassified;
}
}
$tech_tree{$_} = $level for @next_level;
}
# use Data::Dumper; say Data::Dumper::Dumper \%tech_tree;
return sort { $tech_tree{$b} <=> $tech_tree{$a} } keys %cookbook
}
my @rule_order = build_techtree;
# say "@rule_order";
sub combine_needs {
my %needs;
for my $need (@_) {
my ($reqd_qty, $target) = split " ", $need;
$needs{$target} += $reqd_qty;
}
my @out;
for my $need (keys %needs) {
push @out, "$needs{$need} $need";
}
return @out;
}
sub make {
my @needs = @_;
for my $rule (@rule_order) {
my $needIdx = first { $needs[$_] =~ /$rule/ } keys @needs;
my $need = $needs[$needIdx];
# say "Need @needs, explanding $need";
my ($reqd_qty) = split " ", $need;
my $recipe = $cookbook{$rule};
my ($qty) = split " ", $recipe->{to};
my $mul = ceil $reqd_qty / $qty;
my $made_qty = $qty * $mul;
# say "Will make $made_qty/$reqd_qty $target need";
my @expansion = map { s/([0-9]+)/$1*$mul/er } $recipe->{from}->@*; # :-}
splice @needs, $needIdx, 1, @expansion; # replace the need with its component parts
push @needs, $reqd_qty - $made_qty . " $rule" if $made_qty < $reqd_qty; # if we didn't make as much as we could've don't forget about the scraps
@needs = combine_needs @needs; # combine needs together
}
return $needs[0];
}
## say make("1 FUEL");
my $one_fuel = make("1 FUEL") =~ s/ ORE//r;
my $goal = 1000000000000;
my $range = {low => 1, high => 2 * floor ($goal / $one_fuel)};
while(1) {
my $guess = floor(($range->{low} + $range->{high}) / 2);
my $requirement = make("$guess FUEL") =~ s/ ORE//r;
# say "$range->{high} - $range->{low} => $requirement";
$range->{low} = $guess if $requirement <= $goal;
$range->{high} = $guess if $requirement > $goal;
last if $range->{high} - $range->{low} == 1;
}
say $range->{low};
// This program only explores and prints out the maze
#include <string.h>
#include <thread>
#include <chrono>
using namespace std;
const long long int original_tape[] = {3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,102,1,1034,1039,1002,1036,1,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1105,1,124,102,1,1034,1039,1002,1036,1,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1106,0,124,1001,1034,-1,1039,1008,1036,0,1041,1002,1035,1,1040,101,0,1038,1043,1002,1037,1,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,1001,1035,0,1040,1001,1038,0,1043,1001,1037,0,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,1,1032,1006,1032,165,1008,1040,5,1032,1006,1032,165,1101,2,0,1044,1106,0,224,2,1041,1043,1032,1006,1032,179,1102,1,1,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,72,1044,1105,1,224,1101,0,0,1044,1105,1,224,1006,1044,247,1001,1039,0,1034,101,0,1040,1035,1001,1041,0,1036,1001,1043,0,1038,1001,1042,0,1037,4,1044,1106,0,0,50,46,95,30,15,91,60,70,74,3,22,60,94,68,47,99,65,61,23,17,82,21,80,87,27,62,53,46,89,98,55,64,15,41,82,13,45,78,18,28,87,17,24,22,81,92,30,70,97,22,85,71,32,73,35,93,78,54,85,45,46,75,51,97,73,85,37,87,29,92,85,75,10,21,79,60,85,31,79,73,7,81,4,77,45,17,82,78,37,85,95,83,17,56,52,85,79,78,32,91,79,37,75,51,46,20,21,16,93,87,22,42,74,87,22,84,20,69,35,97,88,76,78,85,26,64,84,80,38,92,58,87,84,98,38,20,75,78,69,80,47,54,78,95,85,90,24,44,84,74,11,1,92,80,58,12,4,97,31,49,73,9,85,55,84,49,93,82,22,47,75,44,55,83,71,21,52,94,24,79,36,88,5,43,61,40,87,83,28,28,84,83,11,43,90,99,41,87,29,76,48,93,91,58,50,29,90,13,23,6,73,97,45,98,83,93,40,85,79,66,89,5,94,50,81,65,42,81,91,97,53,99,50,88,28,54,33,79,36,31,95,70,89,87,57,94,80,97,82,68,79,38,94,2,88,8,88,45,1,98,28,91,64,85,97,34,95,47,90,70,86,13,38,68,93,74,57,73,89,31,81,34,48,80,92,39,7,83,2,77,54,77,68,86,20,64,86,32,81,6,73,37,59,82,47,86,19,86,45,92,82,56,57,94,54,9,9,76,14,9,85,81,84,42,86,60,68,89,15,75,42,49,93,2,97,83,83,64,87,85,71,73,3,36,94,5,8,25,82,11,86,36,37,93,79,31,92,84,25,90,9,83,68,71,81,28,84,17,88,71,69,87,7,87,56,98,5,66,94,80,83,43,95,92,7,73,90,23,7,11,60,3,89,92,30,95,98,1,94,27,95,68,15,86,42,92,48,8,77,91,52,76,68,41,88,94,83,25,28,75,36,87,56,39,77,68,77,96,44,85,97,14,41,73,97,52,62,99,34,54,78,87,24,92,84,95,64,45,76,11,83,98,32,98,25,76,33,79,11,93,94,46,93,27,46,75,92,43,30,11,52,96,15,8,98,94,47,73,80,54,84,18,92,64,39,92,93,95,77,64,94,28,88,49,73,43,39,82,58,41,87,91,22,32,48,87,39,61,85,74,91,17,92,90,52,78,53,49,28,22,79,51,75,53,89,28,3,81,22,64,19,51,77,34,78,88,36,83,91,40,11,74,75,19,91,27,12,34,93,24,82,90,43,42,94,66,86,85,62,93,12,78,81,57,75,81,63,54,99,97,83,6,94,90,50,66,94,39,83,35,78,76,57,79,45,27,88,53,55,18,97,4,49,89,42,51,74,46,93,87,24,97,58,35,85,89,30,90,4,89,46,91,67,99,91,91,70,24,97,30,48,77,82,46,94,63,90,89,45,82,32,88,25,37,75,85,73,68,9,94,39,68,83,54,22,87,84,42,98,41,87,65,80,54,23,54,17,83,98,17,90,1,96,55,85,63,66,95,78,84,77,73,60,27,94,21,79,90,62,90,85,11,87,83,26,88,61,75,60,47,80,6,36,84,79,99,61,79,12,38,76,17,45,88,83,15,74,66,38,88,23,44,87,77,33,78,56,23,45,52,83,89,71,52,74,17,75,52,80,95,83,28,69,87,57,52,94,80,9,90,63,91,45,85,31,90,47,78,40,74,80,75,11,95,18,97,84,73,63,87,45,74,30,81,16,95,31,93,68,81,9,79,74,94,33,83,66,76,52,80,0,0,21,21,1,10,1,0,0,0,0,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define PANEL_SIZE 42
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
void run();
int (*input_handler)(const computor);
void (*output_handler)(const computor, long long int);
computor() {
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->input_handler(*c);
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in < 1 && in > 4) bug(c, dest, 0, to);
}
void out(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < -1) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->output_handler(*c, from);
c->ic += 2;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
char tiles[] = {'#', '.', '@'};
int directionIdx = 0; // up
char screen[PANEL_SIZE][PANEL_SIZE];
pair<int, int> position = {PANEL_SIZE/2, PANEL_SIZE/2};
pair<int, int> directions[4] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; // up left down right
long long int outputDirs[4] = { 1, 3, 2, 4 }; // north = 1, south = 2, west = 3, east = 4
char directionsChars[4] = { '^', '<', 'v', '>' };
int FEARLESS_ROOMBA(const computor c) {
return outputDirs[directionIdx]; // the roomba's directions are 1-indexed
}
// new strategy: make sure you've always got a wall to your left
// which means:
// - move forward
// - turn left
// - if I hit a wall, turn back right
// - if I hit a corridor, I've already gone down it, so try again and turn left
// in essence: turn left while you can, turn right when you can't.
void PATIENT_SCRIBE(const computor c, long long int discovery) {
if(discovery == 0) {
screen[position.first + directions[directionIdx].first ]
[position.second + directions[directionIdx].second] = tiles[discovery];
directionIdx++; directionIdx &= 3;
} else {
position.first += directions[directionIdx].first;
position.second += directions[directionIdx].second;
screen[position.first][position.second] = tiles[discovery];
directionIdx--; directionIdx &= 3;
};
// printf("at %d/%d going %d/%d, found a %lld\n", position.first, position.second, directions[directionIdx].first, directions[directionIdx].second, discovery);
// We're done when we know what lies left right up and down from every corridor tile.
bool done = true;
for(int i = 0; i < PANEL_SIZE; i++) {
for(int j = 0; j < PANEL_SIZE; j++) {
if(screen[i ][j ] == '.' && (
screen[i-1][j ] == ' ' ||
screen[i+1][j ] == ' ' ||
screen[i ][j-1] == ' ' ||
screen[i ][j+1] == ' ')) {
done = false;
}
}
}
// at which point we dump out the maze, also marking the starting point.
if(done) {
for(int i = 0; i < PANEL_SIZE; i++) {
for(int j = 0; j < PANEL_SIZE; j++) {
if(i == PANEL_SIZE/2 && j == PANEL_SIZE/2)
printf("X");
else
printf("%c", screen[i][j]);
}
printf("\n");
}
directionIdx = -1; // halt
}
}
int main() {
computor c;
memset(screen, ' ', sizeof(screen));
screen[position.first][position.second] = '.';
c.input_handler = FEARLESS_ROOMBA;
c.output_handler = PATIENT_SCRIBE;
c.run();
}
// This calculates the answer for the first puzzle from the maze explored by 15a.cpp
#include <string>
#include <string.h>
#include <queue>
using namespace std;
string in =
" ##### ######### ####### ##### ####### # "
"#.....#.........#.......#.....#.......#.#"
"#.###.#.###.###.#.#.#####.#.###.#.###.#.#"
"#.#...#...#.#.....#.#.....#.....#...#.#.#"
"#.#.#.###.#.#.#####.#.########## ##.#.#.#"
"#@#.#.#...#.#.#...#.#.#.........#...#.#.#"
" ##.#.#.###.###.#.###.#####.#.###.###.#.#"
"#...#.#...#.....#...#.....#.#...#...#...#"
"#.#######.#########.#####.#####.###.###.#"
"#.#.........#.....#...#.#.#.....#...#...#"
"#.#.#########.###.#.#.#.#.#.#.###.###.## "
"#.......#...#...#...#...#.#.#.#...#.....#"
" ########.#.#.#.#########.#.#.#.######## "
"#...#.....#.#.#...........#.#.#.........#"
"#.#.#.#####.#############.#.#.#########.#"
"#.#...#.#...#...........#.#.#.........#.#"
"#.#####.#.###.#########.#.#.#.#########.#"
"#.#...#...#.....#.#.....#...#.#.........#"
"#.#.#.#.#######.#.#.#########.#.###.#### "
"#...#.#.......#.#.#.........#.#.#...#...#"
"#.###.#######.#.#.#.#######.###.#####.#.#"
"#...#.#.......#.#...#X#...#...#.#.....#.#"
"#.###.#######.#.#.###.#.#####.#.#.#####.#"
"#.#...#.....#...#...#.#.........#.#...#v#"
" ##.###.###.#######.#.###########.#.###.#"
"#...#...#.#.......#.#.........#...#...#.#"
"#.#.#.###.#######.###########.#.###.#.#.#"
"#.#.#.#.......#.#.#.......#.#...#...#.#.#"
"#.###.#####.#.#.#.#.###.#.#.#####.###.#.#"
"#.....#.....#.#.#...#...#...#.......#.#.#"
"#.#####.#####.#.#####.#######.#######.#.#"
"#.#...#.....#.#.....#.........#...#...#.#"
"#.#.#.#.###.#.#####.#############.#.###.#"
"#...#.#.#...#...#.....#...........#.....#"
" ####.#.#.## ##.#.###.#########.#.###### "
"#.#...#.#...#.#...#.#.......#...#.....#.#"
"#.#.#### ##.#.#####.#######.#.## ####.#.#"
"#.#.....#...#.#.....#.......#...#...#.#.#"
"#.#####.#.###.#.#.###.#########.#.###.#.#"
"#.........#.....#...............#.......#"
" ######### ##### ############### ####### "
;
#define PANEL_SIZE 41
char maze[PANEL_SIZE][PANEL_SIZE];
void load_maze() {
int offset = 0;
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
maze[i][j] = in[offset++];
}
}
}
int main() {
int distance;
queue<pair<int, int>> marked;
memset(maze, ' ', sizeof(maze));
load_maze();
for(distance = 1; distance < PANEL_SIZE*PANEL_SIZE; distance++) {
printf("%d\n", distance);
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
if(maze[i ][j ] != '#' && maze[i ][j ] != 'X' && (
maze[i-1][j ] == 'X' ||
maze[i+1][j ] == 'X' ||
maze[i ][j+1] == 'X' ||
maze[i ][j-1] == 'X')) {
// if we have found our objective, we're done
if(maze[i][j] == '@') {
goto DONE;
}
// else mark this cell without affecting this current pass
maze[i][j] = 'x';
marked.push({i,j});
}
}
}
// upgrade markings from this turn to real markings
while(!marked.empty()) {
pair<int,int> position = marked.front();
maze[position.first][position.second] = 'X';
marked.pop();
}
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
printf("%c", maze[i][j]);
}
printf("\n");
}
}
DONE: printf("%d\n", distance);
}
// This calculates the answer for the second puzzle from the maze explored by 15a.cpp
#include <string>
#include <string.h>
#include <queue>
using namespace std;
string in =
" ##### ######### ####### ##### ####### # "
"#.....#.........#.......#.....#.......#.#"
"#.###.#.###.###.#.#.#####.#.###.#.###.#.#"
"#.#...#...#.#.....#.#.....#.....#...#.#.#"
"#.#.#.###.#.#.#####.#.########## ##.#.#.#"
"#@#.#.#...#.#.#...#.#.#.........#...#.#.#"
" ##.#.#.###.###.#.###.#####.#.###.###.#.#"
"#...#.#...#.....#...#.....#.#...#...#...#"
"#.#######.#########.#####.#####.###.###.#"
"#.#.........#.....#...#.#.#.....#...#...#"
"#.#.#########.###.#.#.#.#.#.#.###.###.## "
"#.......#...#...#...#...#.#.#.#...#.....#"
" ########.#.#.#.#########.#.#.#.######## "
"#...#.....#.#.#...........#.#.#.........#"
"#.#.#.#####.#############.#.#.#########.#"
"#.#...#.#...#...........#.#.#.........#.#"
"#.#####.#.###.#########.#.#.#.#########.#"
"#.#...#...#.....#.#.....#...#.#.........#"
"#.#.#.#.#######.#.#.#########.#.###.#### "
"#...#.#.......#.#.#.........#.#.#...#...#"
"#.###.#######.#.#.#.#######.###.#####.#.#"
"#...#.#.......#.#...#X#...#...#.#.....#.#"
"#.###.#######.#.#.###.#.#####.#.#.#####.#"
"#.#...#.....#...#...#.#.........#.#...#v#"
" ##.###.###.#######.#.###########.#.###.#"
"#...#...#.#.......#.#.........#...#...#.#"
"#.#.#.###.#######.###########.#.###.#.#.#"
"#.#.#.#.......#.#.#.......#.#...#...#.#.#"
"#.###.#####.#.#.#.#.###.#.#.#####.###.#.#"
"#.....#.....#.#.#...#...#...#.......#.#.#"
"#.#####.#####.#.#####.#######.#######.#.#"
"#.#...#.....#.#.....#.........#...#...#.#"
"#.#.#.#.###.#.#####.#############.#.###.#"
"#...#.#.#...#...#.....#...........#.....#"
" ####.#.#.## ##.#.###.#########.#.###### "
"#.#...#.#...#.#...#.#.......#...#.....#.#"
"#.#.#### ##.#.#####.#######.#.## ####.#.#"
"#.#.....#...#.#.....#.......#...#...#.#.#"
"#.#####.#.###.#.#.###.#########.#.###.#.#"
"#.........#.....#...............#.......#"
" ######### ##### ############### ####### "
;
#define PANEL_SIZE 41
char maze[PANEL_SIZE][PANEL_SIZE];
void load_maze() {
int offset = 0;
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
maze[i][j] = in[offset++];
}
}
}
int main() {
int distance;
queue<pair<int, int>> marked;
memset(maze, ' ', sizeof(maze));
load_maze();
for(distance = 1; distance < PANEL_SIZE*PANEL_SIZE; distance++) {
printf("%d\n", distance);
bool no_oxygen = false;
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
if(maze[i ][j ] != '#' && maze[i ][j ] != '@' && (
maze[i-1][j ] == '@' ||
maze[i+1][j ] == '@' ||
maze[i ][j+1] == '@' ||
maze[i ][j-1] == '@')) {
// else mark this cell without affecting this current pass
maze[i][j] = 'o';
marked.push({i,j});
}
if(maze[i][j] == '.') no_oxygen = true;
}
}
// upgrade markings from this turn to real markings
while(!marked.empty()) {
pair<int,int> position = marked.front();
maze[position.first][position.second] = '@';
marked.pop();
}
for(int i=0; i < PANEL_SIZE; i++) {
for(int j=0; j < PANEL_SIZE; j++) {
printf("%c", maze[i][j]);
}
printf("\n");
}
if(!no_oxygen) break;
}
printf("%d\n", distance);
}
#!/usr/bin/lein exec
; 1. install Leiningen
; 2. add {:user {:plugins [[lein-exec "0.3.7"]]}} to ~/.lein/profiles.clj
(def input '(5 9 7 7 3 4 1 9 7 9 4 6 3 1 5 6 0 4 1 2 8 8 6 7 4 6 5 5 0 0 4 9 2 1 0 7 1 4 8 5 4 1 0 7 0 6 6 0 2 8 0 8 1 0 3 2 0 9 6 5 9 1 7 5 9 5 7 5 1 4 5 6 8 0 2 9 4 9 9 5 7 7 0 7 4 1 2 0 4 9 5 5 1 8 3 3 9 5 6 4 0 1 0 3 5 2 7 3 7 1 8 0 1 2 2 5 7 9 5 3 6 4 3 6 3 4 1 1 4 5 5 1 1 3 2 3 6 6 8 3 1 6 8 0 8 8 7 5 0 6 3 1 4 4 2 9 9 3 1 2 3 0 5 3 9 0 9 3 5 8 2 5 2 4 4 0 3 3 9 8 5 9 0 9 2 4 3 1 8 4 4 6 4 1 6 0 0 0 9 2 7 3 6 0 0 6 7 5 8 9 5 4 4 2 2 0 9 7 2 4 4 4 8 6 9 2 0 9 4 5 1 8 2 4 8 3 1 5 9 0 2 3 8 2 0 5 3 8 6 4 5 7 1 7 6 1 1 0 5 1 7 7 0 5 0 9 3 1 4 1 5 9 8 9 5 2 2 0 5 2 9 0 9 7 3 2 2 7 2 3 2 6 1 3 9 1 6 2 7 6 8 6 9 9 7 4 0 3 7 8 3 0 4 3 7 1 0 2 1 3 6 5 5 0 7 4 1 0 8 4 5 1 6 4 6 6 8 5 5 5 8 0 6 4 3 1 7 4 6 9 0 9 5 2 9 5 3 0 3 3 2 0 6 2 2 8 8 3 6 9 1 2 6 6 3 0 7 8 6 5 8 0 9 4 8 1 5 6 6 2 1 4 5 2 4 6 8 6 4 2 2 8 3 4 8 2 4 9 3 0 4 1 4 7 3 0 8 8 6 6 9 7 2 3 7 1 6 1 6 9 7 7 3 1 3 3 9 7 5 7 6 5 5 4 8 5 3 1 2 5 6 8 7 9 3 5 3 1 2 0 2 9 8 8 5 2 5 9 6 3 4 9 4 1 1 9 2 3 2 3 5 1 2 6 6 9 0 8 4 0 5 7 0 5 6 3 4 2 4 4 4 9 8 0 9 6 6 6 0 0 5 7 0 2 1 1 0 1 7 3 8 7 0 6 4 5 3 7 3 5 0 2 5 0 6 0 2 2 5 8 1 4 1 3 3 1 6 6 4 9 1 9 8 9 5 8 4 6 1 6 9 4 8 8 7 6 8 7 9 3 8 3 1 9 8 0 2 1 3 3 6 4 8 4 6 2 9 3 8 1 8 8 8 9 3 4 6 0 0 3 8 3 9 5 7 0 1 9 6 0 7 8 0 7 9 9 5 2 7 8 8 9 9 2 9 3 2 5 4 1 4 3 5 2 3 7 0 2 0 0 0 5 7 6 8 9 7 3 5 8 ))
(def base-pattern '(0 1 0 -1))
(defn digit-pattern [nth]
(rest
(cycle
(flatten [
(repeat (+ 1 nth) 0)
(repeat (+ 1 nth) 1)
(repeat (+ 1 nth) 0)
(repeat (+ 1 nth) -1)
])
)
)
)
(defn mul [pair] (mod (Math/abs (* (first pair) (second pair))) 10))
(map mul (map vector input (digit-pattern 2)))
(defn next-phase [input]
(pmap
(fn [nth]
(mod
(Math/abs
(apply +
(map
(fn [v] (apply * v))
(map vector
input
(digit-pattern nth)))))
10))
(range (count input))))
(println (take 8 (nth (iterate next-phase input) 100)))
#!/usr/bin/lein exec
; 1. install Leiningen
; 2. add {:user {:plugins [[lein-exec "0.3.7"]]}} to ~/.lein/profiles.clj
(def input '(5 9 7 7 3 4 1 9 7 9 4 6 3 1 5 6 0 4 1 2 8 8 6 7 4 6 5 5 0 0 4 9 2 1 0 7 1 4 8 5 4 1 0 7 0 6 6 0 2 8 0 8 1 0 3 2 0 9 6 5 9 1 7 5 9 5 7 5 1 4 5 6 8 0 2 9 4 9 9 5 7 7 0 7 4 1 2 0 4 9 5 5 1 8 3 3 9 5 6 4 0 1 0 3 5 2 7 3 7 1 8 0 1 2 2 5 7 9 5 3 6 4 3 6 3 4 1 1 4 5 5 1 1 3 2 3 6 6 8 3 1 6 8 0 8 8 7 5 0 6 3 1 4 4 2 9 9 3 1 2 3 0 5 3 9 0 9 3 5 8 2 5 2 4 4 0 3 3 9 8 5 9 0 9 2 4 3 1 8 4 4 6 4 1 6 0 0 0 9 2 7 3 6 0 0 6 7 5 8 9 5 4 4 2 2 0 9 7 2 4 4 4 8 6 9 2 0 9 4 5 1 8 2 4 8 3 1 5 9 0 2 3 8 2 0 5 3 8 6 4 5 7 1 7 6 1 1 0 5 1 7 7 0 5 0 9 3 1 4 1 5 9 8 9 5 2 2 0 5 2 9 0 9 7 3 2 2 7 2 3 2 6 1 3 9 1 6 2 7 6 8 6 9 9 7 4 0 3 7 8 3 0 4 3 7 1 0 2 1 3 6 5 5 0 7 4 1 0 8 4 5 1 6 4 6 6 8 5 5 5 8 0 6 4 3 1 7 4 6 9 0 9 5 2 9 5 3 0 3 3 2 0 6 2 2 8 8 3 6 9 1 2 6 6 3 0 7 8 6 5 8 0 9 4 8 1 5 6 6 2 1 4 5 2 4 6 8 6 4 2 2 8 3 4 8 2 4 9 3 0 4 1 4 7 3 0 8 8 6 6 9 7 2 3 7 1 6 1 6 9 7 7 3 1 3 3 9 7 5 7 6 5 5 4 8 5 3 1 2 5 6 8 7 9 3 5 3 1 2 0 2 9 8 8 5 2 5 9 6 3 4 9 4 1 1 9 2 3 2 3 5 1 2 6 6 9 0 8 4 0 5 7 0 5 6 3 4 2 4 4 4 9 8 0 9 6 6 6 0 0 5 7 0 2 1 1 0 1 7 3 8 7 0 6 4 5 3 7 3 5 0 2 5 0 6 0 2 2 5 8 1 4 1 3 3 1 6 6 4 9 1 9 8 9 5 8 4 6 1 6 9 4 8 8 7 6 8 7 9 3 8 3 1 9 8 0 2 1 3 3 6 4 8 4 6 2 9 3 8 1 8 8 8 9 3 4 6 0 0 3 8 3 9 5 7 0 1 9 6 0 7 8 0 7 9 9 5 2 7 8 8 9 9 2 9 3 2 5 4 1 4 3 5 2 3 7 0 2 0 0 0 5 7 6 8 9 7 3 5 8 ))
(defn next-phase-get-second-half-subset-digit [sub-input nth-subset]
(mod
(Math/abs
(apply +
(drop nth-subset sub-input)))
10))
(def offset
(apply +
(map (fn [x] (apply * x))
(map vector
(reverse (take 7 input))
(iterate
(fn [x] (* 10 x))
1)))))
(defn next-phase [sub-input]
(println ".")
(pmap
(fn [nth-subset] (next-phase-get-second-half-subset-digit sub-input nth-subset))
(range (count sub-input))))
(println (format "Skipping %d items out of %d" offset (* 10000 (count input))))
(println
(take 8
(nth
(iterate
next-phase
(drop offset
(take
(* 10000 (count input))
(cycle input))))
100)))
// This program only explores and prints out the maze
#include <string.h>
#include <sstream>
#include <iostream>
#include <regex>
using namespace std;
const long long int original_tape[] = {1,330,331,332,109,3072,1101,1182,0,16,1101,1481,0,24,102,1,0,570,1006,570,36,1002,571,1,0,1001,570,-1,570,1001,24,1,24,1105,1,18,1008,571,0,571,1001,16,1,16,1008,16,1481,570,1006,570,14,21101,0,58,0,1105,1,786,1006,332,62,99,21101,333,0,1,21102,1,73,0,1105,1,579,1102,1,0,572,1101,0,0,573,3,574,101,1,573,573,1007,574,65,570,1005,570,151,107,67,574,570,1005,570,151,1001,574,-64,574,1002,574,-1,574,1001,572,1,572,1007,572,11,570,1006,570,165,101,1182,572,127,101,0,574,0,3,574,101,1,573,573,1008,574,10,570,1005,570,189,1008,574,44,570,1006,570,158,1106,0,81,21102,1,340,1,1105,1,177,21101,0,477,1,1105,1,177,21102,1,514,1,21102,1,176,0,1105,1,579,99,21101,0,184,0,1105,1,579,4,574,104,10,99,1007,573,22,570,1006,570,165,1002,572,1,1182,21101,0,375,1,21101,211,0,0,1105,1,579,21101,1182,11,1,21102,222,1,0,1106,0,979,21102,1,388,1,21102,1,233,0,1106,0,579,21101,1182,22,1,21101,0,244,0,1106,0,979,21102,401,1,1,21102,1,255,0,1105,1,579,21101,1182,33,1,21101,266,0,0,1106,0,979,21101,414,0,1,21102,277,1,0,1105,1,579,3,575,1008,575,89,570,1008,575,121,575,1,575,570,575,3,574,1008,574,10,570,1006,570,291,104,10,21102,1182,1,1,21102,313,1,0,1105,1,622,1005,575,327,1101,1,0,575,21101,0,327,0,1105,1,786,4,438,99,0,1,1,6,77,97,105,110,58,10,33,10,69,120,112,101,99,116,101,100,32,102,117,110,99,116,105,111,110,32,110,97,109,101,32,98,117,116,32,103,111,116,58,32,0,12,70,117,110,99,116,105,111,110,32,65,58,10,12,70,117,110,99,116,105,111,110,32,66,58,10,12,70,117,110,99,116,105,111,110,32,67,58,10,23,67,111,110,116,105,110,117,111,117,115,32,118,105,100,101,111,32,102,101,101,100,63,10,0,37,10,69,120,112,101,99,116,101,100,32,82,44,32,76,44,32,111,114,32,100,105,115,116,97,110,99,101,32,98,117,116,32,103,111,116,58,32,36,10,69,120,112,101,99,116,101,100,32,99,111,109,109,97,32,111,114,32,110,101,119,108,105,110,101,32,98,117,116,32,103,111,116,58,32,43,10,68,101,102,105,110,105,116,105,111,110,115,32,109,97,121,32,98,101,32,97,116,32,109,111,115,116,32,50,48,32,99,104,97,114,97,99,116,101,114,115,33,10,94,62,118,60,0,1,0,-1,-1,0,1,0,0,0,0,0,0,1,28,0,0,109,4,1202,-3,1,587,20101,0,0,-1,22101,1,-3,-3,21101,0,0,-2,2208,-2,-1,570,1005,570,617,2201,-3,-2,609,4,0,21201,-2,1,-2,1106,0,597,109,-4,2106,0,0,109,5,1202,-4,1,630,20102,1,0,-2,22101,1,-4,-4,21102,0,1,-3,2208,-3,-2,570,1005,570,781,2201,-4,-3,652,21001,0,0,-1,1208,-1,-4,570,1005,570,709,1208,-1,-5,570,1005,570,734,1207,-1,0,570,1005,570,759,1206,-1,774,1001,578,562,684,1,0,576,576,1001,578,566,692,1,0,577,577,21101,0,702,0,1105,1,786,21201,-1,-1,-1,1106,0,676,1001,578,1,578,1008,578,4,570,1006,570,724,1001,578,-4,578,21102,731,1,0,1105,1,786,1106,0,774,1001,578,-1,578,1008,578,-1,570,1006,570,749,1001,578,4,578,21102,1,756,0,1105,1,786,1106,0,774,21202,-1,-11,1,22101,1182,1,1,21101,0,774,0,1106,0,622,21201,-3,1,-3,1106,0,640,109,-5,2106,0,0,109,7,1005,575,802,20102,1,576,-6,20102,1,577,-5,1105,1,814,21101,0,0,-1,21101,0,0,-5,21101,0,0,-6,20208,-6,576,-2,208,-5,577,570,22002,570,-2,-2,21202,-5,37,-3,22201,-6,-3,-3,22101,1481,-3,-3,1201,-3,0,843,1005,0,863,21202,-2,42,-4,22101,46,-4,-4,1206,-2,924,21101,1,0,-1,1106,0,924,1205,-2,873,21102,1,35,-4,1106,0,924,1201,-3,0,878,1008,0,1,570,1006,570,916,1001,374,1,374,2101,0,-3,895,1102,2,1,0,2102,1,-3,902,1001,438,0,438,2202,-6,-5,570,1,570,374,570,1,570,438,438,1001,578,558,921,21002,0,1,-4,1006,575,959,204,-4,22101,1,-6,-6,1208,-6,37,570,1006,570,814,104,10,22101,1,-5,-5,1208,-5,43,570,1006,570,810,104,10,1206,-1,974,99,1206,-1,974,1101,0,1,575,21101,0,973,0,1106,0,786,99,109,-7,2105,1,0,109,6,21101,0,0,-4,21101,0,0,-3,203,-2,22101,1,-3,-3,21208,-2,82,-1,1205,-1,1030,21208,-2,76,-1,1205,-1,1037,21207,-2,48,-1,1205,-1,1124,22107,57,-2,-1,1205,-1,1124,21201,-2,-48,-2,1105,1,1041,21102,-4,1,-2,1105,1,1041,21101,-5,0,-2,21201,-4,1,-4,21207,-4,11,-1,1206,-1,1138,2201,-5,-4,1059,1201,-2,0,0,203,-2,22101,1,-3,-3,21207,-2,48,-1,1205,-1,1107,22107,57,-2,-1,1205,-1,1107,21201,-2,-48,-2,2201,-5,-4,1090,20102,10,0,-1,22201,-2,-1,-2,2201,-5,-4,1103,1201,-2,0,0,1106,0,1060,21208,-2,10,-1,1205,-1,1162,21208,-2,44,-1,1206,-1,1131,1105,1,989,21101,439,0,1,1105,1,1150,21102,1,477,1,1106,0,1150,21101,514,0,1,21101,0,1149,0,1105,1,579,99,21101,1157,0,0,1105,1,579,204,-2,104,10,99,21207,-3,22,-1,1206,-1,1138,1201,-5,0,1176,2101,0,-4,0,109,-6,2106,0,0,28,9,36,1,36,1,36,1,36,1,36,1,26,9,1,1,26,1,7,1,1,1,22,11,1,1,1,1,22,1,3,1,5,1,1,1,1,1,2,13,7,1,3,11,2,1,11,1,7,1,9,1,1,1,4,1,11,1,7,1,9,1,1,1,4,1,11,1,7,1,9,1,1,1,4,1,5,13,1,1,9,1,1,1,4,1,5,1,5,1,5,1,1,1,9,1,1,1,2,11,3,1,5,1,1,13,2,1,1,1,5,1,1,1,3,1,5,1,11,1,4,1,1,1,5,1,1,1,3,1,5,13,4,1,1,1,5,1,1,1,3,1,22,1,1,9,3,1,15,1,6,1,7,1,5,1,15,1,6,1,7,1,1,5,15,1,6,1,7,1,1,1,19,1,6,1,7,1,1,1,19,1,6,1,7,1,1,1,19,1,6,9,1,1,19,1,16,1,19,1,12,13,11,1,12,1,3,1,7,1,11,1,12,1,3,1,7,1,11,1,12,1,3,1,7,1,11,1,12,1,3,1,1,5,1,13,12,1,3,1,1,1,3,1,26,1,3,13,20,1,5,1,3,1,5,1,20,1,5,1,3,1,5,1,20,1,5,1,3,1,5,1,20,1,5,1,3,1,5,1,20,1,5,1,3,1,5,1,20,11,5,1,26,1,9,1,26,11,14};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define PANEL_SIZE 50
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
void run();
long long int (*input_handler)(const computor);
void (*output_handler)(const computor, long long int);
computor() {
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->input_handler(*c);
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in < 1 && in > 4) bug(c, dest, 0, to);
}
void out(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < -1) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->output_handler(*c, from);
c->ic += 2;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
char screen[PANEL_SIZE][PANEL_SIZE];
pair<int, int> position = {0, 0}; // so access at the top left corner is legal and alignment parameters are easier to calculate
pair<int, int> dronePosition = {-1, -1};
int directionIdx;
pair<int, int> droneDirection;
pair<int, int> directions[4] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; // up left down right
long long int outputDirs[4] = { 1, 3, 2, 4 }; // north = 1, south = 2, west = 3, east = 4
char directionsChars[4] = { '^', '<', 'v', '>' };
long long int nothing_here(const computor c) { return -9999; }
// new strategy: make sure you've always got a wall to your left
// which means:
// - move forward
// - turn left
// - if I hit a wall, turn back right
// - if I hit a corridor, I've already gone down it, so try again and turn left
// in essence: turn left while you can, turn right when you can't.
void PATIENT_SCRIBE(const computor c, long long int discovery) {
if(discovery != '\n') {
screen[position.first][position.second++] = discovery;
if(discovery == '^' || discovery == 'v' || discovery == '<' || discovery == '>') {
dronePosition.first = position.first;
dronePosition.second = position.second;
for(int i = 0; i < 4; i++) {
if(directionsChars[i] != discovery) continue;
directionIdx = i;
droneDirection = directions[i];
}
}
} else {
position.first++;
position.second = 0;
}
}
ostringstream the_answer;
int answerIdx;
long long int BLIND_DUMPER(computor c) {
return the_answer.str()[answerIdx++];
}
void BLIND_OUTPUT(computor c, long long int data) {
// skip the diagnostics
if(data > 255) {
printf("Dust: %lld\n", data);
} else {
// printf("%c", (char) data);
}
}
int main() {
computor cPartOne;
memset(screen, ' ', sizeof(screen));
cPartOne.input_handler = nothing_here;
cPartOne.output_handler = PATIENT_SCRIBE;
cPartOne.run();
int alignment;
for(int i = 0; i < PANEL_SIZE; i++) {
for(int j = 0; j < PANEL_SIZE; j++) {
//printf("%c", screen[i][j]);
if('#' == screen[i][j]
&& '#' == screen[i-1][j]
&& '#' == screen[i][j-1]
&& '#' == screen[i+1][j]
&& '#' == screen[i][j+1]) {
alignment += i*j;
}
}
//printf("\n");
}
printf("Alignment: %d\n", alignment);
bool done = false;
string operations; operations.reserve(100);
while(!done) {
char moveForwardTheseManySpaces = '0';
// first go straight
while(screen[dronePosition.first + droneDirection.first][dronePosition.second + droneDirection.second] == '#') {
moveForwardTheseManySpaces++;
dronePosition.first += droneDirection.first;
dronePosition.second += droneDirection.second;
}
if(moveForwardTheseManySpaces != '0') operations.push_back(moveForwardTheseManySpaces);
// now turn, left or right
// first left
directionIdx += 1; directionIdx &= 3;
if(screen[dronePosition.first + directions[directionIdx].first][dronePosition.second + directions[directionIdx].second] == '#') {
droneDirection = directions[directionIdx];
operations.push_back('L');
} else {
directionIdx -= 2; directionIdx &= 3;
if(screen[dronePosition.first + directions[directionIdx].first][dronePosition.second + directions[directionIdx].second] == '#') {
droneDirection = directions[directionIdx];
operations.push_back('R');
} else {
//assume we've gotten to the end
done = true;
}
}
}
// for whatever reason
operations[1]++;
regex solutionFinder("^(.{1,10})\\1*?(.{1,10})(?:\\1|\\2)*?(.{1,10})(?:\\1|\\2|\\3)*$");
smatch bits;
string operationsStr;
std::regex_match(operations, bits, solutionFinder);
string opA = bits[1], opB = bits[2], opC = bits[3];
operations = regex_replace(operations, regex(opA), "A");
operations = regex_replace(operations, regex(opB), "B");
operations = regex_replace(operations, regex(opC), "C");
operations = regex_replace(operations, regex("(.)"), "$1,");
opA = regex_replace(opA, regex("(.)"), "$1,");
opB = regex_replace(opB, regex("(.)"), "$1,");
opC = regex_replace(opC, regex("(.)"), "$1,");
operations = regex_replace(operations, regex(",$"), "");
opA = regex_replace(opA, regex(",$"), "");
opB = regex_replace(opB, regex(",$"), "");
opC = regex_replace(opC, regex(",$"), "");
opA = regex_replace(opA, regex(":"), "10");
opB = regex_replace(opB, regex(":"), "10");
opC = regex_replace(opC, regex(":"), "10");
opA = regex_replace(opA, regex("<"), "12");
opB = regex_replace(opB, regex("<"), "12");
opC = regex_replace(opC, regex("<"), "12");
std::cout << "Operations: " << operations << "\n" << flush;
cout << "A: " << opA << "\n" << flush;
cout << "B: " << opB << "\n" << flush;
cout << "C: " << opC << "\n" << flush;
// missing the glue between here and there, git blame the line to see what still needs to happen
the_answer << operations << "\n" << opA.c_str() << "\n" << opB.c_str() << "\n" << opC.c_str() << "\n" << "n" << "\n";
computor cPartTwo;
cPartTwo.input_handler = BLIND_DUMPER;
cPartTwo.output_handler = BLIND_OUTPUT;
cPartTwo.tape[0] = 2;
cPartTwo.run();
}
// This program only explores and prints out the maze
#include <string.h>
#include <cstdio>
#include <queue>
using namespace std;
const long long int original_tape[] = {109,424,203,1,21101,11,0,0,1105,1,282,21101,18,0,0,1106,0,259,2102,1,1,221,203,1,21101,0,31,0,1106,0,282,21102,38,1,0,1105,1,259,20101,0,23,2,22101,0,1,3,21101,1,0,1,21101,0,57,0,1105,1,303,2101,0,1,222,20102,1,221,3,21001,221,0,2,21101,0,259,1,21101,80,0,0,1105,1,225,21101,137,0,2,21101,91,0,0,1105,1,303,1202,1,1,223,21001,222,0,4,21102,259,1,3,21101,225,0,2,21102,225,1,1,21101,0,118,0,1106,0,225,20102,1,222,3,21101,0,88,2,21102,133,1,0,1105,1,303,21202,1,-1,1,22001,223,1,1,21101,0,148,0,1106,0,259,1202,1,1,223,20102,1,221,4,20101,0,222,3,21101,24,0,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21102,1,195,0,106,0,108,20207,1,223,2,20102,1,23,1,21101,-1,0,3,21101,0,214,0,1105,1,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,2102,1,-4,249,22102,1,-3,1,22102,1,-2,2,22102,1,-1,3,21101,0,250,0,1105,1,225,22102,1,1,-4,109,-5,2106,0,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,22101,0,-2,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,22102,1,-2,3,21102,343,1,0,1105,1,303,1105,1,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,21202,-4,1,1,21102,1,384,0,1106,0,303,1106,0,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,22101,0,1,-4,109,-5,2106,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define PANEL_SIZE 50
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
void run();
long long int (*input_handler)(const computor);
void (*output_handler)(const computor, long long int);
queue<long long int> *in;
queue<long long int> *out;
computor() {
in = new queue<long long int>;
out = new queue<long long int>;
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->in->front();
c->in->pop();
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in < 1 && in > 4) bug(c, dest, 0, to);
}
void out(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < -1) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->out->push(from);
c->ic += 2;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
int main() {
int answer;
for(int y = 0; y < PANEL_SIZE; y++) {
for(int x = 0; x < PANEL_SIZE; x++) {
computor c;
c.in->push(x);
c.in->push(y);
c.run();
long long int discovery = c.out->front();
printf("%c", discovery? '#' : '.');
if(discovery) answer++;
}
printf("\n");
}
printf("%d\n", answer);
}
#include <string.h>
#include <cstdio>
#include <queue>
using namespace std;
const long long int original_tape[] = {109,424,203,1,21101,11,0,0,1105,1,282,21101,18,0,0,1106,0,259,2102,1,1,221,203,1,21101,0,31,0,1106,0,282,21102,38,1,0,1105,1,259,20101,0,23,2,22101,0,1,3,21101,1,0,1,21101,0,57,0,1105,1,303,2101,0,1,222,20102,1,221,3,21001,221,0,2,21101,0,259,1,21101,80,0,0,1105,1,225,21101,137,0,2,21101,91,0,0,1105,1,303,1202,1,1,223,21001,222,0,4,21102,259,1,3,21101,225,0,2,21102,225,1,1,21101,0,118,0,1106,0,225,20102,1,222,3,21101,0,88,2,21102,133,1,0,1105,1,303,21202,1,-1,1,22001,223,1,1,21101,0,148,0,1106,0,259,1202,1,1,223,20102,1,221,4,20101,0,222,3,21101,24,0,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21102,1,195,0,106,0,108,20207,1,223,2,20102,1,23,1,21101,-1,0,3,21101,0,214,0,1105,1,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,2102,1,-4,249,22102,1,-3,1,22102,1,-2,2,22102,1,-1,3,21101,0,250,0,1105,1,225,22102,1,1,-4,109,-5,2106,0,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,22101,0,-2,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,22102,1,-2,3,21102,343,1,0,1105,1,303,1105,1,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,21202,-4,1,1,21102,1,384,0,1106,0,303,1106,0,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,22101,0,1,-4,109,-5,2106,0,0};
#define len_tape (int) (sizeof(original_tape) / sizeof(original_tape[0]))
#define get(idx) (idx <= len_tape? tape[idx] : -1)
#define gett(idx) (idx <= len_tape? c->tape[idx] : -1)
#define opmodeL(position, immediate, relative) switch ((gett(c->ic) / 100 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeR(position, immediate, relative) switch ((gett(c->ic) / 1000 ) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define opmodeD(position, immediate, relative) switch ((gett(c->ic) / 10000) % 10) { case 0: position; break; case 1: immediate; break; case 2: relative; break; default: bug(c, gett(c->ic), 999, 999); }
#define PANEL_SIZE 1200
class computor {
public:
char name = '*';
long long int ic = 0;
long long int bp = 0; // base pointer
bool halt = false;
bool catch_fire = false;
bool block = false;
long long int tape[len_tape*10] = {0}; // "much larger"
void run();
long long int (*input_handler)(const computor);
void (*output_handler)(const computor, long long int);
queue<long long int> *in;
queue<long long int> *out;
computor() {
in = new queue<long long int>;
out = new queue<long long int>;
memcpy(tape, original_tape, sizeof(original_tape));
};
};
void bug(computor *c, long long int what, long long int lol, long long int nope) {
c->catch_fire = true;
long long int ic = c->ic;
printf("(comp %c, ic: %lld), well we shouldn't be here (%lld, %lld, %lld, %lld)\n", c->name, c->ic, c->tape[c->ic], what, lol, nope);
printf("tape (from ic %lld): %lld %lld %lld %lld %lld %lld %lld %lld %lld [%lld] %lld %lld %lld %lld\n", ic-9, gett(ic-9), gett(ic-8), gett(ic-7), gett(ic-6), gett(ic-5), gett(ic-4), gett(ic-3), gett(ic-2), gett(ic-1), gett(ic), gett(ic+1), gett(ic+2), gett(ic+3), gett(ic+4));
}
void add(computor *c, long long int lop, long long int rop, long long int dest) { // 1
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left + right;
c->ic += 4;
}
void mul(computor *c, long long int lop, long long int rop, long long int dest) { // 2
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = left * right;
c->ic += 4;
}
void in(computor *c, long long int dest, long long int _, long long int __) { // 3
long long int to; opmodeL(to = dest, bug(c, dest, dest, dest), to = c->bp + dest);
opmodeR(, bug(c, dest, _, __), bug(c, dest, _, __));
opmodeD(, bug(c, dest, _, __), bug(c, dest, _, __));
long long int in = c->in->front();
c->in->pop();
// printf("(comp %c, ic: %lld), read: %lld, into: %lld\n", c->name, c->ic, in, to);
c->tape[to] = in;
c->ic += 2;
if(in < 1 && in > 4) bug(c, dest, 0, to);
}
void out(computor *c, long long int lop, long long int _, long long int __) { // 4
long long int from; opmodeL(from = c->tape[lop], from = lop, from = c->tape[c->bp + lop]);
opmodeR(, bug(c, lop, _, __), bug(c, lop, _, __));
opmodeD(, bug(c, lop, _, __), bug(c, lop, _, __));
if(from < -1) bug(c, lop, 0, from);
//printf("(comp %c, ic: %lld), write: %lld\n", c->name, c->ic, from);
c->out->push(from);
c->ic += 2;
}
void jne(computor *c, long long int lop, long long int rop, long long int _) { // 5
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic = dest;
} else {
c->ic += 3;
};
}
void jeq(computor *c, long long int lop, long long int rop, long long int _) { // 6
long long int test; opmodeL(test = c->tape[lop], test = lop, test = c->tape[c->bp + lop]);
long long int dest; opmodeR(dest = c->tape[rop], dest = rop, dest = c->tape[c->bp + rop]);
opmodeD(, bug(c, lop, rop, _), bug(c, lop, rop, _));
if(test) {
c->ic += 3;
} else {
c->ic = dest;
};
}
void lt (computor *c, long long int lop, long long int rop, long long int dest) { // 7
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left < right);
c->ic += 4;
}
void eq(computor *c, long long int lop, long long int rop, long long int dest) { // 8
long long int left; opmodeL(left = c->tape[lop], left = lop, left = c->tape[c->bp + lop]);
long long int right; opmodeR(right = c->tape[rop], right = rop, right = c->tape[c->bp + rop]);
long long int to; opmodeD(to = dest, bug(c, lop, rop, dest), to = c->bp + dest);
c->tape[to] = (left == right);
c->ic += 4;
}
void bps(computor *c, long long int lop, long long int _, long long int __) { // 9
long long int to; opmodeL(to = c->tape[lop], to = lop, to = c->tape[c->bp + lop]);
c->bp += to;
c->ic += 2;
}
void halt(computor *c, long long int lol, long long int _, long long int __) { // 99
c->halt = true;
c->ic += 1;
}
void (*ops [100])(computor*, long long int, long long int, long long int) = {bug, add, mul, in, out, jne, jeq, lt, eq, bps, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, bug, halt};
void computor::run() {
//if we had been blocked, we are now awakened
block = false;
while(!halt && !catch_fire && !block) {
// printf(".");
long long int opcode = get(ic);
long long int op = opcode % 100;
long long int x = get(ic + 1);
long long int y = get(ic + 2);
long long int z = get(ic + 3);
(ops[op])(this, x, y, z);
}
}
char screen[PANEL_SIZE][PANEL_SIZE] = {' '};
bool check(long long int x, long long int y) {
computor c;
c.in->push(x);
c.in->push(y);
c.run();
long long int discovery = c.out->front();
//printf("Checked %lld %lld: %lld\n", x, y, discovery);
screen[x][y] = discovery? '#' : '.';
return discovery == 1;
}
#define SIZE 100
int main() {
long long int X = 0;
long long int Y = 3;
memset(screen, ' ', sizeof(screen));
while(true) {
// go to start of next line
Y++;
while (!check(X,Y)) X++;
// check that this is the bottom left corner of a diagonal
// why size - 1? say I want a 5 wide rectangle and am at X
//
// ##### To check this is INSIDE the FIVExFIVE rectangle
// ##### I'm checking FOUR up and FOUR across
// #####
// #####
// X####
//
if(!check(X + (SIZE - 1), Y - (SIZE - 1))) continue;
// just to be sure, eh?
//for(int xD = 0; xD <= (SIZE - 1); xD++) // again only checking FOUR up and across
//f/or(int yD = 0; yD <= (SIZE - 1); yD++)
// if(!check(X + xD, Y - (SIZE - 1) + yD)) continue;
// success
break;
}
// so now x, y are the coords of the bottom left edge
// we want the top left edge (again, it's FOUR up, not five)
Y -= SIZE - 1;
// for(int y = 0; y < PANEL_SIZE; y++) {
// for(int x = 0; x < PANEL_SIZE; x++) {
// printf("%c", x == X && y == Y? 'O': screen[x][y]);
// }
// printf(" - Y = %d\n", y);
// }
printf("%lld\n", X*10000 + Y);
}
:- use_module(library(ugraphs)).
starchart(Starchart) :- vertices_edges_to_ugraph([],
[objCYP-objBC6, objFPL-objG1W, obj6MM-obj5MX, objCXK-objW4F, objTW9-objKG3, obj7LR-objRVF, obj9LK-objMJF, objFZT-objG7N, obj4F5-objYJH, objPJF-objDJV, objJYT-obj3WQ, obj839-objQ21, obj8CW-objNGC, obj564-obj8T3, objM86-obj3NM, objXSL-obj814, objMH7-objLDS, objDKB-obj742, objFWR-objNDK, objRFZ-objB5P, objMLZ-objYZQ, obj3RK-objFZB, objX46-objNQ1, objY64-objVDS, objH79-objLPF, objG4Q-objHSZ, obj76X-obj37N, obj5X1-obj7PF, objYT3-obj8RH, objQPY-obj32L, obj3M3-objXY4, objZ9Z-objZP1, objMZ1-objH8X, obj2RY-objVW7, obj8CB-objL95, objRQF-obj1NR, objJRX-obj2N9, objYV3-obj4R2, objXKB-objMFH, obj13H-obj1BW, objWQS-objXBR, objWQ9-objGQP, objHGX-obj7G5, objZT8-obj7C6, objDHD-objHSD, objTCX-obj7P7, obj8NF-objKTM, objFG4-objV8D, objC49-objDJK, objKBZ-objMFF, obj9SG-objDBC, objYWQ-objHF1, objY7T-obj7RN, obj6YM-objBV6, objB41-objP1W, objPSF-objNLC, obj9VN-objW8W, objYS5-obj6RK, objNLH-objZH9, objS8D-obj2BJ, obj923-obj9RJ, objVGK-objD33, objSL1-obj7LT, objZM4-objS6L, objG1P-objQFG, objRLW-obj6TK, objNDK-objDXV, objDFN-obj7GM, objB6Z-objFL7, obj4JP-objJCR, objDQF-obj8CN, obj7PB-objF3V, obj7QM-obj116, obj1WM-objWS8, objLLC-obj1YP, objGP2-objM37, objDX1-objV6G, objVJZ-objJ4F, objYPL-objJ14, obj712-obj2TM, obj37N-obj9RS, objPV1-obj5F9, objDJ7-obj125, objTB3-objJK3, objYZQ-objG13, objNMV-objM64, obj9WN-objB6Z, objQ62-obj3V6, obj3NM-objN21, objLBN-objT51, objKGL-objTQ3, obj9P4-obj123, objTRY-obj24T, objK62-obj3QZ, objD3K-objMZD, objQ33-objGH3, obj8PZ-objDRD, obj845-objKZX, objFH9-objG1P, objCT6-objCZN, obj39L-objS1T, objGTP-objHDP, objNYH-objVFT, objZ7P-obj1B7, objG87-objZPQ, objM98-obj2PZ, objT6K-objYQB, objKBP-obj8WY, objQ6F-objVZC, obj9Q7-objDNQ, objY4T-objC21, obj5VW-objG32, objK1S-objY64, obj7TW-objQT6, objTM2-objLBM, objGZ1-objHBJ, objK45-objRPX, objDGB-objNF5, objTZN-objCQP, obj3M3-objTJ1, objSTY-objVH9, obj7KG-objTSY, obj9QH-obj6ZW, objTDN-objTVJ, objZR4-objKP8, objD6Y-obj56K, obj4Q1-objPQR, obj3X2-objWVF, objW4B-objW6R, objSWJ-obj4Q1, objN6R-obj67W, objR5F-obj15N, objF17-objGTS, obj7MF-objH1Z, obj36V-objKXV, obj131-objJZC, obj5G3-objKHV, objJ5R-objHB2, obj2CD-objLFV, objMG5-objYPV, obj859-obj1Y7, obj85D-obj6LW, objTFP-obj5CJ, objQZ2-objJBW, objC7L-obj86Y, obj1TJ-objF5F, obj4GC-objVM9, objW6W-objXV5, obj5LX-objH82, obj4Q1-objHL2, objC9P-obj1CZ, objSC8-objWQS, obj78G-objP4B, objFF5-obj5PV, obj36J-objYMC, obj8TM-objQHV, obj793-objXS6, objP7F-objTMJ, obj46W-objDC2, objYRZ-obj5F2, objGHQ-obj5VW, obj7LY-objW59, objFZ8-objSAN, objW7K-objR75, objZL8-objHWH, objDJV-objX7C, objMML-objQCB, objD5Y-objR6R, obj2ZP-obj516, obj9KL-objV35, objP7P-objHSN, objH45-objRTT, objN6F-objFWR, objGB3-objLL3, objHPQ-objLM3, obj2XS-obj6MM, objYMC-objHYL, objX7B-objZ2N, obj2ZD-obj217, objD33-objX7B, objRKH-obj7TW, objMMV-obj131, obj3TJ-objL88, obj5F6-objBJQ, objMJ9-obj9FT, objK4C-objM99, objNQM-objHGQ, objRQ2-objSB9, objJ5G-objKD3, objX84-objWF6, obj794-objM77, objSPD-obj844, objXTC-objRW1, obj7P7-objKXQ, objP4G-obj64X, objBTR-obj57D, obj32Y-objSJP, objJ3W-obj9QH, objJTX-objFPR, obj3NW-obj2ZP, obj8VC-objPMP, objPSL-objMR8, objH5F-objBTR, obj8BT-obj73H, objBSC-obj36B, objF14-obj9SP, objH1K-obj28T, obj36B-objSJ6, obj8RH-objRGP, objJF3-objJ3W, objSGC-objDXB, objCHY-obj94Y, objRND-objVJY, objG23-objCVN, objMR9-objFF5, objSB9-objF2N, objNRK-obj9XQ, objJ14-obj8NS, objRJ1-obj578, objQG7-objN41, objR8L-objXMZ, obj7SR-obj6W4, objB7P-obj2X9, objQRV-objF9F, objLMZ-objFB7, objF9M-objDDH, objHB2-objH79, objSM8-objN1G, objGMT-obj5F6, objFL7-obj7MZ, objCS8-objCKK, objCZV-obj89B, objSZP-objNJZ, objN1G-objH6Q, objXV7-objJX6, obj5L5-obj3C3, objJCR-obj7V3, objB9S-obj13H, obj123-objS8B, objRZ4-objGR4, objPV7-objFMP, obj4RG-objHX6, objBMB-obj82H, objRRK-objKB3, objFPR-objDP3, obj826-obj8M2, objY1P-obj5KC, objYSP-objY61, obj56T-objMZ8, objJ8Q-objHTW, objZ4C-objDTK, objWBP-obj8WP, objPN3-obj7KT, obj7KT-objXK9, objLDD-obj2TP, obj2X1-objHZR, objSZ9-objWLP, objFH9-objQ9W, obj4L4-objT4W, objFRS-objBMK, objBTH-objWQF, objMX9-obj3ZQ, objDG6-objK6D, obj5TR-objHD8, objKV3-objWW3, objVCB-objBJV, objBMK-objMX9, objQT6-obj8VC, objYDT-objNH2, obj85Y-obj4JB, objGXT-objV4Z, obj7T6-objXK4, obj8YR-objSL1, obj9WL-objMPZ, obj58H-objH5Z, objL7D-objMG5, objMNN-obj5GT, objCVN-obj4M3, objXCP-objMZJ, objJX6-objBMB, objF9M-objVT3, obj246-obj3SW, obj1NX-objMG7, obj6PG-objSL3, obj1PR-obj8XF, objRF7-objW6W, objVW7-objS1D, objHKB-objC2Y, objLH6-objY4T, objDLN-obj4GC, objN8R-objYK3, objQVZ-objM3Q, objWPW-obj9TS, objPLX-objPX8, objF5P-objFC6, objDVZ-objD5Y, obj91S-objXCH, objJ2F-objNSL, objX9G-objPN3, objH8X-obj84H, objMD9-objC8Z, objQNX-objCWY, obj57D-objYWX, objMGF-obj7Y6, obj24W-objV27, obj5WV-objW7T, objVRF-objFPL, obj844-objJVP, objTWX-objZ6B, obj63P-obj2T7, obj7C6-objVR3, objC1M-objLKR, obj4ZP-objBJG, obj9D4-obj69B, objGQP-objCTM, objVCK-objR59, objHDB-objCVL, objWQH-objM86, objDRD-obj62D, objVRR-objKV3, objXLD-obj5R2, objB36-obj55B, objF69-obj7T6, obj36B-objNLJ, objB5P-objQ4Z, objY27-objGDG, objLHR-objDG8, objZQQ-objCKC, objCYX-objSMY, objRBF-objCBG, objPRF-objPRH, objWW3-objB28, objDYL-obj2ZX, objRGP-objYNJ, objDNQ-obj4R4, objQCB-objPBV, objSK7-obj7QR, objM4S-objPJ5, objD15-objNX8, objMZD-objBRP, objS1B-objQ5H, objM9V-objVSJ, objVGK-objCGY, objGC9-objLKT, objSDD-objF31, objKK3-objLCB, obj1FF-obj4WC, obj87N-objBVX, obj76M-obj1RN, objZS5-objRND, obj374-objVPW, objQBW-objX2Q, objG51-obj63B, objMC9-objF35, objT73-objJTY, obj24V-objQJN, objMWN-objS57, objNHV-objDHT, objY3K-objD81, objS6L-objJ5G, objWSS-obj32Y, obj3SH-objK74, objSMY-objJBJ, objZXP-obj212, objZ85-objRM5, objHZC-obj9VN, obj6F6-obj8BT, obj845-objKMW, objJLZ-objZMW, objNDB-obj1MY, obj7ZV-objDG6, objKNN-obj46W, obj34H-objL5Q, obj87Q-objJ3K, obj4MP-objZ7P, objBJD-objK2R, objJ31-objR2N, obj585-obj7HL, obj3FP-objJQS, objPYG-objQ1N, objDC2-objWGW, objH95-obj4M1, objQK3-obj13Y, obj6N4-objT87, objK4Q-obj626, objHDF-objFFQ, objTX9-objB6S, objJTY-objZWR, obj94M-objY9F, objG32-objBHL, objS4X-objJF3, obj687-objZV9, objQLX-objT9F, objBYK-obj2XC, objPG4-objXZ6, objF7R-obj44V, obj7VL-objQFR, objDGG-objCB1, obj498-objZS9, objS67-objX3Z, objB22-obj68Q, objG92-objK3K, objHG7-objKBP, objV8P-objTZN, objXZ6-objTQD, obj8GG-objTRY, objHLF-objFRS, objYP6-objX6X, objPB2-objR9Y, objPCR-objL8X, objXNT-objH22, objHSD-objY54, objTD1-objNDB, objZMW-objJYT, objBB8-objGSN, objVN6-objP6Q, obj63Y-objQD2, objQGJ-obj9ZM, objXMZ-objJS6, obj3BC-objP7R, objG13-objMMC, objDBK-obj96C, obj7WG-obj1F5, obj626-objHYQ, obj96C-objDFN, objB39-objNVP, objQF9-obj6NZ, objF3V-objFVQ, objJYS-objGMT, obj523-objSVM, objRQ6-objVF4, objG7N-objZ31, objV8D-objYRK, obj7GM-objQS6, objCGY-objCBZ, obj7X4-objD4K, objHLS-objV3C, objVDS-obj39L, objKNN-objGC9, objQS7-objDZN, obj4C3-objQX4, objQTK-objQVZ, objRTS-obj8PZ, obj486-objFZ8, objNR7-objHRL, objGLJ-objXLD, objCWY-objQV2, objNH2-obj54M, objWZ3-objJZS, objTFK-objTQN, objT5K-objSF6, objLPR-objWB3, obj6WM-obj354, objR9B-objT37, obj26S-objJJG, objS24-objTCZ, objD5L-objKSB, objKVZ-objYT3, obj7SL-objF7R, obj8SJ-objLQ2, obj5G6-objC23, obj1RN-objPSG, objBVX-objT8Z, objX5N-objG5W, objY1P-obj52M, objKH1-obj2YC, objRW1-objZY6, obj5CJ-obj7BB, objWWS-objVDF, objC8Z-objL5G, obj7QR-obj79Q, objNSR-objSXK, objBRP-objKNN, objTJS-objPRZ, objBMB-objT4X, obj7RG-objK9C, objHFP-objHDB, objNGC-objB6T, objBDR-objHW3, objNK7-objJY9, obj71W-objLWT, obj7G3-objJVR, obj8M2-objXWZ, objRFB-objMYL, objHDP-obj7S5, objWQQ-obj7QM, objQ5H-objNKM, objZRF-obj1XC, objYNJ-objD8S, objM99-obj5G3, obj4PS-objX1V, objTCC-objLQW, objFD7-objBTH, objPX8-objLSF, objP9J-objJQR, objS15-objC36, objRNY-objS4G, objXS6-objWCB, objC5F-objC7P, objKKD-objXR5, objT7K-objJ3V, objHKS-objJPL, objRK1-obj65J, objDWY-obj479, objD8S-obj4RG, objDV2-objT59, obj9TB-objD26, objV27-obj8NL, objL2V-obj3M3, objHX6-obj6H7, obj8NS-obj9P4, objTFR-obj7HD, objSJ6-objTK2, objTCC-obj7ZP, objD3F-objTMM, objRK6-objL17, objRK6-objHZC, objBF7-objZTP, obj52M-obj1M7, objMB3-objS4B, objL5J-obj3P8, objVCB-objMXP, objS1T-objT5P, objDHS-objNSR, obj131-obj4BV, objVWR-objR8L, objK1D-obj9LK, obj796-objQRV, objCYZ-objN31, objMMC-objHH6, objLSF-objYZJ, objQS6-obj2ZS, objDV9-objK65, objKT9-objP27, objCKK-obj6NB, objV4Z-objD6N, obj9WL-obj5J9, objP88-objHLF, objTMM-obj7HN, objXBQ-objJG5, obj97N-obj81P, obj5VH-objSDZ, objMHF-objQP6, objNXM-obj3X2, objB3L-objZQL, objBM7-obj4F5, objZGZ-objPQS, obj59F-objF7C, obj6T3-obj59W, obj99C-objK1X, objBTK-obj4L4, objM96-objD9B, obj63Y-obj7KG, objNF5-objR4C, objSZT-objK5G, objHZ1-objKKD, objC3J-objJ1S, objQ21-objNKR, obj1NC-objCF2, objSVJ-objGJB, objWNB-obj12X, objQM3-objRF4, objHW3-objVZV, objRTT-objDT8, obj7L5-obj62G, objJ4F-obj8DJ, objLQW-obj77T, obj7GH-objX51, obj33T-obj5JR, obj4LX-objHC2, obj5JR-obj8CB, objM5S-objVT6, objGR4-obj5HD, obj9X9-objPLW, objPQL-objWWB, objJY9-obj9SG, objSJF-objH9D, objD9B-obj9JF, obj9XQ-objBT2, objRBD-objJQY, obj5F9-objTRS, obj5MT-objXSL, objXHP-objMMW, objHSN-obj17L, objQCM-objPGF, objBVF-objYBG, objJS6-objS1B, objGZ5-objB6L, objYM2-obj8YR, objP7R-objNK7, objJ2B-objJ2F, obj9LF-objS9G, obj4M4-objZ9Z, obj7S5-objKY9, objM37-obj22M, objQPV-objY1P, obj8CH-objV9L, objB6S-objGTN, objX6X-objXLH, objGKT-obj7RW, objP6D-obj8W3, objBJQ-objZ4C, obj3ZQ-objK1D, objL57-objBZR, objXFX-objZ5Y, obj94Y-objF83, objDXC-obj8W2, obj37S-objGS4, objZTH-objJX2, objDP3-objLYY, objXBR-obj6JF, objTTY-objG51, objVL3-objSRQ, objBNQ-obj5S8, obj62G-objTMW, objJK3-objXWW, objWDJ-objKDJ, obj4M1-objNGJ, objQ1N-obj81K, objG7R-objGP2, objLKT-obj7ZV, obj8NT-objZXP, objKXQ-objLSZ, obj12X-objPD2, objL1N-objWZY, objZY6-objTT4, obj7P7-obj6T1, objQ2T-objHDF, obj1HW-obj1CD, objNTG-obj5BS, obj6G9-objWVJ, objF5P-objGML, objVJD-objWWS, objYVW-objPM3, objP2Y-objZZ4, objJYK-objL57, objNN1-objTW9, objB69-objYZZ, objGRW-obj2XG, objJ4Q-objHHB, objK74-objF25, obj55M-obj5LX, objWR5-objJTM, objDDG-objNRK, objY65-objMC9, objWVF-objPSF, obj6CD-objZGZ, objGSN-objY5X, objBX1-objZHN, objCLT-objSPD, obj4R4-objR2K, objJPP-obj1GH, objNKM-objPY5, objQH8-objM8Y, objJRX-obj6WM, objZ3T-obj28Q, objSVM-obj78G, objXK9-obj4BW, objZR4-objX9G, obj5B2-objX6W, obj4BS-obj5NX, objTT4-objMGF, objTQ1-objM4Q, obj9KS-objYWQ, objW8W-objM8T, objQBT-objCXK, objN41-objQLX, objCNV-obj6PG, obj6T1-obj99C, obj125-objV2S, objQPD-objQNX, objH5Z-obj2KX, objP9S-obj1XM, obj15N-obj4SM, objFJ4-objMNL, objYPL-objJDP, objP8L-objPLX, objWVJ-objSQC, objV9L-objG4Q, objY9L-objK1S, obj1SS-objF8X, obj9WR-objF7H, obj167-obj15K, obj814-objMSC, objZ56-objBSS, objD5L-objNHG, obj2R5-objQGJ, objGWT-objLPR, objZM9-objRWL, objXK4-objXVV, objX2Q-objHGG, objRLY-obj2RY, obj837-obj7L4, obj7X4-objZL8, obj1Q3-obj1TJ, obj2KX-objZ44, obj6W4-objZM1, objC7J-obj8J1, obj17L-objTD1, obj1F5-objL2V, objWDQ-objZK3, objYY8-objSFX, objH82-obj4HJ, obj28T-objD94, objF5F-objXMT, objKP8-objBZ8, obj116-obj9KS, objGSK-objK66, obj6QB-objHD7, objNGP-obj4X5, objPRZ-objTTY, objWRZ-obj2YT, objBJG-objSGR, obj7ZF-objTFK, obj1MY-obj826, obj825-objPGZ, objPJ5-obj9WR, objPV1-objXV7, obj516-obj85D, objLQK-objM96, objB6L-objLZK, obj2TM-objDYR, objFYH-objSZ9, objLKT-objLTW, objPDT-obj79D, objWQQ-objDYT, obj7PW-objF81, objKSB-objCNV, objBGN-objXQJ, objMC6-objZVC, obj2XC-objM4S, objF7B-objPZ2, obj1YP-objQVB, obj2FY-objKT9, objTQZ-objS7J, obj3V6-obj9T9, objCBG-objXS5, objR59-objDLS, objGT6-obj793, obj4BS-objFT7, objXY4-obj6LN, obj9VF-objFH9, objGSV-obj6PV, objV4H-objJLP, obj72K-objCQS, objDLN-objZVL, obj7RS-objRQF, objK2R-objJ94, objM64-obj94M, obj5FD-objFJX, obj5PV-objR11, objS4B-objCVQ, obj66K-objWBP, objDZK-objZ5S, objMZJ-objPCR, obj2FY-objBYK, obj8J1-obj7RT, objN31-objGPX, obj7Y6-objHQC, obj6CQ-objW75, obj7BP-obj7SL, objNCL-obj3FP, obj6JF-objYPL, objXJH-objZ56, objX6W-objCHY, objS27-obj5KS, obj96R-objZT8, objP71-objSGT, objYQB-objB8S, objMZ8-objDBK, obj2MY-objNX5, objGHK-objN4C, obj5GT-objYS5, objP5K-obj1MP, obj96D-objQM1, objTVJ-objPWV, objVTR-objX84, obj7HK-obj78Q, objMQK-objGBL, objMXW-objMWN, objMNL-objVMK, objNHM-objPQL, objWXW-objRXQ, objB34-obj1NC, objJ9D-objY55, objV8Z-objPDT, objMB7-obj24V, objFTQ-obj8WG, objVFT-objXCY, obj22B-obj8NT, objC4W-obj4ZP, objJG5-objWSW, objPGF-obj15T, objF7H-obj8CH, objL2W-obj9HB, objJLZ-objF5P, objSRV-objHQ3, objSLJ-objTGQ, objNJZ-objC7L, objM77-objDHD, objQVB-obj165, objZ6B-objQM3, objHGQ-objQB2, obj15C-objM31, objK1X-objFKS, objRXQ-objG7Z, obj7TF-objDKC, obj7G2-obj7PM, objBNL-objKGL, objB52-objVRR, obj81P-objVGK, objP61-objLMP, objFB2-objLBH, objY3Z-obj5VH, objLBD-objX4F, objH35-objCSR, objQFR-objC9P, objDQ9-obj54N, objTJ2-obj5TR, obj93B-objSP7, objBX1-obj98H, obj1BQ-objBSC, obj4WC-objWR5, objVT6-objHR2, obj2BV-objJ4T, objHVC-obj3F7, objSNP-obj845, objV6G-obj8CW, obj585-objWC9, obj6GZ-objC5Z, objVWY-objLVH, objQV2-objVL5, objHNT-objV4H, objHX7-objW7K, obj4HJ-objBVF, objMZ1-objJY6, obj7DG-obj69G, objLZK-obj673, objV16-objSJF, objN8R-obj8XP, objSQZ-objBTC, obj63B-obj66P, objMKY-objSDD, objTR2-obj6R9, objDYT-obj5WV, objV9L-objCYX, objSJP-objR9V, objZTP-objNJ6, objXVV-objDC7, objSNP-objVJZ, obj77Y-objNYH, obj8G7-objWDH, objZRX-objHNB, objB6G-objQCM, objY82-objV9B, objKVL-objFGP, objCFQ-objK4Q, objT87-objGHW, objMJG-objWKH, objDDH-objFNZ, obj86Y-objCDJ, objLBN-obj5HX, obj7JB-obj4Y3, objKG3-obj8CC, obj2XG-objZ95, objCWH-obj3NW, objNB7-objMC6, objDC2-obj6Y9, objGWD-objRPZ, objGYH-objJTX, objPQR-obj6GT, obj7PF-objF8G, objBJV-objD1M, objGDN-objMHF, obj54N-objW4B, objX1V-obj3LL, objY3Y-objVWY, objT17-objY65, objBVR-objH1K, objH42-obj56T, obj22M-objBW9, objCS8-obj71W, objKMW-obj143, objWWS-objRQ6, objNMV-objJ4Q, obj58F-objV8P, objMPZ-objQ33, objDDX-objY3B, objLPF-obj7HH, obj9RS-objRLY, objLQW-objCWH, obj9Q7-objZZ9, obj5S8-obj96D, objD7B-objYFZ, obj8WY-objHLS, obj4SM-objP6M, objWC9-objZTD, objJ94-objN6F, obj7L1-obj2TC, objYGY-objXW6, objHBQ-obj2X1, obj742-objC49, objDQ4-objS4X, objL8X-objB39, objWXY-objYVW, objJX3-objYMS, objZWR-obj3RK, objTDH-objP14, obj58H-obj9BX, objY4Q-obj8Z6, objVCK-objKGY, objP14-objT6K, objQB2-obj96R, objP7B-objFH8, obj9RR-obj2VJ, obj15T-objTLN, obj75Z-objGVQ, objN8D-objG92, objG7Z-objKR3, objHTW-objX7W, objCTC-objCYZ, obj59Q-objHKB, obj87N-obj2BX, objGH3-obj87W, obj663-objRG4, objDZW-obj797, objZNV-objMYM, objC1C-objSM8, objHYL-objP88, objSPB-objCZV, objS4G-objS9M, objD7T-objJ6J, obj3SW-objS7Y, objYS5-objDDG, objWJC-obj7SR, obj98H-obj885, objCPT-objBGN, objGQD-objSLJ, objXQ7-objZ2T, objY5W-obj55M, objTFR-obj4PS, objHQC-objSQK, obj4M3-objVPP, objGCH-objBZ9, obj644-objG5N, objMXP-objJYN, objCBZ-objRB3, objRGH-objSJZ, objGVQ-objMVL, obj2WK-objMR9, objSL3-objJRX, objVT3-obj58F, objG1C-objJ9C, objKB5-objC5D, objVT6-objSP9, obj578-objZTH, objGBL-objH69, objM8Y-obj6DP, objCTM-objB69, obj28Q-obj7DG, objH5K-objWS7, obj1NR-obj62Y, objF54-objHPQ, objGV6-objV8Z, objY1D-objD15, objFFL-objJ6R, objZ2N-obj7WG, objR2N-objM9V, obj21Y-objFVT, obj7RS-obj5S4, objZ19-objKJY, objW9C-objJD5, objNNM-objNHT, obj24T-objDGG, objGB3-objGV9, objMYL-objXF3, objH9V-objFFL, objQM1-objKVL, objWBP-objM7J, objF7C-objJWR, objBWZ-objLMZ, objZ5Y-obj7S6, objCOM-objHKS, objXFT-objGB3, objHH6-objXFX, objR2X-objKV7, obj5W2-objF9M, obj4CK-objRFB, obj71W-obj8GG, obj8XP-obj825, objTLN-objQXJ, objWD9-objTXX, objR6R-objWDY, obj4N7-objDQ4, objNKW-obj85Y, obj28N-obj4GR, objSRQ-objNR7, obj3SP-obj63P, obj99K-objGHK, objVZC-objDYL, objD7H-objLQK, obj7HK-objH1F, objD6N-objTG1, objP82-objC56, objJX2-objWD1, objZHN-objCTR, obj5KC-objS27, obj24D-obj7HW, obj77Y-objV1H, objN21-objY3Y, objDJV-objSTY, obj5YQ-obj837, objZ31-objH4N, obj9FT-obj7PB, obj79Q-objGKT, obj6JX-objQH8, objKR3-obj8ZQ, obj955-obj4CK, obj2X6-objL78, objZMW-objRBD, objD5P-obj9WL, objXMT-objPFQ, obj5MX-objKP2, obj8Z6-objCT6, objT59-objNN1, objCZG-objN8R, obj171-obj712, obj5FJ-objCND, objYGY-objRTS, obj6RK-obj5PY, objLVL-objP49, objTPK-obj34H, objS8L-obj59R, objDXB-objLDD, objM8T-objNCL, obj5RG-obj22B, objF2N-objDGB, objW9Y-obj26L, objN8F-objVJD, objQ4Z-objR3P, objV35-objQZW, obj13Y-objGL2, objXZ6-objRY8, objW6R-obj9D4, objR75-objP71, obj3TX-obj9K6, objD1M-objXHP, objHQ3-objKG1, objD4K-obj585, objRGN-objHG7, objFJX-objBVR, objNVP-objXSV, obj5BL-objGZ5, objTSY-objPG4, objZV9-objDLN, objNVN-objBTK, objM31-objQPD, objVKS-obj66K, objYPV-objMQK, objL5B-obj5JH, objHL2-obj9VF, objH9D-objSWJ, objJ3S-objXNB, objT2J-objYOU, obj3LL-obj7PW, objH88-objZRF, objNQ1-obj1SS, objXFS-objRW5, objGPV-objNZ3, objTK2-objRXV, objCC8-objVKQ, obj6FV-objCVD, obj143-objGSV, objT5P-objY1D, obj7G5-obj7ZR, obj69B-objZ85, objYFZ-objXKZ, objMFH-obj8CK, obj4GR-objPSL, obj2HK-obj5W2, objJ3K-obj7BY, objZP1-objCQX, objJGR-objKVZ, obj199-obj75Z, objVL3-obj5B2, objN34-objQG7, obj2T7-objQPY, objGDG-obj3TJ, objS57-objVTX, objY61-objWXY, obj9ZK-objJL4, objZJJ-objJ69, objQNX-objDJ7, objSXK-objY82, objR9Y-objDDX, objZ95-objYZ1, objCQP-objPV1, obj1CD-obj24D, objJQY-objTDH, objP9Y-objWQ9, objW87-obj69S, objM7J-obj421, objXKV-objRJH, objMG7-objY5W, objBJV-objGLJ, objM37-objRK7, objHHB-obj5FD, objLJ4-obj7Q5, objZ5S-objTCC, obj5NX-objXYH, objBZR-objMQV, obj5HX-obj5DV, obj2CG-obj32G, objX4F-objN4V, objDFZ-objP7B, objDVP-objQ6F, objPWV-objTB3, objS9G-objTY2, objJ4T-objCPT, objLFF-objYDT, objTMW-objL5B, objHJJ-objB2N, obj1G6-objRFZ, objK2R-objHN4, objPZ2-objFRG, objFB7-obj8SV, objHZR-objS8L, obj1GW-obj486, obj8W2-objT97, objSJ5-objL1N, objF8G-obj58H, objC36-objDFQ, objZDV-objFG4, objDFQ-objGRW, objXWZ-obj21Y, objGPG-obj8SJ, objKJY-objGSK, objRKK-objVV6, objZVC-obj4ZL, objVSJ-objMJG, objTBG-objFD7, objSHX-objRW4, objLF9-obj9LF, objZV9-objKV5, obj8DJ-objSJJ, objJLP-objXKV, obj8SV-obj171, objSGR-objWDQ, objVH9-objD3K, objF9F-objW1Q, objVM9-obj8MH, objQX4-objPB2, objT9F-objTBG, objJG4-obj4LT, objKKD-obj7QN, objNSL-objW87, obj57J-objVB6, objWDY-obj7BP, objGSN-obj2XS, objFKS-obj1NX, objQFM-objPS9, objKGL-objVSY, obj5Q8-objG83, objD5Y-objWRZ, objLKR-objCLT, objDST-objTM2, objKHV-objYGY, objXJH-objN8F, objM8Y-objBQ7, objQHV-objYWT, objYK3-objD5P, objKV5-obj8F3, objDLS-obj5BL, objP5F-objZL2, objRVF-objGT6, obj4BV-obj97N, objS8B-obj62C, objHRL-obj7BF, obj1Y7-objP9Y, objWNT-obj36V, objCVD-objG1C, objD1Z-obj3SH, objPLW-obj2CG, objZ6L-objY8G, objZZ9-objGR3, objG83-obj1WM, objN38-objJ8Q, objMJF-obj7JB, objD1F-obj1Y3, obj8Y5-objND3, objK51-objYY8, obj1BW-objY27, objGML-objMNN, objRF4-obj2Z9, obj4BM-objT73, objGS4-objLFF, objKTM-objWFB, obj85D-objNH8, objMCD-objWM4, obj2T5-obj811, obj8ZQ-objB9S, objJV1-objJHZ, objJDP-objB7S, obj7DG-objZNV, objG5K-objY4V, objM5Y-objBZC, objG5N-objYZ2, objXQJ-obj7NN, obj54M-objCDL, obj8TV-obj41S, obj3JL-obj6F6, obj1MP-obj2T5, objVZV-objNSP, obj5S4-objMB3, objBXT-obj5FJ, objK9B-objX5N, objH79-obj72K, objB2N-obj8NH, obj7HD-obj7G3, objJZC-objL7D, objWF6-objZ3T, objVPW-objTFP, objGMV-objCZG, obj7PB-obj2HK, objW1Q-obj37S, objZM1-objLMJ, obj14Y-obj36J, objYZ1-objCL9, objZDF-obj2SC, objHYL-objSNP, objZ44-obj199, obj6ZW-objC4W, obj7VR-obj5L5, obj13V-obj1FF, objCDJ-objJBL, objYWT-objGV6, objH22-obj7N5, objCXR-obj7HK, objJ6R-objT5K, objGR3-objTX9, obj73H-obj9YN, objKV7-objJX3, objMYM-obj15C, obj66P-objMXW, obj7ZR-obj9W5, obj1WM-objJYS, obj4BC-obj478, obj3FP-objP7F, objDHZ-obj6T3, objGJB-objY3K, objHNB-objLP6, objPY5-obj6CQ, objJ3W-objMD9, objXCH-objGZ8, objB5P-obj9PL, objZD2-objWD9, objSJJ-objM9T, obj9W5-objDCP, obj5B2-objZM4, objJY6-obj26S, objY55-objW37, objJ69-objVN6, objWM4-objRNY, objQBJ-objQPV, objJ9C-objGTP, obj8YQ-objH42, objW78-objZS5, obj8MH-objC3J, objMSC-obj7RS, objHPJ-objWMS, objK66-objR5F, obj7SR-obj5MT, obj8W3-obj28N, objTQ3-obj9KL, obj2CX-objHVC, objPY5-obj76X, objT9H-obj2SD, objBNX-obj97Q, objXK9-objMZ1, objPQS-objDH1, obj1TS-objZR4, objK9C-objK8D, obj67W-objL8T, objCKC-objBCX, objLMP-obj7LY, objNBD-objXQ7, obj6Y9-obj61W, obj1SK-objNQM, objP1W-objRLW, obj7LR-objB52, objK5G-objT2J, objR2K-objD1F, obj7MZ-objBWZ, objDYR-objBNQ, objRPZ-objM5S, obj6NZ-objV16, objZK3-objH35, objJ3V-objHGX, obj2Z9-objD7T, objCF2-objTGK, objNH8-obj2BV, obj3F7-objQK8, obj8NH-objYP6, objR9V-objMJ9, objGL2-objVRF, objBWX-obj1X5, objSMH-obj923, objN4V-objZN7, objP4B-objB36, obj537-objGWD, objCHF-objXNK, objKGY-objF54, obj1Y3-objQLD, objTJ1-objSGC, objXS5-objRQ2, objNFN-objRM6, obj343-objNGP, objR8L-objNMV, objTSY-objK2H, obj7HN-objP9J, objWSW-objKK3, objXKZ-objD5L, objLF9-obj5WX, objTY2-obj93B, objHYB-obj87Q, objC56-objDHZ, objL5G-obj4BC, obj9SP-objP4G, objDVP-objL9C, objDJ5-objZ6L, objKMP-objSV3, objH19-objTDN, obj1B7-obj9WN, obj797-objP82, obj6PV-objWNB, objDBC-objDRK, objJWR-objJ2B, objMX9-objSPB, objFSN-objBF7, objSQC-objNBW, objWKH-objCMV, objPFQ-objQS7, obj3WQ-objDDB, obj354-objF17, objRLW-objRF7, objTGK-obj4WP, obj87T-objW78, objK1T-objXTC, obj4T1-objDZK, objJQG-obj5Q8, objZ6B-objV82, objJPL-obj57J, obj2QG-objFJ4, objL17-objW9C, obj62C-objYRZ, objP6M-obj8FV, objQD2-objRGN, objC23-obj3B3, obj8CN-objZDV, objBW9-objJG4, objZ2T-obj523, objFFQ-obj99K, objFRS-objRBF, objMG5-obj7LR, obj6LN-objQBT, objK3K-objQTK, objWMS-objS67, objGH3-objFB2, objK6D-objZRX, objTMJ-obj9PH, obj2PZ-obj8YQ, obj97Q-objRGH, objF8X-objHBQ, obj5NT-objH19, objC4W-obj6YM, objF81-objQ62, objJQR-objHB5, objFZB-objR9B, obj59W-obj9ZK, obj84Y-obj9VY, objT8Z-objYPG, obj9PL-objMDM, obj3TX-obj7G2, obj1X5-obj1GW, objKP2-objBX1, obj1M4-objK51, obj9TS-obj794, obj26L-objH5K, objHH6-obj2FY, objHWH-obj9X9, objRW5-objMLZ, objP9S-objGCH, objHD8-obj6CD, objRJH-objPM2, objYJH-obj4BS, obj46H-obj2WK, objRLP-objD3F, objCDL-objVTR, objM2V-objKFH, objQX1-objDX5, obj2X9-objH6R, objWS7-objBCZ, obj2VJ-objTR2, objFVQ-obj1TS, objKFH-obj6N4, objH1F-objT3D, objLQ2-objSJQ, obj79D-objXCP, obj2RR-objP7P, objDS8-objPYG, objK84-obj9T5, objC2Y-objT7K, objM9W-obj9H6, objDRK-obj8QX, obj69G-objHJJ, obj2ZD-obj4H2, objBCZ-objSQZ, obj5WX-obj91S, obj87W-objBLG, objXR3-obj9Q7, objNLC-objKS4, objZPQ-objXFT, obj68Q-objS8D, obj8RH-obj564, objBZ9-objNCK, objDBS-objJ31, objS7Y-objNSH, objJBW-objQLF, objCQS-objSZP, obj8CK-objGPG, objF35-objPRF, obj562-objLJ4, obj7S6-obj2X6, obj8FD-objC5F, objTRS-objCNS, objDKC-obj1G6, obj9PH-obj4C3, objHR2-obj1PR, objJBL-objZD2, objFH8-objJGR, obj1CZ-objQ2T, objPS9-objZM7, objFGP-objP8L, objVDF-objG7R, objRY8-obj644, objZXM-objWYR, obj1SS-objVCB, objW37-objMTQ, objTQZ-objNB7, obj9RJ-objDVP, objRB3-objGYH, objMZD-objN8D, obj68D-objLKC, objMMW-objCHF, objLWX-objZJJ, objGV9-objN38, objT3D-objZ19, objLL3-objH9V, objRR5-objT8X, obj5Q8-objL13, objF8B-objPV7, objBZR-obj63Y, obj1YT-objMJ5, objL5Q-obj87T, objB2J-objY4Q, objK1R-obj9D5, obj59R-objQFM, objJTM-obj9RR, obj2SD-objZD7, obj1M7-obj3JL, objNX8-objFSN, objLBM-objM5Y, objYW6-objYM2, objGWV-obj955, objP31-obj1YT, objCND-objVM2, objPGZ-obj5CM, objBLG-objN6R, obj4W3-objLLC, objWVJ-objVL3, objL88-objJ9D, obj837-obj8FD, objXW6-objNKW, objGPX-objGQD, obj858-obj5S1, objNSH-objHPJ, obj3B3-obj415, obj9RZ-obj7GZ, objB28-objMPM, obj7PM-objSB1, objBSS-objM2V, objJPX-objWZ3, objVL5-objRRK, objT51-objJJ2, objNLJ-objFZT, obj9L9-objR1T, obj5PY-obj8TM, obj9T5-obj8TV, objDDB-objXVJ, obj4SM-objVCW, objTSH-objY9L, objKS4-objWJC, obj55M-objS24, objCQX-objDXC, obj8WP-objP2Y, objDQ4-obj13V, obj9BX-objCS8, objD4K-objXKB, objV82-objDVZ, objC7P-objD9D, objMFT-objJ4M, objWS8-objDFZ, objLZ6-objJ3Q, objFKS-objTFR, obj78Q-objLZ6, obj16R-objFYH, objGTS-objDV9, objH1Z-obj7JW, objH5Z-objWPW, obj5HD-objRKH, objBT2-objRJ1, objTXX-objB6G, obj212-objRKK, objVPP-objWSS, obj1XM-objYV3, objJJG-objBMW, objVR3-objPHX, objLWT-obj24W, objCVL-objD7B, obj923-objJV1, obj1SK-objK62, objP49-objP5K, obj7L4-objQBJ, objWGW-obj3NQ, objX7C-obj3SP, objKZX-obj2QG, objCL9-objVWR, objHSN-objP5F, objM8M-objXWS, objDWY-objDST, obj7HL-obj8G7, objPBV-objW2Y, objGQP-obj4LX, objQGJ-objMH7, obj885-objWXW, objL9C-objNFN, objYPG-objSH1, objVSY-objH5F, objJSR-objVWV, objWDH-obj14Y, objKHV-objDBS, objJ3S-objSC8, objTXX-objB3L, objXF3-objH95, obj4LT-objGZ1, objMLZ-objS15, objZS9-objNLH, objF14-objZP3, objKB5-objSVJ, objLP6-obj44K, objZL2-objMML, obj9ZM-objGMV, objJQS-obj2GY, obj5J9-obj69X, objSH1-objJPP, objD26-obj5F8, objDH1-objRK6, objD6D-objSZT, objW2Y-objZSL, obj15K-objP61, objGZ8-obj4W3, objYJ4-obj461, objLM3-objK45, objR3P-objTPK, objHN6-objGHT, objW7T-objGZT, objJVP-obj43H, objLP6-objGWT, obj246-objCC8, objN9G-objJ5R, obj7NN-objDCC, objLBH-objF7B, obj2TP-objYL5, objRM6-obj5RG, objKWL-objRZ4, objHHB-obj7X4, objGR4-obj984, objM9T-objHGK, objM4Q-objJYK, obj2GY-objZY8, obj8GG-objRSR, objF25-objD6D, objQJN-obj68D, objNJ6-obj687, obj5KS-objTYC, objF83-obj197, obj9K6-objXR3, objYZZ-objBNL, obj5RG-objHN6, objF31-obj2ZD, objBMW-obj6G9, objQFG-obj46H, objJCR-objLWX, objHN4-objVRM, obj6TK-objY3Z, objS7J-objK9B, obj3QZ-objSD7, objW59-objQ2Z, obj99C-objB2J, obj61W-objJPX, obj4ZY-objSHX, obj8XF-obj87N, objNSP-objS2S, objZTD-obj859, obj3NW-objM8M, obj2YT-objC7J, obj421-objXJH, objT73-objF69, objZNV-objYW6, objQBJ-objY7T, objV2S-objMMV, objZD7-objZ15, objJRN-objVKS, objZM7-objQK3, objC84-objGHQ, objC5D-objKJB, objDBS-objSJ5, obj7HH-objH88, obj165-objR2X, objXNK-objFTQ, objRK7-objP31, obj84H-obj858, obj7RW-objX46, objXLH-objVCK, objDHR-objDZW, objGTN-objTNP, objHYQ-obj4N7, objRW4-obj7ZF, obj43H-objM98, objX7W-obj5G6, obj6GT-obj839, objCTR-objZ9F, objQ8P-objGDN, obj8FV-obj6QB, objL13-obj2RR, objZVL-objKBZ, objQ2Z-objJLZ, objBC6-objWQH, objMJ5-obj69L, obj4R2-objG87, objSFX-obj77Y, objBWZ-objKMP, objSTY-obj343, objT4X-obj1HW, objWQF-objTSH, obj4X5-obj3TX, objG23-objJSR, objDNQ-objYJ4, objJHZ-objF14, objS42-objDWY, objHB5-objYJ6, objHGG-objXMD, objLYY-objKMJ, objXYH-objBXT, obj7BB-objB7P, objZSL-objG5K, objG1P-objL2W, objMFF-objHZ1, objJJ2-objN34, objM8M-obj7TF, objFC6-objMFT, objW59-objQHK, obj5DV-objQZ2, objJ5G-obj6GZ, obj8T3-obj5YQ, obj7QN-obj8Y5, obj1X5-objSX3, objDV2-objH45, objRXQ-obj4M4, objL78-objLG1, objKG1-objZM9, obj8QX-objQSH, objMQV-objRLP, objHD7-objB8D, obj82H-obj7VR, objZP3-objDHR, objCNR-objLVL, objWR5-obj9RZ, obj7BY-objLBN, objZVC-objCXR, objQ9W-objDQF, obj2BJ-objTCX, objJYN-objHYB, obj64X-objWNT, objY9F-objQBW, objBZ8-obj2R5, objPJ1-objK5T, objTQN-objBJD, objXVJ-objBB8, objS2S-objBWX, obj2ZS-objK4C, objVTX-objP6D, objKY9-objTJS, objQHK-obj5X1, obj3WJ-objL5J, objSX3-objCFQ, objLCB-objXTM, objMJP-objDKB, objCSR-objZML, objXR3-objB41, objJD5-objN9G, objJPX-obj1BQ, objRWL-objDX1, objYBG-objQX1, objM33-objMKY, obj5S1-objD6Y, objTRS-obj5NK, objTNP-objLH6, objCNS-objMCR, objJ3Q-objKWL, objT4W-obj8W9, objVJY-obj6WQ, objJBJ-objPJ1, obj2RR-objQ8P, objJ4M-objWQQ, obj69S-objTJ2, objNCK-obj16R, obj6H7-objQF9, obj8Y5-objJ3S, obj77T-objLBD, objKB3-objJRN, objFNZ-obj1Q3, objKJY-objDHS, obj44V-objGWV, objNHG-objTWX, objVRM-objBDR, objYZJ-objBNX, objDC7-objYXN, objMR8-objG23, objMCR-objBM7, objHGQ-obj7L5, objYL5-objNBD, objQB2-objDJ5, objCB1-obj4JP, objBZC-obj7RG, objVJZ-obj3BC, objVWV-objM33, objDT7-objNTG, objDTK-objTDB, obj3P8-objT44, objJL4-obj76M, obj7N5-objGPV, objZZ4-obj9DX, obj55B-obj59F, objD94-obj4ZY, obj5G3-objM9W, objDHT-objSK7, objTZN-obj2CD, objQXJ-objCNK, objWFB-objS42, obj7JW-obj1SK, objX51-objCYP, obj6DP-objPBL, obj5BS-objLF9, obj3NQ-objDV2, objY8G-objWDJ, obj4BW-objD1Z, obj1GH-objBC2, obj9H6-obj7GH, obj1XC-obj6FV, objNZ3-obj59Q, obj8CC-objNXM, obj9WR-obj7L1, objDCC-obj498, objTGQ-obj85Z, obj4H2-obj4T1, objVSY-objL7R, obj4ZL-objSRV, objPHX-obj2MY, objT8X-objXBQ, objXCY-objMCD, obj5R2-objTF6, objVKS-objJWD, obj9T9-objT17, obj8F3-objXNT, objDH1-objNVN, objVB6-objP9S, obj7Y6-objC84, obj3F7-obj3WJ, obj1NY-objJQG, objLDS-objGXT, obj4WP-objHNT, objTG1-obj562, objKJB-objTQZ, objD9D-objT9H, objXSV-objC1M, objX3Z-objZMX, objRXV-objHPL, obj1BQ-obj1M4, objHNT-obj4MP, objPBL-objK84, objT97-objDT7, obj65J-objCNR, obj7GZ-objPCZ, objGHT-objZDF, objL7R-objW9Y, objNHT-objHX7, objSDZ-objMJP, objBV6-obj374, obj13H-objM5L, objYXN-objXFS, objDCP-obj1NY, objSV3-obj33T, obj415-objB34, obj8NL-objDS8, objRM5-obj796, objG1W-objRK1, obj5CJ-objSMH, objJBL-obj974, objHPL-objM3M, objXNB-objMB7, objH9D-objDQ9, obj4JB-obj6JX, objXR5-objB22, objBMK-objRR5, objKD3-objD7H, obj76X-objCTC, objTQD-obj56X, objWZY-obj84Y, objHSZ-obj663, objSJZ-objNHV, objRSR-obj7MF, objWB3-obj537, obj62Y-objLHR, objH69-obj26P, obj811-obj167, objK65-obj7VL, objQ62-obj3PG, objYZ2-objC1C, obj56X-objVFS, obj6WQ-obj8NF, objDP3-objPJF, obj62D-objNHM, objT44-objF8B, objNDB-objK1T, objLVH-objHFP, obj96D-objYSP, obj2N9-obj4BM, obj89B-obj246, objT3D-objKH1, objY4V-obj2CX, obj6DP-objTQ1, obj5CM-obj9TB, objPHX-obj5NT, obj6LW-objZQQ, obj7LT-objK1R, objHBJ-obj9L9, objXW6-objNNM, objBCX-objKB5, obj8WG-objZXM],
Starchart).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment