문제
https://adventofcode.com/2018/day/1#part2
part 1 에서의 동일한 입력과 동일한 주파수 조정을 사용하되, 조정된 주파수 값이 두번째로 반복해서 나타나는 주파수의 값을 찾아라. 입력 리스트를 반복했을때 반복해서 나타나는 주파수가 없다면 리스트를 처음부터 반복한다.
풀이
첫번째 시도 : 메소드 체인을 걸다가 each 에서 조건이 충족되었을때 멈출 방법을 모르겠어서 예외를 던지도록 해버렸다. 어느 언어로하든 map/reduce/each 등에서 중간에 멈추도록 하는 직관적인 방법을 아직 못 찾았다.
class DeviceFrequency
def self.find_first_freq_reached_twice input, current
reached = { 0 => true}
answer = nil
begin
input.split(",")
.map { |x| x.split("\n")}
.flatten
.cycle
.each do |x|
current = current + x.to_i
if reached.has_key? current and answer.nil?
answer = current
raise "answer found"
else
reached[current] = true
end
end
rescue
print "answer found"
end
answer
end
end
두번째 시도 : 동작하던 첫번째 코드를 조금 개선하였다.
class DeviceFrequency
def self.find_first_freq_reached_twice(input, current)
reached = {0 => true}
input.split(",")
.map {|x| x.split("\n")}
.flatten
.cycle
.each do |x|
current = current + x.to_i
if reached.has_key? current
return current
end
reached[current] = true
end
end
end