@@ -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