Skip to content

Commit c9f5493

Browse files
2024 day 2
1 parent 8ddccf3 commit c9f5493

File tree

4 files changed

+1144
-0
lines changed

4 files changed

+1144
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
class Report
2+
attr_reader :levels
3+
4+
def initialize(levels)
5+
@levels = levels
6+
end
7+
8+
def initial_direction(levels)
9+
levels.length > 1 && levels[0] < levels[1] ? 'increasing' : 'decreasing'
10+
end
11+
12+
def safe_with_dampener?
13+
return true if safe?
14+
15+
levels.each_index do |i|
16+
dampered_levels = levels.dup
17+
dampered_levels.delete_at(i)
18+
19+
direction = initial_direction(dampered_levels)
20+
21+
return true if safe_levels(direction, dampered_levels)
22+
end
23+
24+
false
25+
end
26+
27+
def safe_levels(direction, levels)
28+
levels.each_index do |i|
29+
next if i == 0
30+
31+
current = levels[i]
32+
prev = levels[i - 1]
33+
34+
return false unless valid_direction?(direction, current, prev) && adjacent_safe?(prev, current)
35+
end
36+
37+
true
38+
end
39+
40+
def safe?
41+
direction = initial_direction(levels)
42+
43+
safe_levels(direction, levels)
44+
end
45+
46+
def valid_direction?(direction, level, prev)
47+
(prev < level && direction == 'increasing') || (prev > level && direction == 'decreasing')
48+
end
49+
50+
def adjacent_safe?(prev, level)
51+
(prev - level).abs.between?(1, 3)
52+
end
53+
end

2024/ruby/spec/advent_02_spec.rb

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
require 'spec_helper'
2+
require 'pry'
3+
require 'advent_02_red_nosed_reports'
4+
5+
describe "Report" do
6+
context "with safe increasing levels" do
7+
let(:levels) { [5, 6, 7, 8, 9, 10] }
8+
9+
it 'is safe' do
10+
report = Report.new(levels)
11+
12+
expect(report.safe?).to be(true)
13+
end
14+
end
15+
16+
context "with safe decreasing levels" do
17+
let(:levels) { [5, 4, 3, 2, 1] }
18+
19+
it 'is safe' do
20+
report = Report.new(levels)
21+
22+
expect(report.safe?).to be(true)
23+
end
24+
end
25+
26+
context "with mixed levels" do
27+
let(:levels) { [5, 4, 6] }
28+
29+
it 'is not safe' do
30+
report = Report.new(levels)
31+
32+
expect(report.safe?).to be(false)
33+
end
34+
end
35+
36+
context "with bad adjacent levels" do
37+
let(:levels) { [1, 2, 4, 8, 9] }
38+
39+
it 'is not safe' do
40+
report = Report.new(levels)
41+
42+
expect(report.safe?).to be(false)
43+
end
44+
end
45+
46+
context "with sample data" do
47+
let(:data) do
48+
File.readlines('spec/fixtures/advent-02-sample.txt').map do |e|
49+
e.chomp.split(' ').map(&:to_i)
50+
end
51+
end
52+
53+
it "calculates how many are safe" do
54+
safe = data.select { |levels| Report.new(levels).safe? }
55+
56+
expect(safe.length).to be(2)
57+
end
58+
59+
it "calculates how many are safe with a dampener of 1" do
60+
safe = data.select { |levels| Report.new(levels).safe_with_dampener? }
61+
62+
expect(safe.length).to be(4)
63+
end
64+
end
65+
66+
context "with puzzle data" do
67+
let(:data) do
68+
File.readlines('spec/fixtures/advent-02.txt').map do |e|
69+
e.chomp.split(' ').map(&:to_i)
70+
end
71+
end
72+
73+
it "calculates how many are safe" do
74+
safe = data.select { |levels| Report.new(levels).safe? }
75+
76+
expect(safe.length).to be(660)
77+
end
78+
79+
it "calculates how many are safe with a dampener of 1" do
80+
safe = data.select { |levels| Report.new(levels).safe_with_dampener? }
81+
82+
expect(safe.length).to be(689)
83+
end
84+
end
85+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
7 6 4 2 1
2+
1 2 7 8 9
3+
9 7 6 2 1
4+
1 3 2 4 5
5+
8 6 4 4 1
6+
1 3 6 7 9

0 commit comments

Comments
 (0)