あめのて

活字を垂れ流す

ルービックキューブをテキストデータで回すプログラムをなぜかHTML+JQueryで組んだので解説する

スポンサーリンク

Cubed
Cubed / Free the Image

webサイトを組んでいる時に不意に思いついて、そのままブラウザ上で動作するプログラムを組んだ。

どんなプログラムかというとルービックキューブをテキストデータの入出力だけで回すプログラム。

言葉だけを聞いても、どんなものなのかわからないと思うからとりあえず見てもらおう。
ちなみに、ルービックキューブを揃えられない人に対してうまく説明できる自信はない……。頑張るけど。
sub30ぐらいのキュービストならみんな興味を持ってもらえると思う!

ルービックキューブ回転プログラム

とりあえず、下のフォームに回転記号入力してみて!
例:RUR'U'

回転記号入力:
jQuery(function($){
    
    sc = ["R","L","U","D","F","B"];
    sarr = new Array();
    arr = new Array(48);
    for(var i=0; i<48; i++){
        arr[i]=i;
    }
    
    function g(arr,s){
        var ss = s.split("");
        var j = 0;
        for(var i=0; i<ss.length; i++){
            if($.inArray(ss[i],sc) != -1){
                sarr[j] = ss[i]
            }else{
                j--;
                sarr[j] += ss[i]
            }
            j++;
        }
        
        for(var i=0; i<sarr.length; i++){
            switch(sarr[i]){
                case "R'": r(arr);
                case "R2": r(arr);
                case "R": r(arr);
                    break;
                    
                case "U'": u(arr);
                case "U2": u(arr);
                case "U": u(arr);
                    break;
                    
                case "L'": l(arr);
                case "L2": l(arr);
                case "L": l(arr);
                    break;
                case "D'": d(arr);
                case "D2": d(arr);
                case "D": d(arr);
                    break;
                case "F'": f(arr);
                case "F2": f(arr);
                case "F": f(arr);
                    break;
                case "B'": b(arr);
                case "B2": b(arr);
                case "B": b(arr);
                    break;
                
            }
            
        }
        
    }
    
    $("#s").change(function(){
        $("#cube").html("");
        var s = $(this).val().toUpperCase().replace(/ /g,'');
        g(arr,s);
        for(var i=0; i<48;i++){
            if(arr[i] == i){
                $("#cube").append(arr[i]+",");
            }else{
                $("#cube").append('<span style="background-color:#fcc">'+arr[i]+'</span>,');
            }
        }
    });
    
    
    
    
    //回転関数
    function r(rc){
        var garr = [
            2,18,47,31,
            4,26,44,22,
            7,38,42,11,
            12,19,39,32,
            14,27,34,23
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    function l(rc){
        var garr = [
            0,16,45,29,
            3,25,43,21,
            5,36,40,9,
            8,15,35,28,
            13,24,33,20
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    function u(rc){
        var garr = [
            0,5,7,2,
            1,3,6,4,
            8,16,19,11,
            9,15,18,12,
            10,13,17,14
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    function d(rc){
        var garr = [
            28,31,39,36,
            29,32,38,35,
            30,34,37,33,
            40,42,47,45,
            41,44,46,43
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    function f(rc){
        var garr = [
            5,35,47,19,
            6,24,46,27,
            7,15,45,39,
            16,36,38,18,
            17,23,37,26
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    function b(rc){
        var garr = [
            0,12,42,28,
            1,23,41,20,
            2,32,40,8,
            9,11,31,29,
            10,22,30,21
        ];
        rc = kaiten(rc,garr);
        return rc;
    }
    
    function kaiten(rc,garr){
        k = rc[garr[0]];
        rc[garr[0]] = rc[garr[1]]; rc[garr[1]] = rc[garr[2]]; rc[garr[2]] = rc[garr[3]]; rc[garr[3]] = k;
        k = rc[garr[4]];
        rc[garr[4]] = rc[garr[5]]; rc[garr[5]] = rc[garr[6]]; rc[garr[6]] = rc[garr[7]]; rc[garr[7]] = k;
        k = rc[garr[8]];
        rc[garr[8]] = rc[garr[9]]; rc[garr[9]] = rc[garr[10]]; rc[garr[10]] = rc[garr[11]]; rc[garr[11]] = k;
        k = rc[garr[12]];
        rc[garr[12]] = rc[garr[13]]; rc[garr[13]] = rc[garr[14]]; rc[garr[14]] = rc[garr[15]]; rc[garr[15]] = k;
        k = rc[garr[16]];
        rc[garr[16]] = rc[garr[17]]; rc[garr[17]] = rc[garr[18]]; rc[garr[18]] = rc[garr[19]]; rc[garr[19]] = k;
        return rc;
    }
    
});

わかった!?ねえ、わかった!?
わからない人はさ、とりあえずなんかPLLを2回続けて入力したりしてみてよ!
スクランブルと、ソルビングの記号を続けて入力したりさ!
そしたら元に戻るでしょ!?もどるんだよ!?

これの何がすごいかの解説

はい、とういうことで、回転記号って何?みたいな人にもわかるように頑張って解説します。

一言で言うと

ルービックキューブという立体(三次元)のパズルを、数列だけの1次元で表している

ってところね!

ルービックキューブは各面8個の動く面があるよね?中心は回らないから。
それが6面あるから8*6で、合計48個の回る面があるんだよ。

その48個の面にそれぞれ数字を割り振って、その数字が1,2,3...48と綺麗に順番に並んでいる状態を、ルービックキューブが揃っている状態ってことにした時に、それだけで表すことができるかなって思って作ったのが上のプログラムです。(長くなっちゃった)

ルービックキューブの回転を表すときには、一般的に回転記号って記号を使います。スクランブル記号かな?
例えば右の面を時計回りに回すときは「R」、左の面を半時計回りに回すときは「L'」など。
それらの記号をつかって48個の数字を入れ替えたときに、ルービックキューブを回した時と同じ結果になるかためしたら、なったんですよ!!

それを試してみるのは、ルービックキューブを揃えられて、回転記号を書ける人でないとできないと思うけどね。。。
一応「R」のあとに「R'」でも元に戻るけど、それじゃあねぇ……。

まとめ

ということで、ルービックキューブのプログラムを組んで楽しかったので自慢したわけです。
でも、ほんとにわかる人にしかわからないものになってしまったのが悔しい。

まあ、仕方ないんですけどね。

広告を非表示にする