Compare commits
	
		
			5 Commits
		
	
	
		
			94ddabc590
			...
			3d85144065
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 3d85144065 | |||
| 4e8b636d2f | |||
| ee819d1362 | |||
| 34cb639327 | |||
| b33e678c7e | 
							
								
								
									
										3
									
								
								day1.ijs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								day1.ijs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
c =. > 0 ". each cutopen 1!:1 < jpath '~/projects/AoC/2020/year2020day1.txt.cache'
 | 
			
		||||
>./,(c*/c)*2020=c+/c
 | 
			
		||||
>./,(c*/c*/c)*2020=c+/c+/c
 | 
			
		||||
							
								
								
									
										6
									
								
								day2.ijs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								day2.ijs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
r =: >"1 cut each cutopen 1!:1 < jpath '~/projects/AoC/2020/year2020day2.txt.cache'
 | 
			
		||||
rs =: >0".each'-'cut"1>(0}"1 r)
 | 
			
		||||
cs =: 0{"1>1{"1 r
 | 
			
		||||
ss =: 2{"1 r
 | 
			
		||||
+/1>**/|:rs-+/"1 cs=>ss
 | 
			
		||||
+/1=+/|:(rs-1){"1 cs=>ss
 | 
			
		||||
							
								
								
									
										117
									
								
								day23.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								day23.cr
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,117 @@
 | 
			
		||||
require "advent"
 | 
			
		||||
 | 
			
		||||
input = input(2020, 23).lines[0].chars.map &.to_i32
 | 
			
		||||
 | 
			
		||||
class Array(T)
 | 
			
		||||
  def get(i)
 | 
			
		||||
    self[i % size]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def del(i)
 | 
			
		||||
    delete_at(i % size)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
class Node
 | 
			
		||||
  property next : Node
 | 
			
		||||
  property int : Int32
 | 
			
		||||
 | 
			
		||||
  def initialize(@int, @next)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert(other : Node, n = 1)
 | 
			
		||||
    set_next = other
 | 
			
		||||
    (n-1).times { set_next = set_next.@next }
 | 
			
		||||
    set_next.next = @next
 | 
			
		||||
    @next = other
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def remove(n = 1)
 | 
			
		||||
    curr = self
 | 
			
		||||
    to_return = self.next
 | 
			
		||||
    n.times { curr = curr.@next }
 | 
			
		||||
    @next = curr.@next
 | 
			
		||||
    to_return
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def find(n)
 | 
			
		||||
    start = self
 | 
			
		||||
    while start.int != n
 | 
			
		||||
      start = start.next
 | 
			
		||||
    end
 | 
			
		||||
    return start
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def to_s(n)
 | 
			
		||||
    return "" if n < 0
 | 
			
		||||
    return "#{@int} -> #{@next.to_s(n-1)}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def includes?(n, count)
 | 
			
		||||
    return false if count <= 0
 | 
			
		||||
    return @int == n || @next.includes?(n, count-1)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
class Cups
 | 
			
		||||
  getter size : Int32
 | 
			
		||||
  getter head : Node
 | 
			
		||||
 | 
			
		||||
  def initialize(list : Array(Int32))
 | 
			
		||||
    @cache = {} of Int32 => Node
 | 
			
		||||
    h = list.delete_at(0)
 | 
			
		||||
    temp = uninitialized Node
 | 
			
		||||
    @cache[h] = @head = Node.new(h, temp)
 | 
			
		||||
    @size = list.size
 | 
			
		||||
    @local_min = list.min.as(Int32)
 | 
			
		||||
    @local_max = list.max.as(Int32)
 | 
			
		||||
    @head.next = @head
 | 
			
		||||
    curr = @head
 | 
			
		||||
    list.each do |n|
 | 
			
		||||
      @cache[n] = new = Node.new(n, curr.next)
 | 
			
		||||
      curr.insert(new)
 | 
			
		||||
      curr = new
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def to_s
 | 
			
		||||
    @head.to_s(@size)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def step
 | 
			
		||||
    first = @head
 | 
			
		||||
    after = first.remove(3)
 | 
			
		||||
    m = first.int - 1
 | 
			
		||||
    while after.includes?(m, 3) || m < @local_min
 | 
			
		||||
      m = (m < @local_min) ? @local_max : (m - 1)
 | 
			
		||||
    end
 | 
			
		||||
    @cache[m].insert(after, 3)
 | 
			
		||||
    @head = @head.next
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def play(input, count)
 | 
			
		||||
  cups = Cups.new input
 | 
			
		||||
  count.times { |n| cups.step }
 | 
			
		||||
  cups
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def part1(input)
 | 
			
		||||
  cups = play(input.clone, 100)
 | 
			
		||||
  cups.head.find(1).next.to_s(cups.size - 1).gsub(" -> ", "")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def part2(input)
 | 
			
		||||
  list = input.clone
 | 
			
		||||
  max = input.max
 | 
			
		||||
  (1000000 - input.size).times do
 | 
			
		||||
    max += 1
 | 
			
		||||
    list << max
 | 
			
		||||
  end
 | 
			
		||||
  cups = play(list, 10000000)
 | 
			
		||||
  one = cups.head.find(1)
 | 
			
		||||
  one.next.int.to_i64 * one.next.next.int
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
puts "Part 1: #{part1(input)}"
 | 
			
		||||
puts "Part 2: #{part2(input)}"
 | 
			
		||||
							
								
								
									
										78
									
								
								day24.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								day24.cr
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
require "advent"
 | 
			
		||||
 | 
			
		||||
INPUT = input(2020, 24).lines.map &.tiles.map { |t| MATCHES[t] }
 | 
			
		||||
MATCHES = { "se" => {0.5, -1.0}, "sw" => {-0.5, -1.0}, "ne" => {0.5, 1.0}, "nw" => {-0.5, 1.0}, "e" => {1.0, 0.0}, "w" => {-1.0, 0.0} }
 | 
			
		||||
 | 
			
		||||
class String
 | 
			
		||||
  def tiles
 | 
			
		||||
    i = 0
 | 
			
		||||
    tiles = [] of String
 | 
			
		||||
    while i < size
 | 
			
		||||
      if self[i] == 's' || self[i] == 'n'
 | 
			
		||||
        tiles << self[i..i+1] 
 | 
			
		||||
        i += 2
 | 
			
		||||
      else
 | 
			
		||||
        tiles << self[i..i]
 | 
			
		||||
        i += 1
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    tiles
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
class Array(T)
 | 
			
		||||
  def pos
 | 
			
		||||
    curr = {0.0, 0.0}
 | 
			
		||||
    each do |c|
 | 
			
		||||
      curr = curr.add c
 | 
			
		||||
    end
 | 
			
		||||
    curr
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def part1(input)
 | 
			
		||||
  counts = Hash({Float64,Float64}, Int32).new(0)
 | 
			
		||||
  input.each do |i|
 | 
			
		||||
    counts[i.pos] += 1
 | 
			
		||||
  end
 | 
			
		||||
  counts.count &.[1].%(2).==(1)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
struct Tuple(*T)
 | 
			
		||||
  def neighbors
 | 
			
		||||
    MATCHES.values.map &.add(self)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def part2(input)
 | 
			
		||||
  state = Hash({Float64,Float64}, Bool).new(false)
 | 
			
		||||
  counts = Hash({Float64,Float64}, Int32).new(0)
 | 
			
		||||
 | 
			
		||||
  input.each do |i|
 | 
			
		||||
    state[i.pos] ^= true
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  100.times do |i|
 | 
			
		||||
    counts.clear
 | 
			
		||||
    state.each do |t, f|
 | 
			
		||||
      next unless f
 | 
			
		||||
      t.neighbors.each do |n|
 | 
			
		||||
        counts[n] += 1
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    new_state = state.clone.clear
 | 
			
		||||
    state.each do |k, v|
 | 
			
		||||
      next unless v
 | 
			
		||||
      new_state[k] = !(counts[k] == 0 || (counts[k] > 2))
 | 
			
		||||
    end
 | 
			
		||||
    counts.each do |k, v|
 | 
			
		||||
      new_state[k] = true if (!state[k]) && v == 2
 | 
			
		||||
    end
 | 
			
		||||
    state = new_state
 | 
			
		||||
  end
 | 
			
		||||
  state.count &.[1]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
puts part1(INPUT.clone)
 | 
			
		||||
puts part2(INPUT.clone)
 | 
			
		||||
							
								
								
									
										5
									
								
								day3.ijs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								day3.ijs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
r =: > cutopen 1!:1 < jpath '~/projects/AoC/2020/year2020day3.txt.cache'
 | 
			
		||||
rn =: 4 : '+/''#''=((#|:y)|x*i.#y){"0 1 y'
 | 
			
		||||
rnx =: 3 : '(1{y) rn 0{"2((0{-y)]\r)'
 | 
			
		||||
rnx 1 3
 | 
			
		||||
*/ rnx"1 (_2 [\ 1 1 1 3 1 5 1 7 2 1)
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user