@@ -6,12 +6,42 @@ class Day15 < Day # >
6
6
# day.part1 #=> 1320
7
7
def part1
8
8
initialization_sequence
9
- . reduce ( 0 ) { |sum , step | sum += HASH . hash ( step ) }
9
+ . reduce ( 0 ) { |sum , step | sum += hash ( step ) }
10
10
end
11
11
12
- # example
13
- # day.part2 #=> 'how are you'
12
+ # @ example
13
+ # day.part2 #=> 145
14
14
def part2
15
+ # "... a series of 256 boxes numbered 0 through 255 ..."
16
+ boxes = Array . new ( 256 ) { Hash . new }
17
+
18
+ # "... perform each step in the initialization sequence ..."
19
+ initialization_sequence
20
+ . each do |step |
21
+ label , op , focal_length = /\A (.*)([-,\= ])(.*)?\z / . match ( step ) [ 1 ..3 ]
22
+ case op
23
+ when "-" ; boxes [ hash ( label ) ] . delete ( label )
24
+ when "=" ; boxes [ hash ( label ) ] . store ( label , focal_length . to_i )
25
+ else ; raise ( "lolwut" )
26
+ end
27
+ end
28
+
29
+ # "To confirm that all of the lenses are installed correctly,
30
+ # add up the focusing power of all of the lenses."
31
+ boxes
32
+ . map . with_index { |box , box_number | # box numbers are 0-255
33
+ box
34
+ . values # only need the focal lengths not the labels
35
+ . map . with_index ( 1 ) { |focal_length , slot_number | # box slot numbers start at 1
36
+ # "The focusing power of a single lens is the result of multiplying together:
37
+ # " - One plus the box number of the lens in question.
38
+ # " - The slot number of the lens within the box: 1 for the first lens, ...
39
+ # " - The focal length of the lens."
40
+ ( box_number + 1 ) * slot_number * focal_length
41
+ }
42
+ }
43
+ . flatten
44
+ . reduce ( &:+ )
15
45
end
16
46
17
47
# @example parses_input
@@ -25,33 +55,30 @@ def initialization_sequence
25
55
EXAMPLE_INPUT = <<~INPUT
26
56
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
27
57
INPUT
28
- end
29
58
30
- #class Holiday_ASCII_String_Helper
31
- module HASH
32
- # @example
33
- # HASH.hash("") #=> 0
59
+ # @example default_start
60
+ # new.hash("") #=> 0
34
61
# @example HASH
35
- # HASH .hash("HASH") #=> 52
62
+ # new .hash("HASH") #=> 52
36
63
# @example from_example_input
37
- # HASH .hash("rn=1") #=> 30
38
- # HASH .hash("cm-") #=> 253
39
- # HASH .hash("qp=3") #=> 97
40
- # HASH .hash("cm=2") #=> 47
41
- # HASH .hash("qp-") #=> 14
42
- # HASH .hash("pc=4") #=> 180
43
- # HASH .hash("ot=9") #=> 9
44
- # HASH .hash("ab=5") #=> 197
45
- # HASH .hash("pc-") #=> 48
46
- # HASH .hash("pc=6") #=> 214
47
- # HASH .hash("ot=7") #=> 231
48
- def self . hash ( str = "" )
49
- str
50
- . each_byte # Determine the ASCII code for the current character of the string.
51
- . inject ( 0 ) do |current_value , ord | # start with a current value of 0
52
- current_value += ord # Increase the current value by the ASCII code you just determined.
53
- current_value *= 17 # Set the current value to itself multiplied by 17.
54
- current_value %= 256 # Set the current value to the remainder of dividing itself by 256.
64
+ # new .hash("rn=1") #=> 30
65
+ # new .hash("cm-") #=> 253
66
+ # new .hash("qp=3") #=> 97
67
+ # new .hash("cm=2") #=> 47
68
+ # new .hash("qp-") #=> 14
69
+ # new .hash("pc=4") #=> 180
70
+ # new .hash("ot=9") #=> 9
71
+ # new .hash("ab=5") #=> 197
72
+ # new .hash("pc-") #=> 48
73
+ # new .hash("pc=6") #=> 214
74
+ # new .hash("ot=7") #=> 231
75
+ def hash ( str = "" )
76
+ str # "... for each character in the string starting from the beginning:"
77
+ . each_byte # " Determine the ASCII code for the current character of the string."
78
+ . inject ( 0 ) do |current_value , ord | # "... start with a current value of 0."
79
+ current_value += ord # " Increase the current value by the ASCII code you just determined."
80
+ current_value *= 17 # " Set the current value to itself multiplied by 17."
81
+ current_value %= 256 # " Set the current value to the remainder of dividing itself by 256."
55
82
end
56
83
end
57
84
end
0 commit comments