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