scrambler 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,4 +3,6 @@ require "scrambler/core_ext"
3
3
 
4
4
  require "scrambler/cube"
5
5
  require "scrambler/pyraminx"
6
- require "scrambler/clock"
6
+ require "scrambler/clock"
7
+ require "scrambler/square1"
8
+ require "scrambler/megaminx"
@@ -0,0 +1,14 @@
1
+ module Scrambler
2
+ class Megaminx
3
+ def scramble(lines = 7, columns = 10)
4
+ turns = %w(R D)
5
+ variants = %w(-- ++)
6
+ variants_for_u = ["'", ""]
7
+ (1..lines).map do |line|
8
+ ((1..columns).map do |column|
9
+ turns.sample + variants.sample
10
+ end + ["U#{variants_for_u.sample}"]).join(" ")
11
+ end.join("\n")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,61 @@
1
+ module Scrambler
2
+ class Square1
3
+ def scramble
4
+ scramble = []
5
+ up_layer = (0..7).map{|i| i%2 == 0 ? 30 : 60}
6
+ down_layer = [up_layer].flatten!
7
+ length = 0
8
+ begin
9
+ up_moves = possible_moves up_layer
10
+ down_moves = possible_moves down_layer
11
+ up_move = up_moves.sample
12
+ down_moves.delete 0 if up_move == 0
13
+ down_move = down_moves.sample
14
+ scramble << [humanize_sq_one_move(up_layer, up_move), humanize_sq_one_move(down_layer, down_move) * -1]
15
+ do_move up_layer, up_move
16
+ do_move down_layer, down_move
17
+ length += up_move == 0 ? 0 : 1
18
+ length += down_move == 0 ? 0 : 1
19
+ do_slice(up_layer, down_layer)
20
+ length += 1
21
+ end while length <= 40 + 1
22
+ scramble.map {|s| "(#{s.join(',')})"}.join(' ')
23
+ end
24
+
25
+ private
26
+ def humanize_sq_one_move(layer, move)
27
+ move = layer[0..move - 1].inject(0){|sum, x| x == 30 ? sum + 1 : sum + 2} unless move == 0
28
+ move > 6 ? move - 12 : move
29
+ end
30
+
31
+ def possible_moves(layer)
32
+ layer_moves = []
33
+ layer.length.times do |start|
34
+ sum = 0
35
+ possible = false
36
+ layer.length.times do |i|
37
+ sum += layer[(start + i) % layer.length]
38
+ possible = true if sum == 180
39
+ end
40
+ layer_moves << start if possible
41
+ end
42
+ layer_moves
43
+ end
44
+
45
+ def do_move(layer, l)
46
+ l %= layer.length
47
+ l.times do
48
+ layer << layer.shift
49
+ end
50
+ layer
51
+ end
52
+
53
+ def do_slice(up, down)
54
+ sum = 0
55
+ small_up, big_up = up.partition {|n| sum += n; sum <= 180}
56
+ small_down, big_down = down.partition {|n| sum += n; sum <= 540}
57
+ up.replace(small_down.reverse + big_up)
58
+ down.replace(small_up.reverse + big_down)
59
+ end
60
+ end
61
+ end
@@ -1,3 +1,3 @@
1
1
  module Scrambler
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -24,7 +24,7 @@ describe Scrambler::Clock do
24
24
  it "should only turn clocks between -5 and 6 hours" do
25
25
  10.times do
26
26
  subject.scramble.scan(/u=(-?\d+)/) do |value|
27
- (-5..6).should include(value.first.to_i) # test for value being a number
27
+ (-5..6).should include(value.first.to_i)
28
28
  end
29
29
  end
30
30
  end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Scrambler::Megaminx do
4
+ let(:valid_turns) { %w(R++ R-- D++ D--) }
5
+
6
+ it "should default to 7 lines and 10 columns" do
7
+ lines = subject.scramble.split("\n")
8
+ lines.should have(7).elements
9
+ lines.each do |line|
10
+ line.split(" ").should have(11).elements
11
+ end
12
+ end
13
+
14
+ it "should have U / U' at the end of each line" do
15
+ subject.scramble.split("\n").each do |line|
16
+ line.should match(/U'?\Z/)
17
+ end
18
+ end
19
+
20
+ it "should contain R++/R-- and D++/D-- turns at the first 'column' turns" do
21
+ subject.scramble.split("\n"). each do |line|
22
+ line.split(" ")[0..-2].each do |turn|
23
+ valid_turns.should include(turn)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe Scrambler::Square1 do
4
+ let(:valid_turns) { %w(L L' L2 R R' R2 U U' U2 D D' D2 B B' B2 F F' F2
5
+ Lw Lw' Lw2 Rw Rw' Rw2 Uw Uw' Uw2 Dw Dw' Dw2 Bw Bw' Bw2 Fw Fw' Fw2) }
6
+
7
+ it "should contain only valid turns" do
8
+ subject.scramble.split(" ").each do |turn|
9
+ turn.should match(/\(-?\d,-?\d\)/)
10
+ end
11
+ end
12
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: scrambler
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Tim Habermaas
@@ -35,15 +35,19 @@ files:
35
35
  - lib/scrambler/clock.rb
36
36
  - lib/scrambler/core_ext.rb
37
37
  - lib/scrambler/cube.rb
38
+ - lib/scrambler/megaminx.rb
38
39
  - lib/scrambler/pyraminx.rb
40
+ - lib/scrambler/square1.rb
39
41
  - lib/scrambler/version.rb
40
42
  - lib/scrambler.rb
41
43
  - spec/scrambler/clock_spec.rb
42
44
  - spec/scrambler/five_by_five_spec.rb
43
45
  - spec/scrambler/four_by_four_spec.rb
46
+ - spec/scrambler/megaminx_spec.rb
44
47
  - spec/scrambler/pyraminx_spec.rb
45
48
  - spec/scrambler/seven_by_seven_spec.rb
46
49
  - spec/scrambler/six_by_six_spec.rb
50
+ - spec/scrambler/square1_spec.rb
47
51
  - spec/scrambler/three_by_three_spec.rb
48
52
  - spec/scrambler/two_by_two_spec.rb
49
53
  - spec/spec_helper.rb