parent
7400e16789
commit
b77d565b97
@ -0,0 +1,3 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'minitest'
|
@ -0,0 +1,13 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
minitest (5.10.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
minitest
|
||||
|
||||
BUNDLED WITH
|
||||
1.13.6
|
@ -0,0 +1,68 @@
|
||||
include Math
|
||||
|
||||
def follow_instructions(input)
|
||||
seq = input.split(', ')
|
||||
|
||||
# start facing north at the origin
|
||||
dir = -PI/2
|
||||
locations = [[0,0]]
|
||||
seq.each.with_object(locations) do |step, locations|
|
||||
/(?<turn>\w)(?<blocks>\d+)/ =~ step
|
||||
|
||||
case turn
|
||||
when ?R
|
||||
dir += PI/2
|
||||
when ?L
|
||||
dir -= PI/2
|
||||
else
|
||||
raise "unexpected turn: #{turn}"
|
||||
end
|
||||
|
||||
blocks.to_i.times do
|
||||
location = locations.last
|
||||
x = location[0] + cos(dir).to_i
|
||||
y = location[1] + sin(dir).to_i
|
||||
locations << [x, y]
|
||||
end
|
||||
end
|
||||
|
||||
locations
|
||||
end
|
||||
|
||||
def first_dupe(ary)
|
||||
seen = Set.new
|
||||
ary.find { |elem|
|
||||
seen.include?(elem) || (seen << elem && false)
|
||||
}
|
||||
end
|
||||
|
||||
require 'minitest'
|
||||
# require 'minitest/autorun'
|
||||
class TestInstructions < Minitest::Test
|
||||
def test_instructions
|
||||
assert_distance 5, 'R2, L3'
|
||||
assert_distance 2, 'R2, R2, R2'
|
||||
assert_distance 12, 'R5, L5, R5, R3'
|
||||
end
|
||||
|
||||
def test_first_dupe
|
||||
assert_equal 1, first_dupe([1, 2, 3, 1])
|
||||
assert_equal 2, first_dupe([1, 2, 3, 2])
|
||||
assert_equal 3, first_dupe([1, 2, 3, 3])
|
||||
|
||||
locations = follow_instructions('R8, R4, R4, R8')
|
||||
assert_equal [4, 0], first_dupe(locations)
|
||||
end
|
||||
|
||||
def assert_distance(expected, instructions)
|
||||
locations = follow_instructions(instructions)
|
||||
assert_equal expected, locations.last.map(&:abs).inject(:+)
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
puts first_dupe(follow_instructions(DATA.read))
|
||||
end
|
||||
|
||||
__END__
|
||||
R4, R3, L3, L2, L1, R1, L1, R2, R3, L5, L5, R4, L4, R2, R4, L3, R3, L3, R3, R4, R2, L1, R2, L3, L2, L1, R3, R5, L1, L4, R2, L4, R3, R1, R2, L5, R2, L189, R5, L5, R52, R3, L1, R4, R5, R1, R4, L1, L3, R2, L2, L3, R4, R3, L2, L5, R4, R5, L2, R2, L1, L3, R3, L4, R4, R5, L1, L1, R3, L5, L2, R76, R2, R2, L1, L3, R189, L3, L4, L1, L3, R5, R4, L1, R1, L1, L1, R2, L4, R2, L5, L5, L5, R2, L4, L5, R4, R4, R5, L5, R3, L1, L3, L1, L1, L3, L4, R5, L3, R5, R3, R3, L5, L5, R3, R4, L3, R3, R1, R3, R2, R2, L1, R1, L3, L3, L3, L1, R2, L1, R4, R4, L1, L1, R3, R3, R4, R1, L5, L2, R2, R3, R2, L3, R4, L5, R1, R4, R5, R4, L4, R1, L3, R1, R3, L2, L3, R1, L2, R3, L3, L1, L3, R4, L4, L5, R3, R5, R4, R1, L2, R3, R5, L5, L4, L1, L1
|
Loading…
Reference in new issue