twisty_puzzles 0.0.15 → 0.0.20

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: d5631e9c30819f3520d04ed81aa9b1ceebbee7a3da5c3b51bf2a81947f8fb3a1
4
- data.tar.gz: fc4769b6c1ebab5d14cb64ddb3e39356a408750d1d0c7954d4929156296b9f9e
3
+ metadata.gz: b520c95ebe0051fb847be3781d6f82a6b2f41f00e006e3935157d8c6c3843726
4
+ data.tar.gz: 8cfb1439b07cf4983d17198952d56ae4b903afa994c67c549ea210063bc42eb9
5
5
  SHA512:
6
- metadata.gz: c941aaef4dbf2bc8d580d712d669042061c20670aadcf2ee353f353eae4eb31713de9d4791f6d8126e4427ef9e7125562e26b53c85f0a92e09bfe120e8f24f04
7
- data.tar.gz: 5e943e567b069fd2b2e21c77fdc7a48ad3e81fb365832439cd1f402da838b5771bc7af4b2293bf635fa1b6de158ddfbea78f9981e690ce3e72a6149c6b042bd2
6
+ metadata.gz: b841bc0e3f1de064c2bee48eaf041528abeec5b3751486b380933ead4633ea78430445793351bf3a80eff1da9d2b535ecea6dd63ace544c18f0a456b5fd348fe
7
+ data.tar.gz: 8732d36c49fc52b9292401b82b1b795f6f00994bb0ab80d2cbb029555af383fd20769cb083bb7d2af3348d7fda7811d76b693764f30699a79d239bde2cf93151
@@ -9,6 +9,7 @@
9
9
  #include "skewb_coordinate.h"
10
10
  #include "skewb_layer_fingerprint.h"
11
11
  #include "skewb_state.h"
12
+ #include "sticker_cycle.h"
12
13
 
13
14
  VALUE TwistyPuzzlesModule = Qnil;
14
15
  VALUE NativeModule = Qnil;
@@ -25,4 +26,5 @@ void Init_native() {
25
26
  init_skewb_coordinate_class_under(NativeModule);
26
27
  init_skewb_layer_fingerprint_method_under(NativeModule);
27
28
  init_skewb_state_class_under(NativeModule);
29
+ init_sticker_cycle_class_under(NativeModule);
28
30
  }
