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.
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: []