twisty_puzzles 0.0.13 → 0.0.17

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: 20cf60d5066716b3eaa148e33f1e8c598387573170e1005d034f3128e6b971cb
4
- data.tar.gz: 2770afd2a3a625f281089401c2a2ef47a6c61843d09026e9d999ee79139fe54e
3
+ metadata.gz: 440643127a42de2937ef3e1b0205f588a7d8624102dcf2596b3ff24050bf57ef
4
+ data.tar.gz: 8ef01a9cd10f729ed5bbb0f34a36fe75b5fcff2d8c9ee6cc64d4b7faa72e44a1
5
5
  SHA512:
6
- metadata.gz: 2bdf4691d6efea522b259510bcdb405820784870566948d47b653c91e2d8ca495d9946e17f0d9f703ee234bf0758b3a59969dc52e4f91eafa94659c624ac3930
7
- data.tar.gz: b28d42481604cbec6b748b025a3293eed64e2c7a90b0e6186c6eadeed63352f81b562e835f54bf6b4fbc9905bf047c917b269896c5504628c7d9c7352c1b70ec
6
+ metadata.gz: d247081d421f4b422293dc286e794cda52c04c9cb543d7ac62de8441f94117cbc028ecf7cff0a9c8100e57f1f7f87cfff0dfcfa8932e0fc60b7aa9409fd8d5df
7
+ data.tar.gz: ff1043f40ba14d3993268b4768ddfc3e8ffc7e84830c21f106a7a64d7b55a774c1120ef880e71feba101ba0f4c48b8ec920711c25a187f93b3412c27bb096002
@@ -4,7 +4,7 @@ module TwistyPuzzles
4
4
  # Base class for directions.
5
5
  class AbstractDirection
6
6
  include Comparable
7
- POSSIBLE_DIRECTION_NAMES = [[''], ['2', '2\''], ['\'', '3']].freeze
7
+ POSSIBLE_DIRECTION_NAMES = [[''], ['2', '2\''], ['\'', '3', '’']].freeze
8
8
  SIMPLE_DIRECTION_NAMES = (['0'] + POSSIBLE_DIRECTION_NAMES.map(&:first)).freeze
9
9
  POSSIBLE_SKEWB_DIRECTION_NAMES = [['', '2\''], ['\'', '2']].freeze
10
10
  SIMPLE_SKEWB_DIRECTION_NAMES = (['0'] + POSSIBLE_SKEWB_DIRECTION_NAMES.map(&:first)).freeze
@@ -133,9 +133,12 @@ module TwistyPuzzles
133
133
 
134
134
  def *(other)
135
135
  raise TypeError unless other.is_a?(Integer)
136
- raise ArgumentError if other.negative?
137
136
 
138
- self.class.new(@moves * other)
137
+ if other.negative?
138
+ inverse * -other
139
+ else
140
+ self.class.new(@moves * other)
141
+ end
139
142
  end
140
143
 
141
144
  def compiled_for_skewb
@@ -83,6 +83,21 @@ module TwistyPuzzles
83
83
  end
84
84
  end
85
85
 
86
+ # Slash commutator of the form A B A2 B' A.
87
+ class SlashCommutator < PureCommutator
88
+ def inverse
89
+ SlashCommutator.new(first_part.inverse, second_part)
90
+ end
91
+
92
+ def to_s
93
+ "[#{@first_part}/#{@second_part}]"
94
+ end
95
+
96
+ def algorithm
97
+ first_part + second_part + (first_part * 2) + second_part.inverse + first_part
98
+ end
99
+ end
100
+
86
101
  # Setup commutator of the form A B A'.
87
102
  class SetupCommutator < Commutator
88
103
  def initialize(setup, inner_commutator)
@@ -16,6 +16,12 @@ module TwistyPuzzles # rubocop:disable Style/Documentation
16
16
  OPENING_PAREN = '('
17
17
  CLOSING_BRACKET = ']'
18
18
  CLOSING_PAREN = ')'
