#define ANS[x] letter-num(answers[ca][x]) #define NDIR dir.size #define NIT items.size enum dir = {N, NE, E, SE, S, SW, W, NW, UP, DOWN}; enum items = {BENCH, WATER_FOUNTAIN, LAMPPOST, EMERGENCY_PHONE, ELEVATOR, DOOR, STAIRS, BATHROOM, FIRE_HYDRANT, TABLE}; int main() { string answers[12] = load_puzzle_answers(); while (!(ends-with-pronoun(answers[0]) && is-dictionary-word(change-first-letter('W',answers[1])) && is-edible(answers[2]) && is-CS-profs-name(answers[3]) && is-traffic-sign(answers[4]) && all-vowels-are-A(answers[5]) && has-double-letter(answers[6]) && is-dance-style(answers[7]) && is-NY-township(answers[8]) && is-world-capital(answers[9]) && has-homophone(answers[10]) && is-dictionary-word(reverse(answers[11])) && answers[4].length == answers[11].length)) { shuffle(answers); } // find starting point int l[] = answers.lengths(); int bldg = median(l); goto-outside-corner-of(bldg,dir[max(l) % NDIR]); int ca = 0; // now go! go_meters(dir[ANS[0] % NDIR],2*ANS[2]-ANS[1]); turn_ccw_deg(2*(ANS[0]+ANS[2])); ca++; go_past(items[ANS[1] % NIT],ANS.length); go_meters(dir[ANS[2] % NDIR],ANS[0]+ANS[4]); ca++; for (int q = ANS[0]; q < ANS[3] ; q++) use_closest(items[ANS[1] % NIT],dir[ANS[0] % NDIR]); ca++; if (outside()) { go_meters(dir[ANS[1] % NDIR],ANS[1]+ANS[4]); ca++; } else { go_meters(dir[ANS[0] % NDIR],3*(ANS[1]-ANS[4])); } turn_absolute(dir[(ANS[1]+ANS[3]) % NDIR]); ca++; go_past(items[abs(ANS[0]-ANS[1]) % NIT],ANS[1]-ANS[2]); try { use_closest(items[ANS[3] % NIT],dir[(4*curr_floor()) % NDIR]); ca++; go_past(items[(int)((ANS[0]-ANS[1])/3)], ANS[2]); go_meters(dir[ANS[2] % NDIR], ANS[0]); ca++; turn_ccw(45*ANS[3]); go_past(items[ANS[1] % NIT], ANS[0]); } catch(plummet) { goto(plummet.landing-spot) } go_outside(CLOSEST); switch(last_bldg()%2) { case 0: turn_absolute(dir[ANS[2] % NDIR]); ca++; go_past(items[ANS[3] % NIT],ANS[1] % 6); break; case 1: ca++; go_meters(dir[ANS[0] % NDIR],ANS[1]-ANS[0]); default: go_to_nearest(items[ANS[4] % NIT]); ca++; go_meters(dir[ANS[1] % NDIR],ANS[1]+ANS[3]); break; } turn_absolute(dir[ANS[0] % NDIR]); ca++; go_past(items[ANS[2] % NIT],ANS[2]-ANS[0]); go_inside(CLOSEST); goto_closest(items[(ANS[0]+ANS[1]) % NIT]); goto_closest(items[ANS[3] % NIT]); ca++; go_meters(dir[ANS[1] % NDIR],abs(ANS[0]-ANS[1])); int nextd = ANS[0]+ANS[3]; if (current_bldg() % (ANS[2]-ANS[1])) nextd += ANS[2]; else nextd -= ANS[2]; turn_absolute(dir[nextd % NDIR]); go_far_as_possible(); ca++; turn_ccw_deg(18*ANS[2]); go_far_as_possible(); r = room_at(dir[ANS[3] % NDIR]); r.bldg += ANS[3]-ANS[2]; r.room += ANS[2]*ANS[2]; goto_door_of(r); ca++; goto_last_seen(items[(int)(ANS[0]/2)]); use_closest(items[ANS[1] % NIT],dir[(2*ANS[1]) % NDIR]); look_ahead_meters(ANS[0]); // Congratulations! }