rubyks 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/rubyks.rb +834 -0
  3. metadata +46 -0
@@ -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=
@@ -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: []