Skip to content

Commit df0d664

Browse files
committed
Day 7 Ruby solutions
1 parent f0e9301 commit df0d664

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

07-1.rb

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#!/usr/bin/env ruby
2+
3+
class Formula
4+
attr_reader :possible, :value
5+
6+
def initialize(line)
7+
val, terms = line.split ':'
8+
@value = val.to_i
9+
@terms = terms.split.map(&:to_i)
10+
@opers = nil
11+
@possible = nil
12+
end
13+
14+
def solve_tail(result, partial, opers, terms)
15+
return nil if partial > result
16+
return opers if result == partial && terms.empty?
17+
return nil if terms.empty?
18+
19+
term = terms[0]
20+
21+
solution = solve_tail(result, partial + term, opers + [:+], terms[1..])
22+
return solution if solution
23+
24+
solve_tail(result, partial * term, opers + [:*], terms[1..])
25+
end
26+
27+
def solve!
28+
@opers = solve_tail(@value, @terms[0], [], @terms[1..])
29+
@possible = !@opers.nil?
30+
end
31+
32+
def inspect
33+
to_s
34+
end
35+
36+
def to_s
37+
s = "<#{self.class}: #{@value} = "
38+
if @opers.nil?
39+
s += @terms.to_s
40+
else
41+
@opers.each_index do |i|
42+
s += "#{@terms[i]} #{@opers[i]} "
43+
end
44+
s += @terms[-1].to_s
45+
end
46+
s += " #{@possible}" unless @possible.nil?
47+
s += '>'
48+
s
49+
end
50+
end
51+
52+
lines = File.read('07.input').lines.map(&:strip)
53+
formulae = lines.map { |l| Formula.new l }
54+
formulae.map(&:solve!)
55+
puts formulae.select(&:possible).map(&:value).sum

07-2.rb

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env ruby
2+
3+
class Formula
4+
attr_reader :possible, :value
5+
6+
def initialize(line)
7+
val, terms = line.split ':'
8+
@value = val.to_i
9+
@terms = terms.split.map(&:to_i)
10+
@opers = nil
11+
@possible = nil
12+
end
13+
14+
def solve_tail(result, partial, opers, terms)
15+
return nil if partial > result
16+
return opers if result == partial && terms.empty?
17+
return nil if terms.empty?
18+
19+
term = terms[0]
20+
21+
solution = solve_tail(result, partial + term, opers + [:+], terms[1..])
22+
return solution if solution
23+
24+
solution = solve_tail(result, partial * term, opers + [:*], terms[1..])
25+
return solution if solution
26+
27+
solve_tail(result, partial * 10.pow(Math.log10(term).floor + 1) + term, opers + [:|], terms[1..])
28+
end
29+
30+
def solve!
31+
@opers = solve_tail(@value, @terms[0], [], @terms[1..])
32+
@possible = !@opers.nil?
33+
end
34+
35+
def inspect
36+
to_s
37+
end
38+
39+
def to_s
40+
s = "<#{self.class}: #{@value} = "
41+
if @opers.nil?
42+
s += @terms.to_s
43+
else
44+
@opers.each_index do |i|
45+
s += "#{@terms[i]} #{@opers[i]} "
46+
end
47+
s += @terms[-1].to_s
48+
end
49+
s += " #{@possible}" unless @possible.nil?
50+
s += '>'
51+
s
52+
end
53+
end
54+
55+
lines = File.read('07.input').lines.map(&:strip)
56+
formulae = lines.map { |l| Formula.new l }
57+
formulae.map(&:solve!)
58+
puts formulae.select(&:possible).map(&:value).sum

0 commit comments

Comments
 (0)