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.
- data/lib/scrambler.rb +3 -1
- data/lib/scrambler/megaminx.rb +14 -0
- data/lib/scrambler/square1.rb +61 -0
- data/lib/scrambler/version.rb +1 -1
- data/spec/scrambler/clock_spec.rb +1 -1
- data/spec/scrambler/megaminx_spec.rb +27 -0
- data/spec/scrambler/square1_spec.rb +12 -0
- metadata +5 -1
data/lib/scrambler.rb
CHANGED
@@ -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
|
data/lib/scrambler/version.rb
CHANGED
@@ -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)
|
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
|
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
|