parent
be245847a2
commit
1f6f3b62f6
@ -0,0 +1,55 @@
|
|||||||
|
class Tile
|
||||||
|
SIZE = 10
|
||||||
|
|
||||||
|
attr_reader :raw
|
||||||
|
|
||||||
|
def initialize(raw)
|
||||||
|
@raw = raw
|
||||||
|
end
|
||||||
|
|
||||||
|
def edges
|
||||||
|
{
|
||||||
|
top: @raw.fetch(0),
|
||||||
|
bottom: @raw.fetch(SIZE-1),
|
||||||
|
left: @raw.transpose.fetch(0),
|
||||||
|
right: @raw.transpose.fetch(SIZE-1),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
@raw.map(&:join).join("\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
input = ARGF.read
|
||||||
|
.scan(/Tile (\d+):\n((?:[.#]+\n)+)/m)
|
||||||
|
.to_h
|
||||||
|
.transform_keys(&:to_i)
|
||||||
|
.transform_values {|v| v.split("\n").map {|row| row.chars } }
|
||||||
|
.transform_values {|v| Tile.new(v) }
|
||||||
|
|
||||||
|
edges = input.flat_map {|id,tile|
|
||||||
|
tile.edges.map {|edge,data| ["#{id}_#{edge}", data.join] }
|
||||||
|
}.to_h
|
||||||
|
|
||||||
|
inverted_edges = edges.each.with_object(Hash.new {|h,k| h[k] = [] }) do |(id,data),hash|
|
||||||
|
hash[data] << id
|
||||||
|
end
|
||||||
|
|
||||||
|
matches = edges.map {|id,data|
|
||||||
|
[
|
||||||
|
id,
|
||||||
|
[
|
||||||
|
inverted_edges[data],
|
||||||
|
inverted_edges[data.reverse],
|
||||||
|
].flatten.compact.reject {|other| other == id },
|
||||||
|
]
|
||||||
|
}.to_h
|
||||||
|
|
||||||
|
corners = input.keys.select {|id|
|
||||||
|
%w[ top bottom left right ].count {|edge|
|
||||||
|
matches.fetch("#{id}_#{edge}").empty?
|
||||||
|
} == 2
|
||||||
|
}
|
||||||
|
|
||||||
|
p corners.inject(&:*)
|
Loading…
Reference in new issue