@@ -0,0 +1,196 @@
1
+ #include "cube_state.h"
2
+
3
+ #include "cube_coordinate.h"
4
+ #include "cube_state.h"
5
+ #include "utils.h"
6
+
7
+ static ID reverse;
8
+
9
+ typedef struct {
10
+ long cube_size;
11
+ size_t length;
12
+ VALUE coordinates;
13
+ size_t* indices;
14
+ } StickerCycleData;
15
+
16
+ extern const rb_data_type_t StickerCycleData_type;
17
+
18
+ #define GetStickerCycleData(obj, data) \
19
+ do { \
20
+ TypedData_Get_Struct((obj), StickerCycleData, &StickerCycleData_type, (data)); \
21
+ } while (0)
22
+
23
+ #define GetInitializedStickerCycleData(obj, data) \
24
+ do { \
25
+ GetStickerCycleData((obj), (data)); \
26
+ if (data->indices == NULL) { \
27
+ rb_raise(rb_eArgError, "Sticker cycle isn't initialized."); \
28
+ } \
29
+ } while(0)
30
+
31
+ static VALUE StickerCycleClass = Qnil;
32
+
33
+ static void StickerCycleData_mark(void* const ptr) {
34
+ const StickerCycleData* data = ptr;
35
+ rb_gc_mark(data->coordinates);
36
+ }
37
+
38
+ static void StickerCycleData_free(void* const ptr) {
39
+ const StickerCycleData* const data = ptr;
40
+ free(data->indices);
41
+ free(ptr);
42
+ }
43
+
44
+ static size_t StickerCycleData_size(const void* const ptr) {
45
+ const StickerCycleData* const data = ptr;
46
+ return sizeof(StickerCycleData) + num_stickers(data->cube_size) * sizeof(VALUE);
47
+ }
48
+
49
+ const rb_data_type_t StickerCycleData_type = {
50
+ "TwistyPuzzles::Native::StickerCycleData",
51
+ {StickerCycleData_mark, StickerCycleData_free, StickerCycleData_size, NULL},
52
+ NULL, NULL,
53
+ RUBY_TYPED_FREE_IMMEDIATELY
54
+ };
55
+
56
+ static VALUE* malloc_indices(const size_t n) {
57
+ VALUE* const indices = malloc(n * sizeof(size_t));
58
+ if (indices == NULL) {
59
+ rb_raise(rb_eNoMemError, "Allocating sticker cycle failed.");
60
+ }
61
+ return indices;
62
+ }
63
+
64
+ static VALUE StickerCycle_alloc(const VALUE klass) {
65
+ StickerCycleData* data;
66
+ const VALUE object = TypedData_Make_Struct(klass, StickerCycleData, &StickerCycleData_type, data);
67
+ data->cube_size = 0;
68
+ data->length = 0;
69
+ data->coordinates = Qnil;
70
+ data->indices = NULL;
71
+ return object;
72
+ }
73
+
74
+ static VALUE StickerCycle_initialize(const VALUE self, const VALUE cube_size, const VALUE coordinates) {
75
+ Check_Type(cube_size, T_FIXNUM);
76
+ Check_Type(coordinates, T_ARRAY);
77
+ const long checked_cube_size = FIX2INT(cube_size);
78
+ check_cube_size(checked_cube_size);
79
+ const size_t n = RARRAY_LEN(coordinates);
80
+ StickerCycleData* data;
81
+ GetStickerCycleData(self, data);
82
+ data->cube_size = checked_cube_size;
83
+ data->length = n;
84
+ data->coordinates = coordinates;
85
+ data->indices = malloc_indices(data->length);
86
+ for (size_t i = 0; i < n; ++i) {
87
+ const VALUE coordinate = rb_ary_entry(coordinates, i);
88
+ data->indices[i] = CubeCoordinate_sticker_index(coordinate, checked_cube_size);
89
+ }
90
+ return self;
91
+ }
92
+
93
+ static VALUE StickerCycle_apply_to(const VALUE self, const VALUE cube_state) {
94
+ const StickerCycleData* sticker_cycle_data;
95
+ GetInitializedStickerCycleData(self, sticker_cycle_data);
96
+
97
+ const CubeStateData* cube_state_data;
98
+ GetInitializedCubeStateData(cube_state, cube_state_data);
99
+
100
+ if (cube_state_data->cube_size != sticker_cycle_data->cube_size) {
101
+ rb_raise(rb_eArgError, "Cube size of sticker cycle must equal cube size of cube state. Got %ld vs %ld.", sticker_cycle_data->cube_size, cube_state_data->cube_size);
102
+ }
103
+ if (sticker_cycle_data->length >= 2) {
104
+ apply_sticker_cycle(cube_state_data->stickers, sticker_cycle_data->indices, sticker_cycle_data->length, false);
105
+ }
106
+ return Qnil;
107
+ }
108
+
109
+ static VALUE StickerCycle_hash(const VALUE self) {
110
+ const StickerCycleData* data;
111
+ GetInitializedStickerCycleData(self, data);
112
+
113
+ st_index_t hash = rb_hash_start((st_index_t)StickerCycle_hash);
114
+ hash = rb_hash_uint(hash, data->length);
115
+ hash = rb_hash_uint(hash, data->cube_size);
116
+ const size_t n = data->length;
117
+ for (size_t i = 0; i < n; ++i) {
118
+ hash = rb_hash_uint(hash, data->indices[i]);
119
+ }
120
+ return ST2FIX(rb_hash_end(hash));
121
+ }
122
+
123
+ static VALUE StickerCycle_eql(const VALUE self, const VALUE other) {
124
+ if (self == other) {
125
+ return Qtrue;
126
+ }
127
+ if (rb_obj_class(self) != rb_obj_class(other)) {
128
+ return Qfalse;
129
+ }
130
+ const StickerCycleData* self_data;
131
+ GetInitializedStickerCycleData(self, self_data);
132
+ const StickerCycleData* other_data;
133
+ GetInitializedStickerCycleData(other, other_data);
134
+ if (self_data->cube_size != other_data->cube_size) {
135
+ return Qfalse;
136
+ }
137
+ if (self_data->length != other_data->length) {
138
+ return Qfalse;
139
+ }
140
+ const size_t n = self_data->length;
141
+ for (size_t i = 0; i < n; ++i) {
142
+ if (self_data->indices[i] != other_data->indices[i]) {
143
+ return Qfalse;
144
+ }
145
+ }
146
+ return Qtrue;
147
+ }
148
+
149
+ static VALUE StickerCycle_cube_size(const VALUE self) {
150
+ const StickerCycleData* data;
151
+ GetInitializedStickerCycleData(self, data);
152
+ return ST2FIX(data->cube_size);
153
+ }
154
+
155
+ static VALUE StickerCycle_length(const VALUE self) {
156
+ const StickerCycleData* data;
157
+ GetInitializedStickerCycleData(self, data);
158
+ return ST2FIX(data->length);
159
+ }
160
+
161
+ static VALUE StickerCycle_coordinates(const VALUE self) {
162
+ const StickerCycleData* data;
163
+ GetInitializedStickerCycleData(self, data);
164
+ return data->coordinates;
165
+ }
166
+
167
+ static VALUE StickerCycle_inverse(const VALUE self) {
168
+ const StickerCycleData* data;
169
+ GetInitializedStickerCycleData(self, data);
170
+ const long n = data->length;
171
+ StickerCycleData* inverse_data;
172
+ const VALUE inverse = TypedData_Make_Struct(rb_obj_class(self), StickerCycleData, &StickerCycleData_type, inverse_data);
173
+ inverse_data->cube_size = data->cube_size;
174
+ inverse_data->length = n;
175
+ inverse_data->indices = malloc_indices(n);
176
+ inverse_data->coordinates = rb_funcall(data->coordinates, reverse, 0);
177
+ for (int i = 0; i < n; ++i) {
178
+ inverse_data->indices[i] = data->indices[n - 1 - i];
179
+ }
180
+ return inverse;
181
+ }
182
+
183
+ void init_sticker_cycle_class_under(const VALUE module) {
184
+ reverse = rb_intern("reverse");
185
+ StickerCycleClass = rb_define_class_under(module, "StickerCycle", rb_cObject);
186
+ rb_define_alloc_func(StickerCycleClass, StickerCycle_alloc);
187
+ rb_define_method(StickerCycleClass, "initialize", StickerCycle_initialize, 2);
188
+ rb_define_method(StickerCycleClass, "apply_to", StickerCycle_apply_to, 1);
189
+ rb_define_method(StickerCycleClass, "hash", StickerCycle_hash, 0);
190
+ rb_define_method(StickerCycleClass, "eql?", StickerCycle_eql, 1);
191
+ rb_define_alias(StickerCycleClass, "==", "eql?");
192
+ rb_define_method(StickerCycleClass, "cube_size", StickerCycle_cube_size, 0);
193
+ rb_define_method(StickerCycleClass, "length", StickerCycle_length, 0);
194
+ rb_define_method(StickerCycleClass, "coordinates", StickerCycle_coordinates, 0);
195
+ rb_define_method(StickerCycleClass, "inverse", StickerCycle_inverse, 0);
196
+ }
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+
3
+ #include <ruby.h>
4
+
5
+ void init_sticker_cycle_class_under(VALUE module);
@@ -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
@@ -28,6 +28,16 @@ module TwistyPuzzles
28
28
  @colors_to_face_symbols = face_symbols_to_colors.invert
