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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b520c95ebe0051fb847be3781d6f82a6b2f41f00e006e3935157d8c6c3843726
4
- data.tar.gz: 8cfb1439b07cf4983d17198952d56ae4b903afa994c67c549ea210063bc42eb9
3
+ metadata.gz: 3890521ee97a60869d26b02813cd151f663c41c8df2be9c43f3c1feeb753da33
4
+ data.tar.gz: 62b7ce3c679d64c2540c82376ce793e858f08dbd8f36382af54919bb0f5c4887
5
5
  SHA512:
6
- metadata.gz: b841bc0e3f1de064c2bee48eaf041528abeec5b3751486b380933ead4633ea78430445793351bf3a80eff1da9d2b535ecea6dd63ace544c18f0a456b5fd348fe
7
- data.tar.gz: 8732d36c49fc52b9292401b82b1b795f6f00994bb0ab80d2cbb029555af383fd20769cb083bb7d2af3348d7fda7811d76b693764f30699a79d239bde2cf93151
6
+ metadata.gz: 76e7431b9aadae1764e84aa94163c78dbff203f80a21acfa9a4f19a03f916f899ca751d2c1c78a6b0514722bb14ee9a3e53f6fc87fd7a69c4e6b67ef301415cb
7
+ data.tar.gz: 60d7bdbb9101ca596e85fbad048eff6efc826dc03ba300006d818c5767b361d7ef7e673e48e7113a31f9cf31040adc2f47e62e4345eeaa900564570b0e19461a
@@ -672,4 +672,8 @@ module TwistyPuzzles
672
672
  [1 + incarnation_index, cube_size / 2]
673
673
  end
674
674
  end
675
+
676
+ # TODO: Add obliques
677
+
678
+ PART_TYPES = [Corner, Edge, XCenter, TCenter, Face, Midge, Wing].freeze
675
679
  end
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TwistyPuzzles
4
- VERSION = '0.0.20'
4
+ VERSION = '0.0.24'
5
5
  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.20
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-09 00:00:00.000000000 Z
11
+ date: 2021-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize