aoc_rb_helpers 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15a53c3fd46773e8f18a1e5d0e9d76ba14a42f908c244b5628fd9c913f199739
4
- data.tar.gz: c500c60c483e56f472b5b254428c805d44aec5d253f03377c7e65e2592e38d07
3
+ metadata.gz: e9049a2637e249afd1d2670f1b4ca3616aa21ef94ae10efb271178693ff16f63
4
+ data.tar.gz: 485a04d7594ef25fbec3fb2ca19060c8f5699a30fb0845ec9c985a899aae5be4
5
5
  SHA512:
6
- metadata.gz: 117da557cc26d663671fa7ff39b4557e730da2d57484c573631750ad5d7d8733c96d8c3a6841d6aa48db3eecbdcaa1800d1244bd3b3587175a08745bc93ad912
7
- data.tar.gz: a6bdd6ae05609d22bb1d486ea73aa5b62ffa246a6677e76573e4b1957cf5df2f9db896a4b3ab7ec31116aa0e696b6065fbc399816c5b213d9d9d06ebdebdbbf9
6
+ metadata.gz: 6343e8180d5ab30baecad403c7765b4a666562a713154541c70ee6a602ecaa3253c08a25f89db76d36e4e86371901564b34eb7ba779fbbaa2e011cb543edf10a
7
+ data.tar.gz: dade32999ee76bbda52f4615cad719ab2dc4ab2209dccf88b6756b0f63d125d7dfe40b76d61e85245c599b472b29e426c5dd110b91c5c3eb46bd8ffd1ab96f84
data/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
  ## [Unreleased]
8
8
  - No unreleased changes!
9
9
 
10
+ ## [0.0.3]
11
+ ### Added
12
+ - Characters `I` and `T` now supported by DotMatrix
13
+ - Updated README with links to documentation
14
+ - Added documentation link to gemspec
15
+
10
16
  ## [0.0.2]
11
17
  ### Added
12
18
  - DotMatrix class for decoding printed puzzle output
data/README.md CHANGED
@@ -35,6 +35,29 @@ pd some_object
35
35
 
