axjack's blog

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.

バブルソートの音を聞く

var note = [63,61,69,64]; note.sort;と書けばnoteはソートされるのであるが、ソート中のnoteは見ることも聞くこともできない。聞く価値があるのか・ソート中の配列に芸術的な価値があるのか、は神棚に上げておくとし、ひとまずバブルソートしているときの音を聞いてみたい。

コードを実行すると音がどんどん昇順になることが分かる。ただ、あまり綺麗ではないな...というのが率直な感想である。

コード

/*
    Bubble Sort
*/
(
~r = r({
    //var note = [ 68, 71, 70, 61, 60, 64, 67, 65, 63, 66, 69, 62 ];
    //var note = (60 .. 71).scramble;
    var note = Array.rand(8, 50, 50+24);

    var note_size = note.size;
    var x;//temp variable for Synth

    "-----START-----\n".post;
    note.postln;
    "---------------\n".post;

    (note_size - 1).do({|item,i|
        (0 .. note_size - 2 - i).do({|jtem,j|

            //"compare: (%, %)\n".postf(jtem,jtem+1);


            if(note[jtem] > note[jtem+1],{
                note.swap(jtem,jtem+1);
                note.postln;

                note.do({|ktem,k|
                    x = Synth(\default,[\freq,ktem.midicps]);
                    (1/8).wait;
                    x.release(0.1);
                });
            });//end of if


        });//end of j in do-loop
    });//end of i in do-loop

    "-----END-----\n".post;
    note.postln;
});
)

~r.reset;
~r.play;

コード実行例

-----START-----
[ 60, 65, 70, 53, 69, 52, 56, 55 ]
---------------
[ 60, 65, 53, 70, 69, 52, 56, 55 ]
[ 60, 65, 53, 69, 70, 52, 56, 55 ]
[ 60, 65, 53, 69, 52, 70, 56, 55 ]
[ 60, 65, 53, 69, 52, 56, 70, 55 ]
[ 60, 65, 53, 69, 52, 56, 55, 70 ]
[ 60, 53, 65, 69, 52, 56, 55, 70 ]
[ 60, 53, 65, 52, 69, 56, 55, 70 ]
[ 60, 53, 65, 52, 56, 69, 55, 70 ]
[ 60, 53, 65, 52, 56, 55, 69, 70 ]
[ 53, 60, 65, 52, 56, 55, 69, 70 ]
[ 53, 60, 52, 65, 56, 55, 69, 70 ]
[ 53, 60, 52, 56, 65, 55, 69, 70 ]
[ 53, 60, 52, 56, 55, 65, 69, 70 ]
[ 53, 52, 60, 56, 55, 65, 69, 70 ]
[ 53, 52, 56, 60, 55, 65, 69, 70 ]
[ 53, 52, 56, 55, 60, 65, 69, 70 ]
[ 52, 53, 56, 55, 60, 65, 69, 70 ]
[ 52, 53, 55, 56, 60, 65, 69, 70 ]
-----END-----
[ 52, 53, 55, 56, 60, 65, 69, 70 ]

学んだことなど

  • noteが配列のとき、note.swap(i , j)note[i]note[j]を交換する。
  • do-loopの反復回数に悩んだ。n.do(0 .. n).doだと、前者はn回反復し後者はn+1回反復する。

(
var x = 0;
(8).do({|item,i|
    /* "(8).do({" is same as "8.do({" */
    x = x+1;
    "(item,i) = (%, %)\n".postf(item,i);
});
x;//8
)

/* 実行結果
(item,i) = (0, 0)
(item,i) = (1, 1)
(item,i) = (2, 2)
(item,i) = (3, 3)
(item,i) = (4, 4)
(item,i) = (5, 5)
(item,i) = (6, 6)
(item,i) = (7, 7)
*/

(
var x = 0;
(0 .. 8).do({|item,i|
    x = x+1;
    "(item,i) = (%, %)\n".postf(item,i);
});

x;//9
)

/* 実行結果
(item,i) = (0, 0)
(item,i) = (1, 1)
(item,i) = (2, 2)
(item,i) = (3, 3)
(item,i) = (4, 4)
(item,i) = (5, 5)
(item,i) = (6, 6)
(item,i) = (7, 7)
(item,i) = (8, 8)
*/
  • 前述のdo-loop例を頭に入れて、今回のコードのループ構造を見ると、以下の通りとなる。
(
var note = Array.rand(8,50,50+12+12);
var note_size = note.size;

"-------------------".postln;
" - note is %\n".postf(note);
" - note_size is %\n".postf(note_size);
"-------------------".postln;

(note_size - 1).do({|item,i|
    (0 .. note_size - 2 - i).do({|jtem,j|
        "item, i : jtem, j = %, % : %, %\n".postf(item,i,jtem,j);
    });
});
)

//実行結果
/*
-------------------
 - note is [ 54, 50, 52, 61, 55, 50, 70, 65 ]
 - note_size is 8
-------------------
item, i : jtem, j = 0, 0 : 0, 0
item, i : jtem, j = 0, 0 : 1, 1
item, i : jtem, j = 0, 0 : 2, 2
item, i : jtem, j = 0, 0 : 3, 3
item, i : jtem, j = 0, 0 : 4, 4
item, i : jtem, j = 0, 0 : 5, 5
item, i : jtem, j = 0, 0 : 6, 6
item, i : jtem, j = 1, 1 : 0, 0
item, i : jtem, j = 1, 1 : 1, 1
item, i : jtem, j = 1, 1 : 2, 2
item, i : jtem, j = 1, 1 : 3, 3
item, i : jtem, j = 1, 1 : 4, 4
item, i : jtem, j = 1, 1 : 5, 5
item, i : jtem, j = 2, 2 : 0, 0
item, i : jtem, j = 2, 2 : 1, 1
item, i : jtem, j = 2, 2 : 2, 2
item, i : jtem, j = 2, 2 : 3, 3
item, i : jtem, j = 2, 2 : 4, 4
item, i : jtem, j = 3, 3 : 0, 0
item, i : jtem, j = 3, 3 : 1, 1
item, i : jtem, j = 3, 3 : 2, 2
item, i : jtem, j = 3, 3 : 3, 3
item, i : jtem, j = 4, 4 : 0, 0
item, i : jtem, j = 4, 4 : 1, 1
item, i : jtem, j = 4, 4 : 2, 2
item, i : jtem, j = 5, 5 : 0, 0
item, i : jtem, j = 5, 5 : 1, 1
item, i : jtem, j = 6, 6 : 0, 0
*/

参考

バブルソート : アルゴリズム

Array | SuperCollider 3.9dev Help