29
29
  end
30
30
 
31
+ def eql?(other)
32
+ self.class.equal?(other.class) && colors == other.colors
33
+ end
34
+
35
+ alias == eql?
36
+
37
+ def hash
38
+ @hash ||= ([self.class] + colors).hash
39
+ end
40
+
31
41
  def color(face_symbol)
32
42
  @face_symbols_to_colors[face_symbol]
33
43
  end
@@ -4,7 +4,6 @@ require 'twisty_puzzles/cube'
4
4
  require 'twisty_puzzles/cube_constants'
5
5
  require 'twisty_puzzles/coordinate'
6
6
  require 'twisty_puzzles/cube_print_helper'
7
- require 'twisty_puzzles/state_helper'
8
7
  require 'twisty_puzzles/utils/array_helper'
9
8
  require 'twisty_puzzles/native'
10
9
 
@@ -13,7 +12,6 @@ module TwistyPuzzles
13
12
  class CubeState
14
13
  include Utils::ArrayHelper
15
14
  include CubePrintHelper
16
- include StateHelper
17
15
  include CubeConstants
18
16
 
19
17
  def self.check_cube_size(cube_size)
@@ -75,6 +73,10 @@ module TwistyPuzzles
75
73
 
76
74
  alias == eql?
77
75
 
