aoc_rb_helpers 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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: []