aboutsummaryrefslogtreecommitdiff
path: root/day10/part1
diff options
context:
space:
mode:
Diffstat (limited to 'day10/part1')
-rwxr-xr-xday10/part165
1 files changed, 65 insertions, 0 deletions
diff --git a/day10/part1 b/day10/part1
new file mode 100755
index 0000000..1c24c83
--- /dev/null
+++ b/day10/part1
@@ -0,0 +1,65 @@
+#!/usr/bin/env ruby
+
+class CircList
+ def initialize(size)
+ @list = (0...size).to_a
+ @skip = 0
+ @ptr = 0
+ end
+
+ def reverse_sublist(len)
+ if @ptr + len > @list.length then
+ reverse_wrapping_sublist(len)
+ else
+ reverse_contained_sublist(len)
+ end
+
+ inc_ptr(len)
+ end
+
+ def to_a
+ return @list
+ end
+
+ def to_s
+ l = @list.dup
+ l[@ptr] = "[#{l[@ptr]}]"
+ return "#{l.join(' ')} skip = #{@skip}"
+ end
+
+ private
+
+ def reverse_wrapping_sublist(len)
+ dbl = @list.dup + @list.dup
+ sublist = dbl[@ptr...@ptr+len].reverse
+
+ (@ptr...@ptr+len).each do |i|
+ @list[i % @list.length] = sublist[i-@ptr]
+ end
+ end
+
+ def reverse_contained_sublist(len)
+ sublist = @list[@ptr...@ptr+len].reverse
+
+ (@ptr...@ptr+len).each do |i|
+ @list[i] = sublist[i-@ptr]
+ end
+ end
+
+ def inc_ptr(len)
+ @ptr += len
+ @ptr += @skip
+ @ptr = @ptr % @list.length
+ @skip += 1
+ end
+end
+
+input = gets.chomp.split(',').map(&:to_i)
+
+list = CircList.new(256)
+
+input.each do |len|
+ list.reverse_sublist(len)
+end
+
+puts list.to_a[0] * list.to_a[1]