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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be82a2641267d469bc68c47799c03783467777a5b8279e5d9dcf7341de653ed6
4
- data.tar.gz: '048163ad5b5711cbfa50e6a5a63157938f5fe77cf4185e069d0093d29faf2159'
3
+ metadata.gz: 2bdb18c89f68fabb32390a700b044586d879472b35a120fa953daf9dd8fe92c6
4
+ data.tar.gz: 59033222dd6581dc53383e05a2f5886aee43beeb93578d2db8a7b455133ad07a
5
5
  SHA512:
6
- metadata.gz: 3fb21ebf301992496ae43c9c7139bd518db0d7973020b78a8151fce1799e406eae182e0585d862493a22c6ae6d6168d17e9be81cda858fbca261f50651a803ea
7
- data.tar.gz: 526eba7127c4c83a9f3c1b1a8c6addb270a678e37311bada9418cfd74455590753f2ae756a9b0454008d9965cac563dd30fd6d1929e1935969fd0c3e643a5ec4
6
+ metadata.gz: 0aabba50c1c8d8a5edec9359a06be002fc13bf9a9171578920357eafbbb90d96e82fe8c3f3455e95c70080e1e86d974a9ab260fbc0d7e6827c5c1cd2d9c13086
7
+ data.tar.gz: 8c9004e6132a9174c5f1e92c8b116bd3d7cc6158e858bcff762f8b7d42a1656795af73243664b0e4186c212536ac43628820e37a8b9ae9b61f5b4db9d9a2af16
@@ -675,5 +675,5 @@ module TwistyPuzzles
675
675
 
676
676
  # TODO: Add obliques
677
677
 
678
- PART_TYPES = [Corner, Edge, XCenter, TCenter, Face, Edge, Midge, Wing].freeze
678
+ PART_TYPES = [Corner, Edge, XCenter, TCenter, Face, Midge, Wing].freeze
679
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,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.name == raw_part_type }
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TwistyPuzzles
4
- VERSION = '0.0.21'
4
+ VERSION = '0.0.25'
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.21
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-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