76
+ def hash
77
+ @hash ||= [self.class, @native].hash
78
+ end
79
+
78
80
  def rotation_algorithms
79
81
  Rotation::ALL_ROTATIONS.combination(2).reject do |r0, r1|
80
82
  r0.inverse == r1
@@ -85,10 +87,6 @@ module TwistyPuzzles
85
87
  rotation_algorithms.any? { |r| r.apply_temporarily_to(self) { |state| state == other } }
86
88
  end
87
89
 
88
- def hash
89
- @hash ||= [self.class, @native].hash
90
- end
91
-
92
90
  # TODO: Get rid of this backwards compatibility artifact
93
91
  def sticker_array(face)
94
92
  raise TypeError unless face.is_a?(Face)
@@ -95,6 +95,8 @@ module TwistyPuzzles # rubocop:disable Style/Documentation
95
95
  while (m = begin skip_spaces; parse_move_internal end)
96
96
  moves.push(m)
97
97
  end
98
+ skip_spaces
99
+ moves *= parse_multiplier if @scanner.peek(1) == TIMES
98
100
  Algorithm.new(moves)
99
101
  end
100
102
 
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'twisty_puzzles/utils/array_helper'
4
+ require 'twisty_puzzles/sticker_cycle_factory'
5
+ require 'twisty_puzzles/cube'
6
+
7
+ module TwistyPuzzles
8
+ # A cycle of parts of the cube, e.g. a corner 3 cycle.
9
+ # Note that this is abstract and contains no information on the cube size.
10
+ # E.g. for wings on a 7x7, it's not clear whether inner or outer wings are used.
11
+ # Check StickerCycleFactory for making it concrete and applyable.
12
+ class PartCycle
13
+ include Utils::ArrayHelper
14
+
15
+ def initialize(parts)
16
+ check_types(parts, Part)
17
+ check_type_consistency(parts)
18
+
19
+ @parts = parts
20
+ end
21
+
22
+ attr_reader :parts
23
+
24
+ def eql?(other)
25
+ self.class.equal?(other.class) && @parts == other.parts
26
+ end
27
+
28
+ alias == eql?
29
+
30
+ def hash
31
+ @hash ||= ([self.class] + @parts).hash
32
+ end
33
+
34
+ def check_type_consistency(parts)
35
+ return unless parts.any? { |p| p.class != parts.first.class }
36
+
37
+ raise TypeError, "Cycles of heterogenous piece types #{parts.inspect} are not supported."
38
+ end
39
+ end
40
+ end
@@ -22,6 +22,7 @@ module TwistyPuzzles
22
22
  when SkewbDirection::ZERO then CubeDirection::ZERO
23
23
  when SkewbDirection::FORWARD then CubeDirection::FORWARD
24
24
  when SkewbDirection::BACKWARD then CubeDirection::BACKWARD
25
+ else raise
25
26
  end
26
27
  end
27
28
 
@@ -3,14 +3,12 @@
3
3
  require 'twisty_puzzles/coordinate'
4
4
  require 'twisty_puzzles/cube'
5
5
  require 'twisty_puzzles/cube_print_helper'
6
- require 'twisty_puzzles/state_helper'
7
6
  require 'twisty_puzzles/cube_constants'
8
7
 
9
8
  module TwistyPuzzles
10
9
  # Represents the state (i.e. the sticker positions) of a Skewb.
11
10
  class SkewbState
12
11
  include CubePrintHelper
13
- include StateHelper
14
12
  include CubeConstants
15
13
  # Pairs of coordinate pairs that should match in case of solved layers.
16
14
  MATCHING_CORNERS =
@@ -151,14 +149,5 @@ module TwistyPuzzles
151
149
 
152
150
  layer_check_neighbors(face).map { |c| self[c] }.uniq.length == 1
153
151
  end
154
-
155
- def rotate_face(face, direction)
156
- neighbors = face.neighbors
157
- inverse_order_face = face.coordinate_index_close_to(neighbors[0]) <
158
- face.coordinate_index_close_to(neighbors[1])
159
- direction = direction.inverse if inverse_order_face
160
- cycle = SkewbCoordinate.corners_on_face(face)
161
- apply_4sticker_cycle(cycle, direction)
162
- end
163
152
  end
