Add Crystal solution to day 13
This commit is contained in:
parent
8dda1b5ee2
commit
d8a62d2eb4
110
day13.cr
Normal file
110
day13.cr
Normal file
@ -0,0 +1,110 @@
|
||||
require "advent"
|
||||
INPUT = input(2022, 13).lines
|
||||
|
||||
class Tree
|
||||
property value : Int32?
|
||||
property values : Array(Tree)?
|
||||
|
||||
def initialize(@value, @values)
|
||||
end
|
||||
|
||||
def to_s(io)
|
||||
if mine = value
|
||||
io << "value: " << mine
|
||||
elsif mine = values
|
||||
io << "values: "
|
||||
mine.each do |v|
|
||||
io << "("
|
||||
v.to_s io
|
||||
io << ")"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def compare(other : Tree)
|
||||
if mine = value
|
||||
if yours = other.value
|
||||
return (mine - yours).sign
|
||||
end
|
||||
end
|
||||
|
||||
if mine = values
|
||||
if yours = other.values
|
||||
mine.size.times do |i|
|
||||
return 1 unless i < yours.size # Shorter list smaller
|
||||
comp = mine[i].compare yours[i]
|
||||
return comp if comp != 0
|
||||
end
|
||||
return mine.size == yours.size ? 0 : -1 # Shorter list smaller
|
||||
end
|
||||
end
|
||||
|
||||
if mine = value
|
||||
return Tree.new(nil, [self]).compare(other)
|
||||
elsif yours = other.value
|
||||
return compare(Tree.new(nil, [other]))
|
||||
end
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
def tree(i)
|
||||
Tree.new(i, nil)
|
||||
end
|
||||
|
||||
def list(is : Array(Int32))
|
||||
Tree.new(nil, is.map { |it| tree(it) })
|
||||
end
|
||||
|
||||
def list(is : Array(Tree))
|
||||
Tree.new(nil, is)
|
||||
end
|
||||
|
||||
def parse(string)
|
||||
stack = [[] of Tree]
|
||||
current = nil
|
||||
string.as(String).each_char do |c|
|
||||
if c == '['
|
||||
stack << [] of Tree
|
||||
elsif c.alphanumeric?
|
||||
if current.nil?
|
||||
current = c.to_i32
|
||||
else
|
||||
current = current * 10 + c.to_i32
|
||||
end
|
||||
elsif c == ','
|
||||
if num = current
|
||||
stack.last << tree(num)
|
||||
current = nil
|
||||
end
|
||||
elsif c == ']'
|
||||
if num = current
|
||||
stack.last << tree(num)
|
||||
current = nil
|
||||
end
|
||||
new_tree = Tree.new(nil, stack.pop)
|
||||
stack.last << new_tree
|
||||
end
|
||||
end
|
||||
return stack[0][0]
|
||||
end
|
||||
|
||||
puts parse("[[10,1,2],[],[]]")
|
||||
total = 0
|
||||
INPUT.in_groups_of(3).each_with_index do |group, i|
|
||||
t1 = parse(group[0])
|
||||
t2 = parse(group[1])
|
||||
cmp = t1.compare t2
|
||||
total += (i+1) if cmp != 1
|
||||
end
|
||||
puts total
|
||||
|
||||
trees = INPUT.reject { |it| it.empty? }.map { |it| parse(it) }
|
||||
d1 = parse("[[2]]")
|
||||
d2 = parse("[[6]]")
|
||||
trees << d1
|
||||
trees << d2
|
||||
trees.sort! do |l, r|
|
||||
l.compare r
|
||||
end
|
||||
puts (trees.index!(d1)+1)*(trees.index!(d2)+1)
|
Loading…
Reference in New Issue
Block a user