Add solution for 2015 day 19 part 1
This commit is contained in:
parent
0f53b455b6
commit
5517d18918
1
2015/day-19/.ruby-version
Normal file
1
2015/day-19/.ruby-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.0.0
|
45
2015/day-19/inputs/puzzle.txt
Normal file
45
2015/day-19/inputs/puzzle.txt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
Al => ThF
|
||||||
|
Al => ThRnFAr
|
||||||
|
B => BCa
|
||||||
|
B => TiB
|
||||||
|
B => TiRnFAr
|
||||||
|
Ca => CaCa
|
||||||
|
Ca => PB
|
||||||
|
Ca => PRnFAr
|
||||||
|
Ca => SiRnFYFAr
|
||||||
|
Ca => SiRnMgAr
|
||||||
|
Ca => SiTh
|
||||||
|
F => CaF
|
||||||
|
F => PMg
|
||||||
|
F => SiAl
|
||||||
|
H => CRnAlAr
|
||||||
|
H => CRnFYFYFAr
|
||||||
|
H => CRnFYMgAr
|
||||||
|
H => CRnMgYFAr
|
||||||
|
H => HCa
|
||||||
|
H => NRnFYFAr
|
||||||
|
H => NRnMgAr
|
||||||
|
H => NTh
|
||||||
|
H => OB
|
||||||
|
H => ORnFAr
|
||||||
|
Mg => BF
|
||||||
|
Mg => TiMg
|
||||||
|
N => CRnFAr
|
||||||
|
N => HSi
|
||||||
|
O => CRnFYFAr
|
||||||
|
O => CRnMgAr
|
||||||
|
O => HP
|
||||||
|
O => NRnFAr
|
||||||
|
O => OTi
|
||||||
|
P => CaP
|
||||||
|
P => PTi
|
||||||
|
P => SiRnFAr
|
||||||
|
Si => CaSi
|
||||||
|
Th => ThCa
|
||||||
|
Ti => BP
|
||||||
|
Ti => TiTi
|
||||||
|
e => HF
|
||||||
|
e => NAl
|
||||||
|
e => OMg
|
||||||
|
|
||||||
|
CRnCaSiRnBSiRnFArTiBPTiTiBFArPBCaSiThSiRnTiBPBPMgArCaSiRnTiMgArCaSiThCaSiRnFArRnSiRnFArTiTiBFArCaCaSiRnSiThCaCaSiRnMgArFYSiRnFYCaFArSiThCaSiThPBPTiMgArCaPRnSiAlArPBCaCaSiRnFYSiThCaRnFArArCaCaSiRnPBSiRnFArMgYCaCaCaCaSiThCaCaSiAlArCaCaSiRnPBSiAlArBCaCaCaCaSiThCaPBSiThPBPBCaSiRnFYFArSiThCaSiRnFArBCaCaSiRnFYFArSiThCaPBSiThCaSiRnPMgArRnFArPTiBCaPRnFArCaCaCaCaSiRnCaCaSiRnFYFArFArBCaSiThFArThSiThSiRnTiRnPMgArFArCaSiThCaPBCaSiRnBFArCaCaPRnCaCaPMgArSiRnFYFArCaSiThRnPBPMgAr
|
5
2015/day-19/inputs/test.txt
Normal file
5
2015/day-19/inputs/test.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
H => HO
|
||||||
|
H => OH
|
||||||
|
O => HH
|
||||||
|
|
||||||
|
HOH
|
57
2015/day-19/main.rb
Executable file
57
2015/day-19/main.rb
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "pathname"
|
||||||
|
require "set"
|
||||||
|
|
||||||
|
def uppercase?(char)
|
||||||
|
char.ord.between?(65, 90)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_file(file)
|
||||||
|
rules = []
|
||||||
|
input = nil
|
||||||
|
|
||||||
|
rules_parsed = false
|
||||||
|
file.each_line do |line|
|
||||||
|
line = line.chomp
|
||||||
|
if line.empty?
|
||||||
|
rules_parsed = true
|
||||||
|
elsif rules_parsed
|
||||||
|
input = line.each_char.slice_before { |x| uppercase?(x) }.map(&:join)
|
||||||
|
else
|
||||||
|
line.split(" => ") => [lhs, rhs]
|
||||||
|
replacement = rhs.each_char.slice_before { |x| uppercase?(x) }.map(&:join)
|
||||||
|
rules.push([lhs, replacement])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
[input, rules]
|
||||||
|
end
|
||||||
|
|
||||||
|
def apply_rules(input, rules)
|
||||||
|
molecules = Set.new
|
||||||
|
|
||||||
|
input.each_with_index do |item, idx|
|
||||||
|
rules.select { |(x, _)| x == item }.each do |(_, re)|
|
||||||
|
head = input[...idx].join
|
||||||
|
tail = input[(idx+1)..].join
|
||||||
|
|
||||||
|
molecules.add("#{head}#{re.join}#{tail}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
molecules
|
||||||
|
end
|
||||||
|
|
||||||
|
def main(file_paths)
|
||||||
|
file_paths.each do |file_path|
|
||||||
|
puts "File: #{file_path}"
|
||||||
|
input, rules = parse_file(file_path)
|
||||||
|
|
||||||
|
solution1 = apply_rules(input, rules).size
|
||||||
|
puts " Solution 1: #{solution1}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
main(ARGV.map { |x| Pathname(x) })
|
Loading…
Reference in New Issue
Block a user