164
153
  end
@@ -10,22 +10,47 @@ module TwistyPuzzles
10
10
  class StickerCycle
11
11
  include ReversibleApplyable
12
12
 
13
- def initialize(cube_size, sticker_cycle)
14
- @cube_size = cube_size
15
- @sticker_cycle = sticker_cycle
13
+ def self.from_coordinates(cube_size, coordinates)
14
+ CubeState.check_cube_size(cube_size)
15
+ raise TypeError unless coordinates.all?(Coordinate)
16
+
17
+ new(Native::StickerCycle.new(cube_size, coordinates.map(&:native)))
18
+ end
19
+
20
+ def initialize(native)
21
+ raise TypeError unless native.is_a?(Native::StickerCycle)
22
+
23
+ @native = native
24
+ end
25
+
26
+ attr_reader :native
27
+
28
+ def eql?(other)
29
+ self.class.equal?(other.class) && @native == other.native
16
30
  end
17
31
 
18
- attr_reader :cube_size, :sticker_cycle
32
+ alias == eql?
33
+
34
+ def hash
35
+ @hash ||= [self.class, @native].hash
36
+ end
37
+
38
+ def cube_size
39
+ @native.cube_size
40
+ end
41
+
42
+ def length
43
+ @native.length
44
+ end
19
45
 
20
46
  def apply_to(cube_state)
21
47
  raise TypeError unless cube_state.is_a?(CubeState)
22
- raise ArgumentError unless cube_state.n == @cube_size
23
48
 
24
- cube_state.apply_sticker_cycle(@sticker_cycle) if @sticker_cycle.length >= 2
49
+ @native.apply_to(cube_state.native)
25
50
  end
26
51
 
27
52
  def inverse
28
- StickerCycle.new(@cube_size, @sticker_cycle.reverse)
53
+ StickerCycle.new(@native.inverse)
29
54
  end
30
55
  end
31
56
 
@@ -38,7 +63,7 @@ module TwistyPuzzles
38
63
  sticker_cycles.each do |c|
39
64
  raise TypeError unless c.is_a?(StickerCycle)
40
65
 
41
- c.sticker_cycle.each do |s|
66
+ c.native.coordinates.each do |s|
42
67
  raise ArgumentError unless affected_set.add?(s)
43
68
  end
44
69
  end
@@ -2,10 +2,11 @@
2
2
 
3
3
  require 'twisty_puzzles/sticker_cycle'
4
4
  require 'twisty_puzzles/utils/array_helper'
5
+ require 'twisty_puzzles/cube'
5
6
 
6
7
  module TwistyPuzzles
7
8
  # Factory for sticker cycles given part cycles.
8
- class PartCycleFactory
9
+ class StickerCycleFactory
9
10
  include Utils::ArrayHelper
10
11
 
11
12
  def initialize(cube_size, incarnation_index)
@@ -28,7 +29,7 @@ module TwistyPuzzles
28
29
  raise TypeError, 'Twists are only supported for edges and corners.'
29
30
  end
30
31
 
31
- cycles = parts.map { |p| StickerCycle.new(@cube_size, coordinates(p)) }
32
+ cycles = parts.map { |p| StickerCycle.from_coordinates(@cube_size, coordinates(p)) }
32
33
  StickerCycles.new(@cube_size, cycles)
33
34
  end
34
35
 
@@ -49,7 +50,7 @@ module TwistyPuzzles
49
50
  check_types(parts, Part)
50
51
  check_type_consistency(parts)
51
52
  part_coordinates = parts.map { |p| coordinates(p) }
52
- cycles = part_coordinates.transpose.map { |c| StickerCycle.new(@cube_size, c) }
53
+ cycles = part_coordinates.transpose.map { |c| StickerCycle.from_coordinates(@cube_size, c) }
53
54
  StickerCycles.new(@cube_size, cycles)
54
55
  end
55
56
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TwistyPuzzles
4
- VERSION = '0.0.15'
4
+ VERSION = '0.0.20'
5
5
  end
@@ -24,7 +24,7 @@ require 'twisty_puzzles/letter_scheme'
24
24
  require 'twisty_puzzles/move_type_creator'
25
25
  require 'twisty_puzzles/native'
26
26
  require 'twisty_puzzles/parser'
