mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-26 21:30:31 +01:00
Really ugly but working day 17 part 2.
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <string_view>
|
||||||
|
#include <cassert>
|
||||||
#include "days.hpp"
|
#include "days.hpp"
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
#include "point.hpp"
|
#include "point.hpp"
|
||||||
@@ -60,5 +62,38 @@ void aoc2019::day17_part1(std::istream &input, std::ostream &output) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void aoc2019::day17_part2(std::istream &input, std::ostream &output) {
|
void aoc2019::day17_part2(std::istream &input, std::ostream &output) {
|
||||||
output << "Not implemented\n";
|
using namespace std::literals;
|
||||||
|
|
||||||
|
aoc2019::IntCodeComputer computer(input);
|
||||||
|
computer[0] = 2;
|
||||||
|
std::deque<std::int64_t> output_buffer;
|
||||||
|
computer.connectOutput(output_buffer);
|
||||||
|
|
||||||
|
std::array<std::string_view, 3> programs = {
|
||||||
|
"L,6,R,8,L,4,R,8,L,12\n",
|
||||||
|
"L,12,R,10,L,4\n",
|
||||||
|
"L,12,L,6,L,4,L,4\n",
|
||||||
|
};
|
||||||
|
|
||||||
|
auto combined_programs = "A,B,B,C,B,C,B,C,A,A\n"sv;
|
||||||
|
|
||||||
|
computer.sendInputs(combined_programs);
|
||||||
|
|
||||||
|
for (auto program : programs) {
|
||||||
|
computer.sendInputs(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't give me output.
|
||||||
|
computer.sendInputs("n\n");
|
||||||
|
|
||||||
|
computer.run();
|
||||||
|
|
||||||
|
assert(!output_buffer.empty());
|
||||||
|
|
||||||
|
if (output_buffer.size() == 1) {
|
||||||
|
output << output_buffer.front() << std::endl;
|
||||||
|
} else {
|
||||||
|
std::copy(output_buffer.begin(), output_buffer.end(), std::ostreambuf_iterator<char>(output));
|
||||||
|
output << output_buffer.back() << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
76
2019/src/day17/route-map.py
Normal file
76
2019/src/day17/route-map.py
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import fileinput
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def turn_left(direction):
|
||||||
|
x, y = direction
|
||||||
|
return (y, -x)
|
||||||
|
|
||||||
|
|
||||||
|
def turn_right(direction):
|
||||||
|
x, y = direction
|
||||||
|
return (-y, x)
|
||||||
|
|
||||||
|
|
||||||
|
def add(pos, direction):
|
||||||
|
return tuple(a + b for a, b in zip(pos, direction))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
chart = [line.strip() for line in fileinput.input()]
|
||||||
|
|
||||||
|
pos = None
|
||||||
|
|
||||||
|
for y, line in enumerate(chart):
|
||||||
|
x = line.find('^')
|
||||||
|
if x >= 0:
|
||||||
|
pos = (x, y)
|
||||||
|
break
|
||||||
|
|
||||||
|
if not pos:
|
||||||
|
sys.exit('starting point not found')
|
||||||
|
|
||||||
|
route = ['L']
|
||||||
|
|
||||||
|
direction = (-1, 0)
|
||||||
|
|
||||||
|
def bounds_check(pos):
|
||||||
|
x, y = pos
|
||||||
|
|
||||||
|
return x >= 0 and y >= 0 and y < len(chart)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# try to move forward
|
||||||
|
next_pos = add(direction, pos)
|
||||||
|
dist = 0
|
||||||
|
|
||||||
|
while bounds_check(next_pos) and chart[next_pos[1]][next_pos[0]] == '#':
|
||||||
|
dist += 1
|
||||||
|
pos = next_pos
|
||||||
|
next_pos = add(direction, pos)
|
||||||
|
|
||||||
|
if dist:
|
||||||
|
route.append(dist)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
for move, new_dir in zip(('L', 'R'), (turn_left(direction), turn_right(direction))):
|
||||||
|
next_pos = add(pos, new_dir)
|
||||||
|
if bounds_check(next_pos) and chart[next_pos[1]][next_pos[0]] == '#':
|
||||||
|
route.append(move)
|
||||||
|
direction = new_dir
|
||||||
|
break
|
||||||
|
|
||||||
|
printable_route = []
|
||||||
|
for x in route:
|
||||||
|
if x == 'L' or x == 'R':
|
||||||
|
printable_route.append(x)
|
||||||
|
else:
|
||||||
|
printable_route += ['M'] * x
|
||||||
|
|
||||||
|
print(','.join(str(x) for x in route))
|
||||||
|
print(','.join(printable_route))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -183,3 +183,9 @@ aoc2019::IntCodeComputer::value_t &aoc2019::IntCodeComputer::operator[](std::siz
|
|||||||
const aoc2019::IntCodeComputer::value_t &aoc2019::IntCodeComputer::operator[](std::size_t index) const {
|
const aoc2019::IntCodeComputer::value_t &aoc2019::IntCodeComputer::operator[](std::size_t index) const {
|
||||||
return program[index];
|
return program[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void aoc2019::IntCodeComputer::sendInputs(std::string_view str) {
|
||||||
|
for (char c : str) {
|
||||||
|
sendInput(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ namespace aoc2019 {
|
|||||||
void connectOutput(std::deque<value_t> &sink);
|
void connectOutput(std::deque<value_t> &sink);
|
||||||
void sendInput(value_t input);
|
void sendInput(value_t input);
|
||||||
|
|
||||||
|
void sendInputs(std::string_view str);
|
||||||
|
|
||||||
[[nodiscard]] bool isTerminated() const;
|
[[nodiscard]] bool isTerminated() const;
|
||||||
|
|
||||||
[[nodiscard]] const std::deque<value_t> ¤tInputs() const;
|
[[nodiscard]] const std::deque<value_t> ¤tInputs() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user