twisty_puzzles 0.0.21 → 0.0.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/twisty_puzzles/cube.rb +1 -1
- data/lib/twisty_puzzles/part_cycle.rb +40 -2
- data/lib/twisty_puzzles/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bdb18c89f68fabb32390a700b044586d879472b35a120fa953daf9dd8fe92c6
|
4
|
+
data.tar.gz: 59033222dd6581dc53383e05a2f5886aee43beeb93578d2db8a7b455133ad07a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0aabba50c1c8d8a5edec9359a06be002fc13bf9a9171578920357eafbbb90d96e82fe8c3f3455e95c70080e1e86d974a9ab260fbc0d7e6827c5c1cd2d9c13086
|
7
|
+
data.tar.gz: 8c9004e6132a9174c5f1e92c8b116bd3d7cc6158e858bcff762f8b7d42a1656795af73243664b0e4186c212536ac43628820e37a8b9ae9b61f5b4db9d9a2af16
|
data/lib/twisty_puzzles/cube.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'twisty_puzzles/utils/array_helper'
|
4
|
+
require 'twisty_puzzles/utils/string_helper'
|
4
5
|
require 'twisty_puzzles/sticker_cycle_factory'
|
5
6
|
require 'twisty_puzzles/cube'
|
6
7
|
|
@@ -11,6 +12,10 @@ module TwistyPuzzles
|
|
11
12
|
# Check StickerCycleFactory for making it concrete and applyable.
|
12
13
|
class PartCycle
|
13
14
|
include Utils::ArrayHelper
|
15
|
+
include Utils::StringHelper
|
16
|
+
extend Utils::StringHelper
|
17
|
+
|
18
|
+
RAW_DATA_RESERVED = [' ', '(', ')'].freeze
|
14
19
|
|
15
20
|
def initialize(parts)
|
16
21
|
raise ArgumentError if parts.empty?
|
@@ -37,21 +42,54 @@ module TwistyPuzzles
|
|
37
42
|
@parts.first.class
|
38
43
|
end
|
39
44
|
|
45
|
+
def contains_any_part?(parts)
|
46
|
+
!(@parts & parts).empty?
|
47
|
+
end
|
48
|
+
|
40
49
|
def to_s
|
41
50
|
@parts.join(' ')
|
42
51
|
end
|
43
52
|
|
44
53
|
def to_raw_data
|
45
|
-
"#{part_type}(#{self})"
|
54
|
+
"#{simple_class_name(part_type)}(#{self})"
|
46
55
|
end
|
47
56
|
|
48
57
|
def length
|
49
58
|
@parts.length
|
50
59
|
end
|
51
60
|
|
61
|
+
def rotate_by(number)
|
62
|
+
self.class.new(@parts.rotate(number))
|
63
|
+
end
|
64
|
+
|
65
|
+
def map_rotate_by(number)
|
66
|
+
self.class.new(@parts.map { |p| p.rotate_by(number) })
|
67
|
+
end
|
68
|
+
|
69
|
+
def <=>(other)
|
70
|
+
@parts <=> other.parts
|
71
|
+
end
|
72
|
+
|
73
|
+
def canonicalize
|
74
|
+
@canonicalize ||=
|
75
|
+
@parts.map.with_index do |part, index|
|
76
|
+
min_part = part.rotations.min
|
77
|
+
map_rotate_by_number = part.rotations.index(min_part)
|
78
|
+
rotate_by(index).map_rotate_by(map_rotate_by_number)
|
79
|
+
end.min
|
80
|
+
end
|
81
|
+
|
82
|
+
def equivalent?(other)
|
83
|
+
self == other || canonicalize == other.canonicalize
|
84
|
+
end
|
85
|
+
|
86
|
+
def inverse
|
87
|
+
self.class.new([@parts[0]] + @parts[1..].reverse)
|
88
|
+
end
|
89
|
+
|
52
90
|
def self.from_raw_data(data)
|
53
91
|
raw_part_type, raw_parts = data.match(/(.*)\((.*)\)/).captures
|
54
|
-
part_type = PART_TYPES.find { |p| p
|
92
|
+
part_type = PART_TYPES.find { |p| simple_class_name(p) == raw_part_type }
|
55
93
|
parts = raw_parts.split.map { |r| part_type.parse(r) }
|
56
94
|
new(parts)
|
57
95
|
end
|
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.
|
4
|
+
version: 0.0.25
|
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-
|
11
|
+
date: 2021-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|