27
- require 'twisty_puzzles/part_cycle_factory'
27
+ require 'twisty_puzzles/part_cycle'
28
28
  require 'twisty_puzzles/puzzle'
29
29
  require 'twisty_puzzles/reversible_applyable'
30
30
  require 'twisty_puzzles/rotation'
@@ -33,8 +33,8 @@ require 'twisty_puzzles/skewb_move'
33
33
  require 'twisty_puzzles/skewb_move_parser'
34
34
  require 'twisty_puzzles/skewb_notation'
35
35
  require 'twisty_puzzles/skewb_state'
36
- require 'twisty_puzzles/state_helper'
37
36
  require 'twisty_puzzles/sticker_cycle'
37
+ require 'twisty_puzzles/sticker_cycle_factory'
38
38
  require 'twisty_puzzles/twisty_puzzles_error'
39
39
  require 'twisty_puzzles/version'
40
40
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twisty_puzzles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernhard F. Brodowsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-01 00:00:00.000000000 Z
11
+ date: 2021-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -196,6 +196,8 @@ files:
196
196
  - ext/twisty_puzzles/native/skewb_layer_fingerprint.h
197
197
  - ext/twisty_puzzles/native/skewb_state.c
198
198
  - ext/twisty_puzzles/native/skewb_state.h
199
+ - ext/twisty_puzzles/native/sticker_cycle.c
200
+ - ext/twisty_puzzles/native/sticker_cycle.h
199
201
  - ext/twisty_puzzles/native/utils.c
200
202
  - ext/twisty_puzzles/native/utils.h
201
203
  - lib/twisty_puzzles.rb
@@ -222,7 +224,7 @@ files:
222
224
  - lib/twisty_puzzles/letter_scheme.rb
223
225
  - lib/twisty_puzzles/move_type_creator.rb
224
226
  - lib/twisty_puzzles/parser.rb
225
- - lib/twisty_puzzles/part_cycle_factory.rb
227
+ - lib/twisty_puzzles/part_cycle.rb
226
228
  - lib/twisty_puzzles/puzzle.rb
227
229
  - lib/twisty_puzzles/reversible_applyable.rb
228
230
  - lib/twisty_puzzles/rotation.rb
@@ -231,8 +233,8 @@ files:
231
233
  - lib/twisty_puzzles/skewb_move_parser.rb
232
234
  - lib/twisty_puzzles/skewb_notation.rb
233
235
  - lib/twisty_puzzles/skewb_state.rb
234
- - lib/twisty_puzzles/state_helper.rb
235
236
  - lib/twisty_puzzles/sticker_cycle.rb
237
+ - lib/twisty_puzzles/sticker_cycle_factory.rb
236
238
  - lib/twisty_puzzles/twisty_puzzles_error.rb
237
239
  - lib/twisty_puzzles/utils.rb
238
240
  - lib/twisty_puzzles/utils/array_helper.rb
@@ -260,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
262
  - !ruby/object:Gem::Version
261
263
  version: '0'
262
264
  requirements: []
263
- rubygems_version: 3.2.3
265
+ rubygems_version: 3.2.22
264
266
  signing_key:
265
267
  specification_version: 4
266
268
  summary: Gem for my cube_trainer rails app. Some things are better left in a separate
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'twisty_puzzles/abstract_direction'
4
-
5
- module TwistyPuzzles
6
- # Common utilities for different puzzle states.
7
- # TODO: Remove
8
- module StateHelper
9
- def apply_sticker_cycle(cycle)
10
- last_sticker = self[cycle[-1]]
11
- (cycle.length - 1).downto(1) do |i|
12
- self[cycle[i]] = self[cycle[i - 1]]
13
- end
14
- self[cycle[0]] = last_sticker
15
- end
16
-
17
- def apply_4sticker_cycle(cycle, direction)
18
- raise ArgumentError unless cycle.length == 4
19
- raise TypeError unless direction.is_a?(AbstractDirection)
20
-
21
- if direction.double_move?
22
- apply_sticker_cycle([cycle[0], cycle[2]])
23
- apply_sticker_cycle([cycle[1], cycle[3]])
24
- else
25
- # Note that we cannot do reverse! because the values are cached.
26
- actual_cycle = direction.value == 3 ? cycle.reverse : cycle
27
- apply_sticker_cycle(actual_cycle)
28
- end
29
- end
30
- end
31
- end