Add solution for 2015 day 19 part 1

This commit is contained in:
Patrick Auernig 2021-02-22 01:26:00 +01:00
parent 0f53b455b6
commit 5517d18918
4 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1 @@
3.0.0

View 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

View File

@ -0,0 +1,5 @@
H => HO
H => OH
O => HH
HOH

57
2015/day-19/main.rb Executable file
View 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) })