Add solutions for day 14.
This commit is contained in:
		
							parent
							
								
									6eef99e081
								
							
						
					
					
						commit
						ca92e7cca0
					
				
							
								
								
									
										48
									
								
								day14.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								day14.cr
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
			
		||||
require "./common.cr"
 | 
			
		||||
 | 
			
		||||
LINE_COUNT = 637061
 | 
			
		||||
recipes = Deque(Int32).new
 | 
			
		||||
recipes << 3
 | 
			
		||||
recipes << 7
 | 
			
		||||
elves = [0, 1]
 | 
			
		||||
 | 
			
		||||
def add_recipes(recipes, elves)
 | 
			
		||||
  new_num = elves.map { |it| recipes[it] }.sum
 | 
			
		||||
  new_num.to_s.chars.map(&.to_i32).each do |n|
 | 
			
		||||
    recipes << n
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  elves.each_with_index do |elf, index|
 | 
			
		||||
    elves[index] = (elf + recipes[elf] + 1) % recipes.size
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def index?(recipes, sequence, start_at = 0)
 | 
			
		||||
  return nil if recipes.size < sequence.size
 | 
			
		||||
  (recipes.size-sequence.size+1-start_at).times do |offset|
 | 
			
		||||
    correct = true
 | 
			
		||||
    sequence.each_with_index do |s, i|
 | 
			
		||||
      correct &= (recipes[start_at + offset + i] == s)
 | 
			
		||||
      break unless correct
 | 
			
		||||
    end
 | 
			
		||||
    return start_at + offset if correct
 | 
			
		||||
  end
 | 
			
		||||
  return nil
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
# Part 1
 | 
			
		||||
while recipes.size < LINE_COUNT + 10
 | 
			
		||||
  add_recipes(recipes, elves)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
puts recipes.to_a[-10..-1].map(&.to_s).join
 | 
			
		||||
 | 
			
		||||
# Part 2
 | 
			
		||||
digits = LINE_COUNT.to_s.chars.map(&.to_i32)
 | 
			
		||||
index = nil
 | 
			
		||||
old_size = 0
 | 
			
		||||
until (index = index?(recipes, digits, Math.max(old_size - 10, 0)))
 | 
			
		||||
  old_size = recipes.size
 | 
			
		||||
  add_recipes(recipes, elves)
 | 
			
		||||
end
 | 
			
		||||
puts index
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user