twisty_puzzles 0.0.20 → 0.0.24
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 +4 -0
- data/lib/twisty_puzzles/part_cycle.rb +62 -0
- 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: 3890521ee97a60869d26b02813cd151f663c41c8df2be9c43f3c1feeb753da33
|
4
|
+
data.tar.gz: 62b7ce3c679d64c2540c82376ce793e858f08dbd8f36382af54919bb0f5c4887
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76e7431b9aadae1764e84aa94163c78dbff203f80a21acfa9a4f19a03f916f899ca751d2c1c78a6b0514722bb14ee9a3e53f6fc87fd7a69c4e6b67ef301415cb
|
7
|
+
data.tar.gz: 60d7bdbb9101ca596e85fbad048eff6efc826dc03ba300006d818c5767b361d7ef7e673e48e7113a31f9cf31040adc2f47e62e4345eeaa900564570b0e19461a
|
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,8 +12,13 @@ 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
|
+
|
17
|
+
RAW_DATA_RESERVED = [' ', '(', ')'].freeze
|
14
18
|
|
15
19
|
def initialize(parts)
|
20
|
+
raise ArgumentError if parts.empty?
|
21
|
+
|
16
22
|
check_types(parts, Part)
|
17
23
|
check_type_consistency(parts)
|
18
24
|
|
@@ -31,6 +37,62 @@ module TwistyPuzzles
|
|
31
37
|
@hash ||= ([self.class] + @parts).hash
|
32
38
|
end
|
33
39
|
|
40
|
+
def part_type
|
41
|
+
@parts.first.class
|
42
|
+
end
|
43
|
+
|
44
|
+
def contains_any_part?(parts)
|
45
|
+
!(@parts & parts).empty?
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
@parts.join(' ')
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_raw_data
|
53
|
+
"#{simple_class_name(part_type)}(#{self})"
|
54
|
+
end
|
55
|
+
|
56
|
+
def length
|
57
|
+
@parts.length
|
58
|
+
end
|
59
|
+
|
60
|
+
def rotate_by(number)
|
61
|
+
self.class.new(@parts.rotate(number))
|
62
|
+
end
|
63
|
+
|
64
|
+
def map_rotate_by(number)
|
65
|
+
self.class.new(@parts.map { |p| p.rotate_by(number) })
|
66
|
+
end
|
67
|
+
|
68
|
+
def <=>(other)
|
69
|
+
@parts <=> other.parts
|
70
|
+
end
|
71
|
+
|
72
|
+
def canonicalize
|
73
|
+
@canonicalize ||=
|
74
|
+
@parts.map.with_index do |part, index|
|
75
|
+
min_part = part.rotations.min
|
76
|
+
map_rotate_by_number = part.rotations.index(min_part)
|
77
|
+
rotate_by(index).map_rotate_by(map_rotate_by_number)
|
78
|
+
end.min
|
79
|
+
end
|
80
|
+
|
81
|
+
def equivalent?(other)
|
82
|
+
self == other || canonicalize == other.canonicalize
|
83
|
+
end
|
84
|
+
|
85
|
+
def inverse
|
86
|
+
self.class.new([@parts[0]] + @parts[1..].reverse)
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.from_raw_data(data)
|
90
|
+
raw_part_type, raw_parts = data.match(/(.*)\((.*)\)/).captures
|
91
|
+
part_type = PART_TYPES.find { |p| simple_class_name(p) == raw_part_type }
|
92
|
+
parts = raw_parts.split.map { |r| part_type.parse(r) }
|
93
|
+
new(parts)
|
94
|
+
end
|
95
|
+
|
34
96
|
def check_type_consistency(parts)
|
35
97
|
return unless parts.any? { |p| p.class != parts.first.class }
|
36
98
|
|
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.24
|
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
|