Add day 5 solutions
This commit is contained in:
parent
6e6d652858
commit
07d8457cd8
64
day5.chpl
Normal file
64
day5.chpl
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
use List;
|
||||||
|
use IO;
|
||||||
|
|
||||||
|
iter boxes() {
|
||||||
|
for line in stdin.lines() {
|
||||||
|
if line == "\n" then return;
|
||||||
|
var boxList = new list(string);
|
||||||
|
|
||||||
|
for idx in 0..<line.size by 4 align 1 {
|
||||||
|
boxList.append(line[idx]);
|
||||||
|
}
|
||||||
|
yield boxList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iter instructions() {
|
||||||
|
var n, from, to: int;
|
||||||
|
while readf("move %i from %i to %i\n", n, from, to) do yield (n, from-1, to-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
proc transpose(lists) {
|
||||||
|
var listsT: [0..<lists[0].size] list(string);
|
||||||
|
for lidx in 0..<(lists.size - 1) by -1 {
|
||||||
|
for (char, idx) in zip(lists[lidx], 0..) {
|
||||||
|
if char != ' ' then listsT[idx].append(char);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return listsT;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc moveOneAtATime(ref from: list(string), ref to: list(string), n: int) {
|
||||||
|
for i in 1..n {
|
||||||
|
to.append(from.pop());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc moveAll(ref from: list(string), ref to: list(string), n: int) {
|
||||||
|
var offset = from.size - n;
|
||||||
|
for i in 1..n {
|
||||||
|
to.append(from.pop(offset));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc tops(stacks) {
|
||||||
|
var acc = "";
|
||||||
|
for stack in stacks do acc += stack.last();
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
var layers = boxes();
|
||||||
|
var stacks = transpose(layers);
|
||||||
|
|
||||||
|
config const part = 1;
|
||||||
|
|
||||||
|
if part == 1 {
|
||||||
|
for (n, from, to) in instructions() {
|
||||||
|
moveOneAtATime(stacks[from], stacks[to], n);
|
||||||
|
}
|
||||||
|
} else if part == 2 {
|
||||||
|
for (n, from, to) in instructions() {
|
||||||
|
moveAll(stacks[from], stacks[to], n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writeln(tops(stacks));
|
47
day5.cr
Normal file
47
day5.cr
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
require "advent"
|
||||||
|
boxes, instructions = input(2022, 5).split("\n\n")
|
||||||
|
boxes = parse_boxes_lines(boxes.lines);
|
||||||
|
instrs = parse_instrs(instructions.lines);
|
||||||
|
|
||||||
|
def parse_instr(str)
|
||||||
|
_, n, _, f, _, t = str.split(" ")
|
||||||
|
{ n.to_i64, f.to_i64, t.to_i64 }
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_instrs(lines)
|
||||||
|
lines.map { |l| parse_instr(l) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_boxes_line(str)
|
||||||
|
str += " "
|
||||||
|
str.chars.in_groups_of(4).map do |group|
|
||||||
|
group[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_boxes_lines(lines)
|
||||||
|
lines.pop
|
||||||
|
lines = lines.map { |l| parse_boxes_line(l) }
|
||||||
|
lines = lines.transpose
|
||||||
|
lines.each do |line|
|
||||||
|
line.reject!(&.==(' ')).reverse!
|
||||||
|
end
|
||||||
|
lines
|
||||||
|
end
|
||||||
|
|
||||||
|
def move(from, to, n)
|
||||||
|
# n.times do
|
||||||
|
# to << from.pop
|
||||||
|
# end
|
||||||
|
from.pop(n).each do |x|
|
||||||
|
next unless x
|
||||||
|
to.push(x)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
instrs.each do |instr|
|
||||||
|
n, f, t = instr
|
||||||
|
move(boxes[f-1], boxes[t-1], n)
|
||||||
|
end
|
||||||
|
|
||||||
|
puts boxes.map(&.last).join("")
|
Loading…
Reference in New Issue
Block a user