2025! Ruby, day 1
This commit is contained in:
parent
5453166f0e
commit
7c063782df
6
ruby/2025/1/bin/problem
Normal file
6
ruby/2025/1/bin/problem
Normal file
@ -0,0 +1,6 @@
|
||||
#/usr/bin/env ruby
|
||||
require "combination"
|
||||
|
||||
combination = Combination.for STDIN.read.chomp
|
||||
puts "Part 1: #{combination.zero_count}"
|
||||
puts "Part 2: #{combination.zero_click_count}"
|
||||
65
ruby/2025/1/lib/combination.rb
Normal file
65
ruby/2025/1/lib/combination.rb
Normal file
@ -0,0 +1,65 @@
|
||||
class Combination
|
||||
attr_reader :steps
|
||||
def initialize(steps)
|
||||
@steps = steps
|
||||
end
|
||||
|
||||
def self.for(string)
|
||||
new string.split("\n").map{ |line| Step.for line }
|
||||
end
|
||||
|
||||
def zero_count
|
||||
safe = Safe.new
|
||||
zc = 0
|
||||
steps.each do |step|
|
||||
safe.apply_step step
|
||||
zc += 1 if safe.count.zero?
|
||||
end
|
||||
zc
|
||||
end
|
||||
|
||||
def zero_click_count
|
||||
safe = Safe.new
|
||||
steps.each do |step|
|
||||
safe.apply_step step
|
||||
end
|
||||
safe.zero_clicks
|
||||
end
|
||||
|
||||
class Step
|
||||
attr_reader :dir, :count
|
||||
def initialize(dir, count)
|
||||
@dir = dir
|
||||
@count = dir == "R" ? count : -count
|
||||
end
|
||||
|
||||
def self.for(string)
|
||||
new string[0], string[1..].to_i
|
||||
end
|
||||
end
|
||||
|
||||
class Safe
|
||||
attr_reader :count
|
||||
attr_reader :zero_clicks
|
||||
def initialize
|
||||
@count = 50
|
||||
@zero_clicks = 0
|
||||
end
|
||||
|
||||
def apply_step(step)
|
||||
if step.dir == "R"
|
||||
0.upto(step.count - 1) do
|
||||
@count += 1
|
||||
@count = @count % 100
|
||||
@zero_clicks += 1 if @count.zero?
|
||||
end
|
||||
else
|
||||
0.upto(-step.count - 1) do
|
||||
@count -= 1
|
||||
@count = @count % 100
|
||||
@zero_clicks += 1 if @count.zero?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
59
ruby/2025/1/test/test_combination.rb
Normal file
59
ruby/2025/1/test/test_combination.rb
Normal file
@ -0,0 +1,59 @@
|
||||
require "minitest/autorun"
|
||||
require "combination"
|
||||
|
||||
TEST_COMBINATION = <<END
|
||||
L68
|
||||
L30
|
||||
R48
|
||||
L5
|
||||
R60
|
||||
L55
|
||||
L1
|
||||
L99
|
||||
R14
|
||||
L82
|
||||
END
|
||||
|
||||
class TestCombination < Minitest::Test
|
||||
def test_safe
|
||||
safe = Combination::Safe.new
|
||||
assert_equal 50, safe.count
|
||||
assert_equal 0, safe.zero_clicks
|
||||
safe.apply_step Combination::Step.for("L68")
|
||||
assert_equal 82, safe.count
|
||||
assert_equal 1, safe.zero_clicks
|
||||
safe.apply_step Combination::Step.for("L30")
|
||||
assert_equal 52, safe.count
|
||||
assert_equal 1, safe.zero_clicks
|
||||
safe.apply_step Combination::Step.for("R48")
|
||||
assert_equal 0, safe.count
|
||||
assert_equal 2, safe.zero_clicks
|
||||
safe.apply_step Combination::Step.for("R300")
|
||||
assert_equal 0, safe.count
|
||||
assert_equal 5, safe.zero_clicks
|
||||
safe.apply_step Combination::Step.for("L602")
|
||||
assert_equal 98, safe.count
|
||||
assert_equal 11, safe.zero_clicks
|
||||
|
||||
0.upto(99) do |count|
|
||||
safe = Combination::Safe.new
|
||||
safe.apply_step Combination::Step.for("L50")
|
||||
safe.apply_step Combination::Step.new("R", count)
|
||||
assert_equal count, safe.count
|
||||
assert_equal 1, safe.zero_clicks
|
||||
end
|
||||
end
|
||||
|
||||
def test_zero_count
|
||||
combination = Combination.for TEST_COMBINATION
|
||||
assert_equal 3, combination.zero_count
|
||||
end
|
||||
|
||||
def test_zero_clicks
|
||||
combination = Combination.for TEST_COMBINATION
|
||||
assert_equal 6, combination.zero_click_count
|
||||
|
||||
combination = Combination.for "R1000"
|
||||
assert_equal 10, combination.zero_click_count
|
||||
end
|
||||
end
|
||||
Loading…
Reference in New Issue
Block a user