19
+ SLASH = '/'
20
+ COMMA = ','
21
+ SETUP_SEPARATORS = %w[; :].freeze
22
+ PURE_SEPARATORS = [SLASH, COMMA].freeze
23
+ SEPARATORS = (SETUP_SEPARATORS + PURE_SEPARATORS).freeze
24
+
19
25
  TIMES = '*'
20
26
 
21
27
  def initialize(alg_string, move_parser)
@@ -89,6 +95,8 @@ module TwistyPuzzles # rubocop:disable Style/Documentation
89
95
  while (m = begin skip_spaces; parse_move_internal end)
90
96
  moves.push(m)
91
97
  end
98
+ skip_spaces
99
+ moves *= parse_multiplier if @scanner.peek(1) == TIMES
92
100
  Algorithm.new(moves)
93
101
  end
94
102
 
@@ -156,45 +164,55 @@ module TwistyPuzzles # rubocop:disable Style/Documentation
156
164
  parse_open_bracket
157
165
  first_part = parse_nonempty_moves_with_triggers
158
166
  skip_spaces
159
- parse_comma
167
+ separator = parse_pure_separator
160
168
  second_part = parse_nonempty_moves_with_triggers
161
169
  skip_spaces
162
170
  parse_close_bracket
163
- PureCommutator.new(first_part, second_part)
171
+ pseudo_pure_commutator(separator, first_part, second_part)
164
172
  end
165
173
 
166
174
  def parse_pure_commutator_no_brackets
167
175
  first_part_or_algorithm = parse_moves_with_triggers
168
176
  skip_spaces
169
- if @scanner.eos? || !@scanner.peek(1) == ','
177
+ if @scanner.eos? || !PURE_SEPARATORS.include?(@scanner.peek(1))
170
178
  return FakeCommutator.new(first_part_or_algorithm)
171
179
  end
172
180
 
173
181
  first_part = first_part_or_algorithm
174
182
  complain('move') if first_part.empty?
175
- parse_comma
183
+ separator = parse_pure_separator
176
184
  second_part = parse_nonempty_moves_with_triggers
177
185
  skip_spaces
178
- PureCommutator.new(first_part, second_part)
186
+ pseudo_pure_commutator(separator, first_part, second_part)
179
187
  end
180
188
 
181
- def parse_comma
182
- complain('middle of pure commutator') unless @scanner.getch == ','
189
+ def parse_pure_separator
190
+ separator = @scanner.getch
191
+ complain('middle of pure commutator') unless PURE_SEPARATORS.include?(separator)
192
+ separator
183
193
  end
184
194
 
185
195
  def parse_commutator_internal_after_separator(setup_or_first_part, separator)
186
- if [':', ';'].include?(separator)
196
+ if SETUP_SEPARATORS.include?(separator)
187
197
  inner_commutator = parse_setup_commutator_inner
188
198
  SetupCommutator.new(setup_or_first_part, inner_commutator)
189
- elsif separator == ','
199
+ elsif PURE_SEPARATORS.include?(separator)
190
200
  second_part = parse_nonempty_moves_with_triggers
191
- PureCommutator.new(setup_or_first_part, second_part)
201
+ pseudo_pure_commutator(separator, setup_or_first_part, second_part)
192
202
  else
193
203
  complain('end of setup or middle of pure commutator') unless @scanner.eos?
194
204
  end
195
205
  end
196
206
 
197
- SEPARATORS = %w[; : ,].freeze
207
+ def pseudo_pure_commutator(separator, first_part, second_part)
208
+ if separator == COMMA
209
+ PureCommutator.new(first_part, second_part)
210
+ elsif separator == SLASH
211
+ SlashCommutator.new(first_part, second_part)
212
+ else
213
+ complain('middle of pure commutator') unless PURE_SEPARATORS.include?(separator)
214
+ end
215
+ end
198
216
 
199
217
  def parse_separator
200
218
  separator = @scanner.getch
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TwistyPuzzles
4
- VERSION = '0.0.13'
4
+ VERSION = '0.0.17'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twisty_puzzles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernhard F. Brodowsky