rubyks 0.0.1
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.
- checksums.yaml +15 -0
- data/lib/rubyks.rb +834 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NDI5NTIwMDkzYTM2NDA2Nzk0ZjU0YTE4Y2ZkNTJiMzRjMTMyMDM2MQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OTVkYTVmNGQzNjExY2JmYjMyZjA4MmIzZjBmZDc5OTlhN2MwMjM2Yw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjJmMzBiYTUxMjA4YjZjZDYxZWQ3ZDQ4NzRhMjM0ZTQ5NjA0ZmU3OWRkN2Vj
|
10
|
+
YmQzMjNhMDE5NTZjNGZlN2FkY2MxNjlkNzYzMWZjMWRjNTAxY2U0YjM4NjI4
|
11
|
+
NmM2Zjc2N2Q2YWUxMWNjYzFjNGVkNjcwZDQ2OTk2NzkxNzkwNmM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDRkMGFmMTZmMDI2ODExNzU1NmQ5NjJlMjdmMzI0NGM5MzNmOTk5NjU3NTZk
|
14
|
+
ODZiNjJkZWZhNWM2NmZkODNlOGRmMmNmY2EyOGQxNmI3ZTZlZjI3MDk5NmQz
|
15
|
+
MjFjNDFmZGU0MjRhYmUyM2ZhNmMwNjBjYzkyNDNkYmViOWRkMTQ=
|
data/lib/rubyks.rb
ADDED
@@ -0,0 +1,834 @@
|
|
1
|
+
class Cube
|
2
|
+
attr_accessor :cube, :hist
|
3
|
+
|
4
|
+
#New cubes are instantiated in a solved state with a clean history.
|
5
|
+
def initialize
|
6
|
+
@cube = [[0,0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2],[3,3,3,3,3,3,3,3,3],[4,4,4,4,4,4,4,4,4],[5,5,5,5,5,5,5,5,5]]
|
7
|
+
@hist = []
|
8
|
+
end
|
9
|
+
|
10
|
+
#Removes any 4 of the same move in a row in @hist. Any move repeated four times ends the cube in the state it started in.
|
11
|
+
def clean_hist
|
12
|
+
i = 0
|
13
|
+
until i == @hist.length
|
14
|
+
if @hist[i] == @hist[i+1] && @hist[i] == @hist[i+2] && @hist[i] == @hist[i+3]
|
15
|
+
4.times {@hist.delete_at(i)}
|
16
|
+
i = -1
|
17
|
+
end
|
18
|
+
i += 1
|
19
|
+
end
|
20
|
+
|
21
|
+
i = 0
|
22
|
+
until i == @hist.length
|
23
|
+
if @hist[i] == @hist[i+1] && @hist[i].length < 3
|
24
|
+
@hist.delete_at(i)
|
25
|
+
@hist[i] = "#{@hist[i]}2"
|
26
|
+
i = -1
|
27
|
+
end
|
28
|
+
i += 1
|
29
|
+
end
|
30
|
+
|
31
|
+
@hist.join(', ')
|
32
|
+
end
|
33
|
+
|
34
|
+
#Scrambles cube with 100 random moves and clears history
|
35
|
+
def scramble
|
36
|
+
100.times do
|
37
|
+
turn = rand(5)
|
38
|
+
self.l if turn == 0
|
39
|
+
self.r if turn == 1
|
40
|
+
self.u if turn == 2
|
41
|
+
self.d if turn == 3
|
42
|
+
self.f if turn == 4
|
43
|
+
self.b if turn == 5
|
44
|
+
end
|
45
|
+
@hist = []
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
#Turns left face clockwise
|
50
|
+
def l
|
51
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
52
|
+
|
53
|
+
cubetemp[0][1] = @cube[2][1]
|
54
|
+
cubetemp[0][2] = @cube[2][2]
|
55
|
+
cubetemp[0][8] = @cube[2][8]
|
56
|
+
|
57
|
+
cubetemp[2][1] = @cube[5][1]
|
58
|
+
cubetemp[2][2] = @cube[5][2]
|
59
|
+
cubetemp[2][8] = @cube[5][8]
|
60
|
+
|
61
|
+
cubetemp[5][1] = @cube[4][1]
|
62
|
+
cubetemp[5][2] = @cube[4][2]
|
63
|
+
cubetemp[5][8] = @cube[4][8]
|
64
|
+
|
65
|
+
cubetemp[4][1] = @cube[0][1]
|
66
|
+
cubetemp[4][2] = @cube[0][2]
|
67
|
+
cubetemp[4][8] = @cube[0][8]
|
68
|
+
|
69
|
+
|
70
|
+
cubetemp[1][1] = @cube[1][7]
|
71
|
+
cubetemp[1][2] = @cube[1][8]
|
72
|
+
cubetemp[1][3] = @cube[1][1]
|
73
|
+
cubetemp[1][4] = @cube[1][2]
|
74
|
+
cubetemp[1][5] = @cube[1][3]
|
75
|
+
cubetemp[1][6] = @cube[1][4]
|
76
|
+
cubetemp[1][7] = @cube[1][5]
|
77
|
+
cubetemp[1][8] = @cube[1][6]
|
78
|
+
|
79
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
80
|
+
@hist << 'l'
|
81
|
+
self
|
82
|
+
end
|
83
|
+
#Turns left face counter-clockwise
|
84
|
+
def lr
|
85
|
+
3.times do
|
86
|
+
self.l
|
87
|
+
@hist.pop
|
88
|
+
end
|
89
|
+
@hist << 'lr'
|
90
|
+
self
|
91
|
+
end
|
92
|
+
#Turns left face twice
|
93
|
+
def l2
|
94
|
+
self.l.l
|
95
|
+
@hist << 'l2'
|
96
|
+
self
|
97
|
+
end
|
98
|
+
|
99
|
+
#Turns right face clockwise
|
100
|
+
def r
|
101
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
102
|
+
|
103
|
+
cubetemp[0][4] = @cube[4][4]
|
104
|
+
cubetemp[0][5] = @cube[4][5]
|
105
|
+
cubetemp[0][6] = @cube[4][6]
|
106
|
+
|
107
|
+
cubetemp[4][4] = @cube[5][4]
|
108
|
+
cubetemp[4][5] = @cube[5][5]
|
109
|
+
cubetemp[4][6] = @cube[5][6]
|
110
|
+
|
111
|
+
cubetemp[5][4] = @cube[2][4]
|
112
|
+
cubetemp[5][5] = @cube[2][5]
|
113
|
+
cubetemp[5][6] = @cube[2][6]
|
114
|
+
|
115
|
+
cubetemp[2][4] = @cube[0][4]
|
116
|
+
cubetemp[2][5] = @cube[0][5]
|
117
|
+
cubetemp[2][6] = @cube[0][6]
|
118
|
+
|
119
|
+
cubetemp[3][1] = @cube[3][7]
|
120
|
+
cubetemp[3][2] = @cube[3][8]
|
121
|
+
cubetemp[3][3] = @cube[3][1]
|
122
|
+
cubetemp[3][4] = @cube[3][2]
|
123
|
+
cubetemp[3][5] = @cube[3][3]
|
124
|
+
cubetemp[3][6] = @cube[3][4]
|
125
|
+
cubetemp[3][7] = @cube[3][5]
|
126
|
+
cubetemp[3][8] = @cube[3][6]
|
127
|
+
|
128
|
+
@hist << 'r'
|
129
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
130
|
+
self
|
131
|
+
end
|
132
|
+
#Turns right face counter-clockwise
|
133
|
+
def rr
|
134
|
+
3.times do
|
135
|
+
self.r
|
136
|
+
@hist.pop
|
137
|
+
end
|
138
|
+
@hist << "rr"
|
139
|
+
self
|
140
|
+
end
|
141
|
+
#Turns right face twice
|
142
|
+
def r2
|
143
|
+
self.r.r
|
144
|
+
@hist << 'r2'
|
145
|
+
self
|
146
|
+
end
|
147
|
+
|
148
|
+
#Turns front face clockwise
|
149
|
+
def f
|
150
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
151
|
+
|
152
|
+
cubetemp[0][6] = @cube[1][6]
|
153
|
+
cubetemp[0][7] = @cube[1][7]
|
154
|
+
cubetemp[0][8] = @cube[1][8]
|
155
|
+
|
156
|
+
cubetemp[1][6] = @cube[5][2]
|
157
|
+
cubetemp[1][7] = @cube[5][3]
|
158
|
+
cubetemp[1][8] = @cube[5][4]
|
159
|
+
|
160
|
+
cubetemp[5][2] = @cube[3][6]
|
161
|
+
cubetemp[5][3] = @cube[3][7]
|
162
|
+
cubetemp[5][4] = @cube[3][8]
|
163
|
+
|
164
|
+
cubetemp[3][8] = @cube[0][8]
|
165
|
+
cubetemp[3][7] = @cube[0][7]
|
166
|
+
cubetemp[3][6] = @cube[0][6]
|
167
|
+
|
168
|
+
cubetemp[4][1] = @cube[4][7]
|
169
|
+
cubetemp[4][2] = @cube[4][8]
|
170
|
+
cubetemp[4][3] = @cube[4][1]
|
171
|
+
cubetemp[4][4] = @cube[4][2]
|
172
|
+
cubetemp[4][5] = @cube[4][3]
|
173
|
+
cubetemp[4][6] = @cube[4][4]
|
174
|
+
cubetemp[4][7] = @cube[4][5]
|
175
|
+
cubetemp[4][8] = @cube[4][6]
|
176
|
+
|
177
|
+
@hist << 'f'
|
178
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
179
|
+
self
|
180
|
+
end
|
181
|
+
#Turns front face counter-clockwise
|
182
|
+
def fr
|
183
|
+
3.times do
|
184
|
+
self.f
|
185
|
+
@hist.pop
|
186
|
+
end
|
187
|
+
@hist << "fr"
|
188
|
+
self
|
189
|
+
end
|
190
|
+
#Turns front face twice
|
191
|
+
def f2
|
192
|
+
self.f.f
|
193
|
+
@hist << 'f2'
|
194
|
+
self
|
195
|
+
end
|
196
|
+
|
197
|
+
#Turns back face clockwise
|
198
|
+
def b
|
199
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
200
|
+
|
201
|
+
cubetemp[0][2] = @cube[3][2]
|
202
|
+
cubetemp[0][3] = @cube[3][3]
|
203
|
+
cubetemp[0][4] = @cube[3][4]
|
204
|
+
|
205
|
+
cubetemp[1][2] = @cube[0][2]
|
206
|
+
cubetemp[1][3] = @cube[0][3]
|
207
|
+
cubetemp[1][4] = @cube[0][4]
|
208
|
+
|
209
|
+
cubetemp[3][2] = @cube[5][6]
|
210
|
+
cubetemp[3][3] = @cube[5][7]
|
211
|
+
cubetemp[3][4] = @cube[5][8]
|
212
|
+
|
213
|
+
cubetemp[5][6] = @cube[1][2]
|
214
|
+
cubetemp[5][7] = @cube[1][3]
|
215
|
+
cubetemp[5][8] = @cube[1][4]
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
cubetemp[2][1] = @cube[2][7]
|
220
|
+
cubetemp[2][2] = @cube[2][8]
|
221
|
+
cubetemp[2][3] = @cube[2][1]
|
222
|
+
cubetemp[2][4] = @cube[2][2]
|
223
|
+
cubetemp[2][5] = @cube[2][3]
|
224
|
+
cubetemp[2][6] = @cube[2][4]
|
225
|
+
cubetemp[2][7] = @cube[2][5]
|
226
|
+
cubetemp[2][8] = @cube[2][6]
|
227
|
+
|
228
|
+
@hist << 'b'
|
229
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
230
|
+
self
|
231
|
+
end
|
232
|
+
#Turns back face counter-clockwise
|
233
|
+
def br
|
234
|
+
3.times do
|
235
|
+
self.b
|
236
|
+
@hist.pop
|
237
|
+
end
|
238
|
+
@hist << "br"
|
239
|
+
self
|
240
|
+
end
|
241
|
+
#Turns back face twice
|
242
|
+
def b2
|
243
|
+
self.b.b
|
244
|
+
@hist << 'b2'
|
245
|
+
self
|
246
|
+
end
|
247
|
+
|
248
|
+
#Turns top face clockwise
|
249
|
+
def u
|
250
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
251
|
+
|
252
|
+
cubetemp[1][4] = @cube[4][2]
|
253
|
+
cubetemp[1][5] = @cube[4][3]
|
254
|
+
cubetemp[1][6] = @cube[4][4]
|
255
|
+
|
256
|
+
cubetemp[4][2] = @cube[3][8]
|
257
|
+
cubetemp[4][3] = @cube[3][1]
|
258
|
+
cubetemp[4][4] = @cube[3][2]
|
259
|
+
|
260
|
+
cubetemp[3][8] = @cube[2][6]
|
261
|
+
cubetemp[3][1] = @cube[2][7]
|
262
|
+
cubetemp[3][2] = @cube[2][8]
|
263
|
+
|
264
|
+
cubetemp[2][6] = @cube[1][4]
|
265
|
+
cubetemp[2][7] = @cube[1][5]
|
266
|
+
cubetemp[2][8] = @cube[1][6]
|
267
|
+
|
268
|
+
cubetemp[0][1] = @cube[0][7]
|
269
|
+
cubetemp[0][2] = @cube[0][8]
|
270
|
+
cubetemp[0][3] = @cube[0][1]
|
271
|
+
cubetemp[0][4] = @cube[0][2]
|
272
|
+
cubetemp[0][5] = @cube[0][3]
|
273
|
+
cubetemp[0][6] = @cube[0][4]
|
274
|
+
cubetemp[0][7] = @cube[0][5]
|
275
|
+
cubetemp[0][8] = @cube[0][6]
|
276
|
+
|
277
|
+
@hist << 'u'
|
278
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
279
|
+
self
|
280
|
+
end
|
281
|
+
#turns top face counter-clockwise
|
282
|
+
def ur
|
283
|
+
3.times do
|
284
|
+
self.u
|
285
|
+
@hist.pop
|
286
|
+
end
|
287
|
+
@hist << "ur"
|
288
|
+
self
|
289
|
+
end
|
290
|
+
#turns top face twice
|
291
|
+
def u2
|
292
|
+
self.u.u
|
293
|
+
@hist << 'u2'
|
294
|
+
self
|
295
|
+
end
|
296
|
+
|
297
|
+
#Turns bottom face clockwise
|
298
|
+
def d
|
299
|
+
cubetemp = Marshal.load(Marshal.dump(@cube))
|
300
|
+
|
301
|
+
cubetemp[1][8] = @cube[2][2]
|
302
|
+
cubetemp[1][1] = @cube[2][3]
|
303
|
+
cubetemp[1][2] = @cube[2][4]
|
304
|
+
|
305
|
+
cubetemp[2][2] = @cube[3][4]
|
306
|
+
cubetemp[2][3] = @cube[3][5]
|
307
|
+
cubetemp[2][4] = @cube[3][6]
|
308
|
+
|
309
|
+
cubetemp[3][4] = @cube[4][6]
|
310
|
+
cubetemp[3][5] = @cube[4][7]
|
311
|
+
cubetemp[3][6] = @cube[4][8]
|
312
|
+
|
313
|
+
cubetemp[4][6] = @cube[1][8]
|
314
|
+
cubetemp[4][7] = @cube[1][1]
|
315
|
+
cubetemp[4][8] = @cube[1][2]
|
316
|
+
|
317
|
+
cubetemp[5][1] = @cube[5][7]
|
318
|
+
cubetemp[5][2] = @cube[5][8]
|
319
|
+
cubetemp[5][3] = @cube[5][1]
|
320
|
+
cubetemp[5][4] = @cube[5][2]
|
321
|
+
cubetemp[5][5] = @cube[5][3]
|
322
|
+
cubetemp[5][6] = @cube[5][4]
|
323
|
+
cubetemp[5][7] = @cube[5][5]
|
324
|
+
cubetemp[5][8] = @cube[5][6]
|
325
|
+
|
326
|
+
@hist << 'd'
|
327
|
+
@cube = Marshal.load(Marshal.dump(cubetemp))
|
328
|
+
self
|
329
|
+
end
|
330
|
+
#Turns bottom face counter-clockwise
|
331
|
+
def dr
|
332
|
+
3.times do
|
333
|
+
self.d
|
334
|
+
@hist.pop
|
335
|
+
end
|
336
|
+
@hist << "dr"
|
337
|
+
self
|
338
|
+
end
|
339
|
+
#Turns bottom face twice
|
340
|
+
def d2
|
341
|
+
self.d.d
|
342
|
+
@hist << 'l2'
|
343
|
+
self
|
344
|
+
end
|
345
|
+
|
346
|
+
# Turns cube clockwise ONCE, like "u" but rest of cube moves too.
|
347
|
+
def turn
|
348
|
+
cubetemp = [[],[],[],[],[],[]]
|
349
|
+
|
350
|
+
cubetemp[0][0] = @cube[0][0]
|
351
|
+
cubetemp[0][1] = @cube[0][7]
|
352
|
+
cubetemp[0][2] = @cube[0][8]
|
353
|
+
cubetemp[0][3] = @cube[0][1]
|
354
|
+
cubetemp[0][4] = @cube[0][2]
|
355
|
+
cubetemp[0][5] = @cube[0][3]
|
356
|
+
cubetemp[0][6] = @cube[0][4]
|
357
|
+
cubetemp[0][7] = @cube[0][5]
|
358
|
+
cubetemp[0][8] = @cube[0][6]
|
359
|
+
|
360
|
+
cubetemp[1][0] = @cube[4][0]
|
361
|
+
cubetemp[1][1] = @cube[4][7]
|
362
|
+
cubetemp[1][2] = @cube[4][8]
|
363
|
+
cubetemp[1][3] = @cube[4][1]
|
364
|
+
cubetemp[1][4] = @cube[4][2]
|
365
|
+
cubetemp[1][5] = @cube[4][3]
|
366
|
+
cubetemp[1][6] = @cube[4][4]
|
367
|
+
cubetemp[1][7] = @cube[4][5]
|
368
|
+
cubetemp[1][8] = @cube[4][6]
|
369
|
+
|
370
|
+
cubetemp[2][0] = @cube[1][0]
|
371
|
+
cubetemp[2][1] = @cube[1][7]
|
372
|
+
cubetemp[2][2] = @cube[1][8]
|
373
|
+
cubetemp[2][3] = @cube[1][1]
|
374
|
+
cubetemp[2][4] = @cube[1][2]
|
375
|
+
cubetemp[2][5] = @cube[1][3]
|
376
|
+
cubetemp[2][6] = @cube[1][4]
|
377
|
+
cubetemp[2][7] = @cube[1][5]
|
378
|
+
cubetemp[2][8] = @cube[1][6]
|
379
|
+
|
380
|
+
cubetemp[3][0] = @cube[2][0]
|
381
|
+
cubetemp[3][1] = @cube[2][7]
|
382
|
+
cubetemp[3][2] = @cube[2][8]
|
383
|
+
cubetemp[3][3] = @cube[2][1]
|
384
|
+
cubetemp[3][4] = @cube[2][2]
|
385
|
+
cubetemp[3][5] = @cube[2][3]
|
386
|
+
cubetemp[3][6] = @cube[2][4]
|
387
|
+
cubetemp[3][7] = @cube[2][5]
|
388
|
+
cubetemp[3][8] = @cube[2][6]
|
389
|
+
|
390
|
+
cubetemp[4][0] = @cube[3][0]
|
391
|
+
cubetemp[4][1] = @cube[3][7]
|
392
|
+
cubetemp[4][2] = @cube[3][8]
|
393
|
+
cubetemp[4][3] = @cube[3][1]
|
394
|
+
cubetemp[4][4] = @cube[3][2]
|
395
|
+
cubetemp[4][5] = @cube[3][3]
|
396
|
+
cubetemp[4][6] = @cube[3][4]
|
397
|
+
cubetemp[4][7] = @cube[3][5]
|
398
|
+
cubetemp[4][8] = @cube[3][6]
|
399
|
+
|
400
|
+
cubetemp[5][0] = @cube[5][0]
|
401
|
+
cubetemp[5][1] = @cube[5][3]
|
402
|
+
cubetemp[5][2] = @cube[5][4]
|
403
|
+
cubetemp[5][3] = @cube[5][5]
|
404
|
+
cubetemp[5][4] = @cube[5][6]
|
405
|
+
cubetemp[5][5] = @cube[5][7]
|
406
|
+
cubetemp[5][6] = @cube[5][8]
|
407
|
+
cubetemp[5][7] = @cube[5][1]
|
408
|
+
cubetemp[5][8] = @cube[5][2]
|
409
|
+
|
410
|
+
@hist << 'turn'
|
411
|
+
@cube = cubetemp
|
412
|
+
self
|
413
|
+
end
|
414
|
+
|
415
|
+
#Turns cube over ONCE, like "fr" but rest of cube moves too.
|
416
|
+
def turn_over
|
417
|
+
cubetemp = [[],[],[],[],[],[]]
|
418
|
+
|
419
|
+
cubetemp[0][0] = @cube[3][0]
|
420
|
+
cubetemp[0][1] = @cube[3][1]
|
421
|
+
cubetemp[0][2] = @cube[3][2]
|
422
|
+
cubetemp[0][3] = @cube[3][3]
|
423
|
+
cubetemp[0][4] = @cube[3][4]
|
424
|
+
cubetemp[0][5] = @cube[3][5]
|
425
|
+
cubetemp[0][6] = @cube[3][6]
|
426
|
+
cubetemp[0][7] = @cube[3][7]
|
427
|
+
cubetemp[0][8] = @cube[3][8]
|
428
|
+
|
429
|
+
cubetemp[1][0] = @cube[0][0]
|
430
|
+
cubetemp[1][1] = @cube[0][1]
|
431
|
+
cubetemp[1][2] = @cube[0][2]
|
432
|
+
cubetemp[1][3] = @cube[0][3]
|
433
|
+
cubetemp[1][4] = @cube[0][4]
|
434
|
+
cubetemp[1][5] = @cube[0][5]
|
435
|
+
cubetemp[1][6] = @cube[0][6]
|
436
|
+
cubetemp[1][7] = @cube[0][7]
|
437
|
+
cubetemp[1][8] = @cube[0][8]
|
438
|
+
|
439
|
+
cubetemp[2][0] = @cube[2][0]
|
440
|
+
cubetemp[2][1] = @cube[2][7]
|
441
|
+
cubetemp[2][2] = @cube[2][8]
|
442
|
+
cubetemp[2][3] = @cube[2][1]
|
443
|
+
cubetemp[2][4] = @cube[2][2]
|
444
|
+
cubetemp[2][5] = @cube[2][3]
|
445
|
+
cubetemp[2][6] = @cube[2][4]
|
446
|
+
cubetemp[2][7] = @cube[2][5]
|
447
|
+
cubetemp[2][8] = @cube[2][6]
|
448
|
+
|
449
|
+
cubetemp[3][0] = @cube[5][0]
|
450
|
+
cubetemp[3][1] = @cube[5][5]
|
451
|
+
cubetemp[3][2] = @cube[5][6]
|
452
|
+
cubetemp[3][3] = @cube[5][7]
|
453
|
+
cubetemp[3][4] = @cube[5][8]
|
454
|
+
cubetemp[3][5] = @cube[5][1]
|
455
|
+
cubetemp[3][6] = @cube[5][2]
|
456
|
+
cubetemp[3][7] = @cube[5][3]
|
457
|
+
cubetemp[3][8] = @cube[5][4]
|
458
|
+
|
459
|
+
cubetemp[4][0] = @cube[4][0]
|
460
|
+
cubetemp[4][1] = @cube[4][3]
|
461
|
+
cubetemp[4][2] = @cube[4][4]
|
462
|
+
cubetemp[4][3] = @cube[4][5]
|
463
|
+
cubetemp[4][4] = @cube[4][6]
|
464
|
+
cubetemp[4][5] = @cube[4][7]
|
465
|
+
cubetemp[4][6] = @cube[4][8]
|
466
|
+
cubetemp[4][7] = @cube[4][1]
|
467
|
+
cubetemp[4][8] = @cube[4][2]
|
468
|
+
|
469
|
+
cubetemp[5][0] = @cube[1][0]
|
470
|
+
cubetemp[5][1] = @cube[1][5]
|
471
|
+
cubetemp[5][2] = @cube[1][6]
|
472
|
+
cubetemp[5][3] = @cube[1][7]
|
473
|
+
cubetemp[5][4] = @cube[1][8]
|
474
|
+
cubetemp[5][5] = @cube[1][1]
|
475
|
+
cubetemp[5][6] = @cube[1][2]
|
476
|
+
cubetemp[5][7] = @cube[1][3]
|
477
|
+
cubetemp[5][8] = @cube[1][4]
|
478
|
+
|
479
|
+
@cube = cubetemp
|
480
|
+
self
|
481
|
+
end
|
482
|
+
|
483
|
+
#Turns cube over TWICE, swapping top and bottom faces. Like "f2" but rest of cube moves too.
|
484
|
+
def invert
|
485
|
+
self.turn_over.turn_over
|
486
|
+
@hist << "invert"
|
487
|
+
self
|
488
|
+
end
|
489
|
+
|
490
|
+
#Shuffles cross cubies on top, doesn't affect lower layers but does shuffle top corners.
|
491
|
+
def cross_shuffle
|
492
|
+
self.f.u.r.ur.rr.fr
|
493
|
+
self
|
494
|
+
end
|
495
|
+
|
496
|
+
#Swaps [0][5] and [0][3]. Doesn't affect lower layers but does affect top corners.
|
497
|
+
def cross_swap
|
498
|
+
self.rr.u.u.r.u.rr.u.r.u
|
499
|
+
self
|
500
|
+
end
|
501
|
+
|
502
|
+
#Shuffles top corners without affecting lower layers or top cross.
|
503
|
+
def top_corner_shuffle
|
504
|
+
self.rr.u.l.ur.r.u.lr.ur
|
505
|
+
self
|
506
|
+
end
|
507
|
+
|
508
|
+
#Re-orients cubies of [0][4], [0][6], and [0][8] without affecting anything else.
|
509
|
+
def last_move
|
510
|
+
self.rr.d.d.r.f.d.d.fr.ur.f.d.d.fr.rr.d.d.r.u
|
511
|
+
self
|
512
|
+
end
|
513
|
+
|
514
|
+
#Solves for cross on first layer. Affects all other layers.
|
515
|
+
def cross_solve
|
516
|
+
downcross = []
|
517
|
+
i = 1
|
518
|
+
until @cube[0][1] == @cube[0][0] && @cube[0][3] == @cube[0][0] && @cube[0][5] == @cube[0][0] && @cube[0][7] == @cube[0][0]
|
519
|
+
|
520
|
+
until downcross.include?(@cube[0][0])
|
521
|
+
downcross = []
|
522
|
+
self.rr.d.r.l.dr.lr.turn
|
523
|
+
downcross = [@cube[5][1],@cube[5][3],@cube[5][5], @cube[5][7]]
|
524
|
+
i += 1
|
525
|
+
if i > 10
|
526
|
+
self.turn until @cube[0][1] != @cube[0][0]
|
527
|
+
self.l.b
|
528
|
+
i = 1
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
until @cube[5][3] == cube[0][0]
|
533
|
+
i =0
|
534
|
+
self.d
|
535
|
+
|
536
|
+
if i > 59
|
537
|
+
self.print
|
538
|
+
gets
|
539
|
+
end
|
540
|
+
i+=1
|
541
|
+
end
|
542
|
+
|
543
|
+
until @cube[0][7] != @cube[0][0]
|
544
|
+
self.u
|
545
|
+
end
|
546
|
+
self.f.f
|
547
|
+
downcross = []
|
548
|
+
end
|
549
|
+
|
550
|
+
until @cube[4][3] == @cube[4][0] && @cube[1][5] == @cube[1][0]
|
551
|
+
until @cube[1][5] == @cube[1][0]
|
552
|
+
self.u
|
553
|
+
end
|
554
|
+
self.turn if @cube[4][3] != @cube[4][0]
|
555
|
+
i += 1
|
556
|
+
|
557
|
+
if i > 10
|
558
|
+
self.cross_swap
|
559
|
+
i = 1
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
|
564
|
+
if @cube[2][7] != @cube[2][0]
|
565
|
+
self.cross_swap
|
566
|
+
end
|
567
|
+
|
568
|
+
self
|
569
|
+
end
|
570
|
+
|
571
|
+
#Solves for corners on first layer without affecting first layer cross.
|
572
|
+
def corners_solve
|
573
|
+
corners = []
|
574
|
+
|
575
|
+
i = 1
|
576
|
+
|
577
|
+
until @cube[0].uniq == [@cube[0][0]] && @cube[1][4] == @cube[1][0] && @cube[2][6] == @cube[2][0] && @cube[3][2] == @cube[3][0] && @cube[4][2] == @cube[4][0]
|
578
|
+
|
579
|
+
corners = [@cube[1][8],@cube[1][2],@cube[2][4],@cube[2][2],@cube[3][4],@cube[3][6],@cube[4][6],@cube[4][8]]
|
580
|
+
until corners.include?(0)
|
581
|
+
self.rr.d.r.turn
|
582
|
+
corners = [@cube[1][8],@cube[1][2],@cube[2][4],@cube[2][2],@cube[3][4],@cube[3][6],@cube[4][6],@cube[4][8]]
|
583
|
+
end
|
584
|
+
|
585
|
+
until @cube[3][6] == @cube[0][0] || @cube[4][6] == @cube[0][0]
|
586
|
+
self.d
|
587
|
+
end
|
588
|
+
|
589
|
+
if @cube[3][6] == @cube[0][0]
|
590
|
+
self.d.turn until @cube[5][4] == @cube[3][0]
|
591
|
+
self.rr.dr.r
|
592
|
+
end
|
593
|
+
|
594
|
+
if @cube[4][6] == @cube[0][0]
|
595
|
+
self.d.turn until @cube[5][4] == @cube[4][0]
|
596
|
+
self.f.d.fr
|
597
|
+
end
|
598
|
+
i += 1
|
599
|
+
self.turn
|
600
|
+
|
601
|
+
if i > 50
|
602
|
+
self.u until @cube[0][6] != @cube[0][0]
|
603
|
+
self.d until @cube[5][4] == @cube[0][0]
|
604
|
+
self.lr.d.l
|
605
|
+
self.u until @cube[1][5] == @cube[1][0]
|
606
|
+
i = 1
|
607
|
+
end
|
608
|
+
end
|
609
|
+
self
|
610
|
+
end
|
611
|
+
|
612
|
+
#Solves for middle layer when first layer is solved without affecting first layer.
|
613
|
+
def second_layer_solve
|
614
|
+
self.invert
|
615
|
+
mids = []
|
616
|
+
x = @cube[0][0]
|
617
|
+
|
618
|
+
until mids.include?(x) == false && @cube[1][7] == @cube[1][0] && @cube[1][3] == @cube[1][0] && @cube[3][3] == @cube[3][0] && @cube[3][7] == @cube[3][0] && @cube[2][1] == @cube[2][0] && @cube[2][5] == @cube[2][0] && @cube[4][1] == @cube[4][0] && @cube[4][5] == @cube[4][0]
|
619
|
+
|
620
|
+
until @cube[4][5] == @cube[4][0] && @cube[3][7] == @cube[3][0]
|
621
|
+
i = 0
|
622
|
+
|
623
|
+
until @cube[4][3] != @cube[0][0] && @cube[0][7] != @cube[0][0]
|
624
|
+
self.u
|
625
|
+
i += 1
|
626
|
+
|
627
|
+
if i > 50
|
628
|
+
self.cross_swap
|
629
|
+
self.u.r.ur.rr.ur.fr.u.f
|
630
|
+
i = 1
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
634
|
+
until @cube[4][3] == @cube[4][0]
|
635
|
+
self.ur.turn
|
636
|
+
end
|
637
|
+
|
638
|
+
if @cube[0][7] != @cube[3][0]
|
639
|
+
self.cross_swap
|
640
|
+
end
|
641
|
+
self.u.r.ur.rr.ur.fr.u.f
|
642
|
+
end
|
643
|
+
self.turn
|
644
|
+
mids = [@cube[1][3],@cube[1][7],@cube[2][1],@cube[2][5],@cube[3][3],@cube[3][7],@cube[4][1],@cube[4][5]]
|
645
|
+
end
|
646
|
+
|
647
|
+
self
|
648
|
+
end
|
649
|
+
|
650
|
+
#Solves for last layer cross when first two layers are completed
|
651
|
+
def top_cross
|
652
|
+
topcross = [@cube[0][1],@cube[0][3],@cube[0][5],@cube[0][7]]
|
653
|
+
i = 1
|
654
|
+
bigi = 0
|
655
|
+
until topcross.count(@cube[0][0]) >= 2
|
656
|
+
self.cross_shuffle
|
657
|
+
bigi += 1
|
658
|
+
i += 1
|
659
|
+
|
660
|
+
if i > 15
|
661
|
+
self.turn
|
662
|
+
i = 1
|
663
|
+
end
|
664
|
+
|
665
|
+
if bigi > 100
|
666
|
+
puts "derp"
|
667
|
+
p topcross
|
668
|
+
gets
|
669
|
+
end
|
670
|
+
topcross = [@cube[0][1],@cube[0][3],@cube[0][5],@cube[0][7]]
|
671
|
+
end
|
672
|
+
|
673
|
+
if (topcross[0] == @cube[0][0] && topcross[2] == @cube[0][0]) || (topcross[1] == @cube[0][0] && topcross[3] == @cube[0][0])
|
674
|
+
self.turn until @cube[0][7] == @cube[0][0]
|
675
|
+
self.cross_swap
|
676
|
+
end
|
677
|
+
|
678
|
+
self.turn until @cube[0][1] == @cube[0][0] && @cube[0][3] == @cube[0][0]
|
679
|
+
|
680
|
+
i = 1
|
681
|
+
until topcross.uniq == [@cube[0][0]]
|
682
|
+
self.cross_shuffle
|
683
|
+
|
684
|
+
if i > 20
|
685
|
+
self.turn
|
686
|
+
end
|
687
|
+
topcross = [@cube[0][1],@cube[0][3],@cube[0][5],@cube[0][7]]
|
688
|
+
end
|
689
|
+
i = 1
|
690
|
+
until @cube[1][5] == @cube[1][0] && @cube[4][3] == @cube[4][0]
|
691
|
+
self.u
|
692
|
+
i += 1
|
693
|
+
if i >17
|
694
|
+
self.cross_swap.turn.cross_swap
|
695
|
+
i = 1
|
696
|
+
end
|
697
|
+
end
|
698
|
+
self.cross_swap if @cube[3][1] != @cube[3][0]
|
699
|
+
self
|
700
|
+
end
|
701
|
+
|
702
|
+
#Solves last layer corners when all other layers and cross have been completed.
|
703
|
+
def top_corners
|
704
|
+
stay_corner = [@cube[0][2], @cube[1][4],@cube[2][8]]
|
705
|
+
i = 1
|
706
|
+
|
707
|
+
until stay_corner.sort == [@cube[1][0],@cube[2][0],@cube[0][0]].sort
|
708
|
+
self.turn
|
709
|
+
stay_corner = [@cube[0][2], @cube[1][4],@cube[2][8]]
|
710
|
+
i += 1
|
711
|
+
|
712
|
+
if i > 4
|
713
|
+
self.top_corner_shuffle
|
714
|
+
i = 0
|
715
|
+
stay_corner = [@cube[0][2], @cube[1][4],@cube[2][8]]
|
716
|
+
end
|
717
|
+
end
|
718
|
+
|
719
|
+
until @cube[0][2] == @cube[0][0]
|
720
|
+
self.turn.turn.last_move.turn.turn
|
721
|
+
end
|
722
|
+
|
723
|
+
stay4 = [@cube[0][4], @cube[2][6],@cube[3][2]]
|
724
|
+
until stay4.sort == [@cube[2][0],@cube[3][0],@cube[0][0]].sort
|
725
|
+
|
726
|
+
self.top_corner_shuffle
|
727
|
+
stay4 = [@cube[0][4], @cube[2][6],@cube[3][2]]
|
728
|
+
end
|
729
|
+
|
730
|
+
self.turn.last_move.turn.turn.turn until @cube[0][4] == @cube[0][0]
|
731
|
+
|
732
|
+
if @cube[0][4] == @cube[0][0] && @cube[0][6] != @cube[0][0]
|
733
|
+
i = 1
|
734
|
+
|
735
|
+
|
736
|
+
testarray = []
|
737
|
+
until testarray.flatten.uniq.length == 6
|
738
|
+
|
739
|
+
@cube.each {|side| testarray << side.uniq}
|
740
|
+
|
741
|
+
self.last_move
|
742
|
+
i += 1
|
743
|
+
if i > 100
|
744
|
+
i = 1
|
745
|
+
end
|
746
|
+
end
|
747
|
+
end
|
748
|
+
end
|
749
|
+
|
750
|
+
#solve invokes all layer solving methods in sequence, solving from any legal state
|
751
|
+
def simple_solve
|
752
|
+
testarray = []
|
753
|
+
@cube.each {|side| testarray << side.uniq}
|
754
|
+
return self if testarray.flatten.length == 6
|
755
|
+
|
756
|
+
self.cross_solve.corners_solve.second_layer_solve.top_cross.top_corners
|
757
|
+
self.clean_hist
|
758
|
+
self.invert
|
759
|
+
self
|
760
|
+
end
|
761
|
+
|
762
|
+
#outputs each side as an array on its own line
|
763
|
+
def show
|
764
|
+
p @cube[0]
|
765
|
+
p @cube[1]
|
766
|
+
p @cube[2]
|
767
|
+
p @cube[3]
|
768
|
+
p @cube[4]
|
769
|
+
p @cube[5]
|
770
|
+
end
|
771
|
+
|
772
|
+
#Colorizes integers for output to terminal.
|
773
|
+
def colorize
|
774
|
+
@cube.each do |this|
|
775
|
+
this.collect! do |num|
|
776
|
+
if num == 1
|
777
|
+
num = "\e[36m#{num}\e[0m"
|
778
|
+
elsif num == 2
|
779
|
+
num = "\e[33m#{num}\e[0m"
|
780
|
+
elsif num ==3
|
781
|
+
num = "\e[31m#{num}\e[0m"
|
782
|
+
elsif num == 4
|
783
|
+
num = "\e[32m#{num}\e[0m"
|
784
|
+
elsif num ==5
|
785
|
+
num = "\e[34m#{num}\e[0m"
|
786
|
+
else
|
787
|
+
num = num
|
788
|
+
end
|
789
|
+
end
|
790
|
+
end
|
791
|
+
self
|
792
|
+
end
|
793
|
+
|
794
|
+
#Converts colorized cube back to integers
|
795
|
+
def decolorize
|
796
|
+
if @cube.flatten.include?(5) == false
|
797
|
+
@cube.each do |this|
|
798
|
+
this.collect! do |num|
|
799
|
+
if num == 0
|
800
|
+
num = num
|
801
|
+
else
|
802
|
+
num = num.gsub(/[^\d]/, '')[2].to_i if num.class == String
|
803
|
+
end
|
804
|
+
end
|
805
|
+
end
|
806
|
+
end
|
807
|
+
end
|
808
|
+
|
809
|
+
#Outputs an ascii representation of the cube arrays
|
810
|
+
def print
|
811
|
+
puts " ---------"
|
812
|
+
puts " |#{@cube[1][8]}||#{@cube[1][1]}||#{@cube[1][2]}|"
|
813
|
+
puts " ---------"
|
814
|
+
puts " |#{@cube[1][7]}||#{@cube[1][0]}||#{@cube[1][3]}|"
|
815
|
+
puts " ---------"
|
816
|
+
puts " |#{@cube[1][6]}||#{@cube[1][5]}||#{@cube[1][4]}|"
|
817
|
+
puts " ---------"
|
818
|
+
puts "--------- --------- --------- ---------"
|
819
|
+
puts "|#{@cube[5][8]}||#{@cube[5][1]}||#{@cube[5][2]}| |#{@cube[4][8]}||#{@cube[4][1]}||#{@cube[4][2]}| |#{@cube[0][8]}||#{@cube[0][1]}||#{@cube[0][2]}| |#{@cube[2][8]}||#{@cube[2][1]}||#{@cube[2][2]}|"
|
820
|
+
puts "--------- --------- --------- ---------"
|
821
|
+
puts "|#{@cube[5][7]}||#{@cube[5][0]}||#{@cube[5][3]}| |#{@cube[4][7]}||#{@cube[4][0]}||#{@cube[4][3]}| |#{@cube[0][7]}||#{@cube[0][0]}||#{@cube[0][3]}| |#{@cube[2][7]}||#{@cube[2][0]}||#{@cube[2][3]}|"
|
822
|
+
puts "--------- --------- --------- ---------"
|
823
|
+
puts "|#{@cube[5][6]}||#{@cube[5][5]}||#{@cube[5][4]}| |#{@cube[4][6]}||#{@cube[4][5]}||#{@cube[4][4]}| |#{@cube[0][6]}||#{@cube[0][5]}||#{@cube[0][4]}| |#{@cube[2][6]}||#{@cube[2][5]}||#{@cube[2][4]}|"
|
824
|
+
puts "--------- --------- --------- ---------"
|
825
|
+
puts " ---------"
|
826
|
+
puts " |#{@cube[3][8]}||#{@cube[3][1]}||#{@cube[3][2]}|"
|
827
|
+
puts " ---------"
|
828
|
+
puts " |#{@cube[3][7]}||#{@cube[3][0]}||#{@cube[3][3]}|"
|
829
|
+
puts " ---------"
|
830
|
+
puts " |#{@cube[3][6]}||#{@cube[3][5]}||#{@cube[3][4]}|"
|
831
|
+
puts " ---------"
|
832
|
+
end
|
833
|
+
self
|
834
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubyks
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeff Fowler
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Provides a data structure to represent a Rubik's cube and functionality
|
14
|
+
to perform simple transformations on that cube, in addition to a simple solving
|
15
|
+
algorithm.
|
16
|
+
email:
|
17
|
+
- jeff@jeffalanfowler.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- lib/rubyks.rb
|
23
|
+
homepage: http://jeffalanfowler.com
|
24
|
+
licenses: []
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubyforge_project:
|
42
|
+
rubygems_version: 2.0.7
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: Rubik's cube model and simple solving algorithm
|
46
|
+
test_files: []
|