36
36
  You can read more on how you can use `pd` in their [README](https://github.com/AndyObtiva/puts_debuggerer/blob/master/README.md).
37
37
 
38
+ ## Provided Helper Classes
39
+
40
+ All documentation is available here - https://rubydoc.info/github/pacso/aoc_rb_helpers.
41
+
42
+ The provided helper classes are as follows:
43
+
44
+ ### [AocInput](https://rubydoc.info/github/pacso/aoc_rb_helpers/AocInput)
45
+ Provides input manipulation helper methods. Methods are chainable, and directly modify the parsed view of the input data within the `@data` instance variable.
46
+
47
+ ### [DotMatrix](https://rubydoc.info/github/pacso/aoc_rb_helpers/DotMatrix)
48
+ Parses and decodes ASCII art text from puzzles. Can output to STDOUT or return the result to your code.
49
+
50
+ Will turn an input like:
51
+ ```ruby
52
+ XX XXXX X XXXX X XX X XXXXX XX XXX
53
+ X X X X X X X X X XX X X X
54
+ X XXX X XXX X X X X X XXX X X
55
+ X X X X X X X X X X XX
56
+ X X X X X X X X X X X X X
57
+ XX X XXXX XXXX XXXX XX X X XX XXX
58
+ ```
59
+ Into the string `CFLELOYFCS`.
60
+
38
61
  ## Examples
39
62
 
40
63
  Below are some examples of how you can use the features of this gem.
@@ -71,3 +94,19 @@ module Year2024
71
94
  end
72
95
  end
73
96
  ```
97
+
98
+ ### Decoding printed text
99
+
100
+ ```ruby
101
+ text_input = <<~EOF
102
+ X X XXXX X X XX
103
+ X X X X X X X
104
+ XXXX XXX X X X X
105
+ X X X X X X X
106
+ X X X X X X X
107
+ X X XXXX XXXX XXXX XX
108
+ EOF
109
+
110
+ input_array = text_input.lines(chomp: true).map(&:chars)
111
+ DotMatrix.decode(input_array) # returns the string "HELLO"
112
+ ```
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.required_ruby_version = Gem::Requirement.new("~> 3.1", ">= 3.1.0")
14
14
 
15
15
  spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["documentation_uri"] = "https://rubydoc.info/github/pacso/aoc_rb_helpers"
16
17
  spec.metadata["changelog_uri"] = "https://github.com/pacso/aoc_rb_helpers/blob/main/CHANGELOG"
17
18
 
18
19
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
@@ -1,127 +1,151 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Parses and decodes ASCII art text from puzzles. Can output to STDOUT or return the result to your code.
3
4
  class DotMatrix
4
- CHAR_WIDTH = 5
5
5
  DICTIONARY = {
6
6
  a: [
7
- " XX ",
8
- "X X ",
9
- "X X ",
10
- "XXXX ",
11
- "X X ",
12
- "X X "
7
+ " XX ",
8
+ "X X",
9
+ "X X",
10
+ "XXXX",
11
+ "X X",
12
+ "X X"
13
13
  ],
14
14
  b: [
15
- "XXX ",
16
- "X X ",
17
- "XXX ",
18
- "X X ",
19
- "X X ",
20
- "XXX "
15
+ "XXX ",
16
+ "X X",
17
+ "XXX ",
18
+ "X X",
19
+ "X X",
20
+ "XXX "
21
21
  ],
22
22
  c: [
23
- " XX ",
24
- "X X ",
25
- "X ",
26
- "X ",
27
- "X X ",
28
- " XX "
23
+ " XX ",
24
+ "X X",
25
+ "X ",
26
+ "X ",
27
+ "X X",
28
+ " XX "
29
+ ],
30
+ d: [
31
+ "XXX ",
32
+ "X X",
33
+ "X X",
34
+ "X X",
35
+ "X X",
36
+ "XXX "
29
37
  ],
30
38
  e: [
31
- "XXXX ",
32
- "X ",
33
- "XXX ",
34
- "X ",
35
- "X ",
36
- "XXXX "
39
+ "XXXX",
40
+ "X ",
41
+ "XXX ",
42
+ "X ",
43
+ "X ",
44
+ "XXXX"
37
45
  ],
38
46
  f: [
39
- "XXXX ",
40
- "X ",
41
- "XXX ",
42
- "X ",
43
- "X ",
44
- "X "
47
+ "XXXX",
48
+ "X ",
49
+ "XXX ",
50
+ "X ",
51
+ "X ",
52
+ "X "
45
53
  ],
46
54
  g: [
47
- " XX ",
48
- "X X ",
49
- "X ",
50
- "X XX ",
51
- "X X ",
52
- " XXX "
55
+ " XX ",
56
+ "X X",
57
+ "X ",
58
+ "X XX",
59
+ "X X",
60
+ " XXX"
53
61
  ],
54
62
  h: [
55
- "X X ",
56
- "X X ",
57
- "XXXX ",
58
- "X X ",
59
- "X X ",
60
- "X X ",
63
+ "X X",
64
+ "X X",
65
+ "XXXX",
66
+ "X X",
67
+ "X X",
68
+ "X X",
69
+ ],
70
+ i: [
71
+ "XXX",
72
+ " X ",
73
+ " X ",
74
+ " X ",
75
+ " X ",
76
+ "XXX"
61
77
  ],
62
78
  j: [
63
- " XX ",
64
- " X ",
65
- " X ",
66
- " X ",
67
- "X X ",
68
- " XX ",
79
+ " XX",
80
+ " X",
81
+ " X",
82
+ " X",
83
+ "X X",
84
+ " XX ",
69
85
  ],
70
86
  k: [
71
- "X X ",
72
- "X X ",
73
- "XX ",
74
- "X X ",
75
- "X X ",
76
- "X X ",
87
+ "X X",
88
+ "X X ",
89
+ "XX ",
90
+ "X X ",
91
+ "X X ",
92
+ "X X",
77
93
  ],
78
94
  l: [
79
- "X ",
80
- "X ",
81
- "X ",
82
- "X ",
83
- "X ",
84
- "XXXX ",
95
+ "X ",
96
+ "X ",
97
+ "X ",
98
+ "X ",
99
+ "X ",
100
+ "XXXX",
85
101
  ],
86
102
  o: [
87
- " XX ",
88
- "X X ",
89
- "X X ",
90
- "X X ",
91
- "X X ",
92
- " XX "
103
+ " XX ",
104
+ "X X",
105
+ "X X",
106
+ "X X",
107
+ "X X",
108
+ " XX "
93
109
  ],
94
110
  p: [
95
- "XXX ",
96
- "X X ",
97
- "X X ",
98
- "XXX ",
99
- "X ",
100
- "X ",
111
+ "XXX ",
112
+ "X X",
113
+ "X X",
114
+ "XXX ",
115
+ "X ",
116
+ "X ",
101
117
  ],
102
118
  r: [
103
- "XXX ",
104
- "X X ",
105
- "X X ",
106
- "XXX ",
107
- "X X ",
108
- "X X ",
119
+ "XXX ",
120
+ "X X",
121
+ "X X",
122
+ "XXX ",
123
+ "X X ",
124
+ "X X",
109
125
  ],
110
126
  s: [
111
- " XXX ",
112
- "X ",
113
- "X ",
114
- " XX ",
115
- " X ",
116
- "XXX ",
127
+ " XXX",
128
+ "X ",
129
+ "X ",
130
+ " XX ",
131
+ " X",
132
+ "XXX ",
133
+ ],
134
+ t: [
135
+ "XXX",
136
+ " X ",
137
+ " X ",
138
+ " X ",
139
+ " X ",
140
+ " X "
117
141
  ],
118
142
  u: [
119
- "X X ",
120
- "X X ",
121
- "X X ",
122
- "X X ",
123
- "X X ",
124
- " XX ",
143
+ "X X",
144
+ "X X",
145
+ "X X",
146
+ "X X",
147
+ "X X",
148
+ " XX ",
125
149
  ],
126
150
  y: [
127
151
  "X X",
@@ -132,12 +156,12 @@ class DotMatrix
132
156
  " X "
133
157
  ],
134
158
  z: [
135
- "XXXX ",
136
- " X ",
137
- " X ",
138
- " X ",
139
- "X ",
140
- "XXXX ",
159
+ "XXXX",
160
+ " X",
161
+ " X ",
162
+ " X ",
163
+ "X ",
164
+ "XXXX",
141
165
  ]
142
166
  }
143
167
 
@@ -157,6 +181,8 @@ class DotMatrix
157
181
  @input = input
158
182
  @on = on
159
183
  @off = off
184
+
185
+ convert_characters
160
186
  end
161
187
 
162
188
  # Prints the input array to STDOUT and returns self.
@@ -178,25 +204,18 @@ class DotMatrix
178
204
  # Returns the decoded input.
179
205
  # @return [String] the decoded input
180
206
  def to_s
181
- (0...max_chars).map do |char_index|
207
+ cursor = 0
208
+ decoded = ""
209
+ while cursor < max_cursor
182
210
  begin
183
- char_map = printable_content.map do |row|
184
- row[char_offset(char_index)...char_offset(char_index + 1)].join
185
- end
186
-
187
- unless @on == "X" && @off == " "
188
- new_map = []
189
- char_map.each do |row|
190
- row_chars = []
191
- row.chars.each do |cell|
192
- row_chars.push(cell == @on ? "X" : " ")
193
- end
194
- new_map.push(row_chars.join)
195
- end
196
- char_map = new_map
211
+ cursor += 1 while @input.all? { |row| row[cursor] == ' ' }
212
+ cursor_end = cursor_range(cursor)
213
+ char_map = @input.map do |row|
214
+ row[cursor...cursor_end].join
197
215
  end
216
+ cursor = cursor_end
198
217
 
199
- DICTIONARY.find { |_, map| map == char_map }[0].to_s.upcase
218
+ decoded += DICTIONARY.find { |_, map| map == char_map }[0].to_s.upcase
200
219
  rescue NoMethodError
201
220
  puts "ERROR: Missing character in dictionary:\n\n"
202
221
  print(char_map)
@@ -204,31 +223,34 @@ class DotMatrix
204
223
  print
205
224
  break
206
225
  end
207
- end.join
208
- end
226
+ end
209
227
 
210
- private
211
- def char_offset(index)
212
- index * CHAR_WIDTH
228
+ decoded
213
229
  end
214
230
 
215
- def printable_range(row)
216
- row[first_position..last_position]
217
- end
231
+ private
218
232
 
219
- def printable_content
220
- @input.map { |row| printable_range(row) }
233
+ def convert_characters
234
+ unless @on == "X" && @off == " "
235
+ @input = @input.map do |row|
236
+ row.map do |cell|
237
+ cell == @on ? "X" : " "
238
+ end
239
+ end
240
+ end
221
241
  end
222
242
 
223
- def first_position
224
- @input.map { |row| row.index { |dot| dot != ' ' } }.min
243
+ def cursor_range(cursor)
244
+ c = cursor
245
+ c += 1 while @input.any? { |row| row[c] != ' ' } && c - cursor < max_cursor_range
246
+ c
225
247
  end
226
248
 
227
- def last_position
228
- @input.map { |row| row.rindex { |dot| dot != ' ' } }.max + 1
249
+ def max_cursor
250
+ @input.first.length - 4
229
251
  end
230
252
 
231
- def max_chars
232
- printable_content.first.length / CHAR_WIDTH
253
+ def max_cursor_range
254
+ DICTIONARY.values.map { |v| v.first.length }.max
233
255
  end
234
256
  end
@@ -1,3 +1,3 @@
1
1
  module AocRbHelpers
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aoc_rb_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Pascoe
@@ -77,6 +77,7 @@ licenses:
77
77
  - MIT
78
78
  metadata:
79
79
  homepage_uri: https://github.com/pacso/aoc_rb_helpers
80
+ documentation_uri: https://rubydoc.info/github/pacso/aoc_rb_helpers
80
81
  changelog_uri: https://github.com/pacso/aoc_rb_helpers/blob/main/CHANGELOG
81
82
  post_install_message:
82
83
  rdoc_options: []