Skip to content

Commit 8e4ae8a

Browse files
refactor and use more Enumerable
1 parent 5a3df92 commit 8e4ae8a

File tree

1 file changed

+40
-105
lines changed

1 file changed

+40
-105
lines changed

2024/ruby/lib/advent_04_ceres_search.rb

Lines changed: 40 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def count_at(row, col)
1818
count
1919
end
2020

21+
def letter_at(row, col)
22+
in_bounds?(row, col) ? data[row][col] : ""
23+
end
24+
2125
def horizontal_word(row, col)
2226
first = col
2327
last = col + word.length - 1
@@ -32,88 +36,37 @@ def horizontal?(row, col)
3236
end
3337

3438
def vertical_word(row, col)
35-
first = row
36-
last = row + word.length - 1
37-
38-
return "" unless in_bounds?(first, last)
39-
40-
str = ""
41-
42-
data.each_index do |r|
43-
data[r].each_index do |c|
44-
str << data[r][c] if col == c && r.between?(first, last)
45-
end
46-
end
47-
48-
str
39+
(row..row+word.length-1).map do |pos|
40+
letter_at(pos, col)
41+
end * ''
4942
end
5043

5144
def vertical?(row, col)
5245
match?(vertical_word(row, col))
5346
end
5447

5548
def diagonal_top_left_word(row, col)
56-
str = ""
57-
58-
(0..word.length - 1).each do |pos|
59-
new_row = row - pos
60-
new_col = col - pos
61-
62-
return str unless in_bounds?(new_row, new_col)
63-
64-
str += data[new_row][new_col]
65-
end
66-
67-
str
49+
(0..word.length - 1).map do |pos|
50+
letter_at(row-pos, col-pos)
51+
end * ''
6852
end
6953

7054
def diagonal_top_right_word(row, col)
71-
str = ""
72-
73-
(0..word.length - 1).each do |pos|
74-
new_row = row - pos
75-
new_col = col + pos
76-
77-
return str unless in_bounds?(new_row, new_col)
78-
79-
str += data[new_row][new_col]
80-
end
81-
82-
str
83-
end
84-
85-
def letter_at(row, col)
86-
in_bounds?(row, col) ? data[row][col] : ""
55+
(0..word.length - 1).map do |pos|
56+
letter_at(row-pos, col+pos)
57+
end * ""
8758
end
8859

8960
def diagonal_bottom_right_word(row, col)
90-
str = ""
91-
92-
(0..word.length - 1).each do |pos|
93-
new_row = row + pos
94-
new_col = col + pos
95-
96-
return str unless in_bounds?(new_row, new_col)
97-
98-
str += data[new_row][new_col]
99-
end
100-
101-
str
61+
(0..word.length - 1).map do |pos|
62+
letter_at(row+pos, col+pos)
63+
end * ''
10264
end
10365

10466
def diagonal_bottom_left_word(row, col)
105-
str = ""
106-
107-
(0..word.length - 1).each do |pos|
108-
new_row = row + pos
109-
new_col = col - pos
110-
111-
return str unless in_bounds?(new_row, new_col)
112-
113-
str += data[new_row][new_col]
114-
end
115-
116-
str
67+
(0..word.length - 1).map do |pos|
68+
letter_at(row+pos, col-pos)
69+
end * ''
11770
end
11871

11972
def match?(str)
@@ -133,70 +86,52 @@ def cross_word_at?(row, col)
13386
end
13487

13588
def cross_word_count
136-
count = 0
137-
138-
data.each_index do |x|
139-
data[x].each_index do |y|
140-
count += 1 if cross_word_at?(x, y)
89+
data.each_index.sum do |x|
90+
data[x].each_index.sum do |y|
91+
cross_word_at?(x, y) ? 1 : 0
14192
end
14293
end
143-
144-
count
14594
end
14695

14796
def word_count
148-
count = 0
149-
150-
data.each_index do |x|
151-
data[x].each_index do |y|
152-
count += count_at(x, y)
97+
data.each_index.sum do |x|
98+
data[x].each_index.sum do |y|
99+
count_at(x, y)
153100
end
154101
end
155-
156-
count
157102
end
158103

159104
def vertical_count
160-
count = 0
161-
data.each_index do |x|
162-
data[x].each_index do |y|
163-
count += 1 if vertical?(x, y)
105+
data.each_index.sum do |x|
106+
data[x].each_index.sum do |y|
107+
vertical?(x, y) ? 1 : 0
164108
end
165109
end
166-
167-
count
168110
end
169111

170112
def horizonal_count
171-
count = 0
172-
data.each_index do |x|
173-
data[x].each_index do |y|
174-
count += 1 if horizontal?(x, y)
113+
data.each_index.sum do |x|
114+
data[x].each_index.sum do |y|
115+
horizontal?(x, y) ? 1 : 0
175116
end
176117
end
177-
178-
count
179118
end
180119

181120
def diagonal_count_at(row, col)
182-
count = 0
183-
count += 1 if diagonal_top_right_word(row, col) == word
184-
count += 1 if diagonal_top_left_word(row, col) == word
185-
count += 1 if diagonal_bottom_right_word(row, col) == word
186-
count += 1 if diagonal_bottom_left_word(row, col) == word
187-
count
121+
[
122+
diagonal_top_right_word(row, col),
123+
diagonal_top_left_word(row, col),
124+
diagonal_bottom_right_word(row, col),
125+
diagonal_bottom_left_word(row, col),
126+
].sum { |str| str == word ? 1 : 0}
188127
end
189128

190129
def diagonal_count
191-
count = 0
192-
193-
data.each_index do |x|
194-
data[x].each_index do |y|
195-
count += diagonal_count_at(x, y)
130+
data.each_index.sum do |x|
131+
data[x].each_index.sum do |y|
132+
diagonal_count_at(x, y)
196133
end
197134
end
198-
199-
count
200135
end
201136

202137
def log_match(prefix, row, col, check)

0 commit comments

Comments
 (0)