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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy