latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

0~100までの数値を2つランダムに選択し小さな値と大きな値を表示する

お題「0~100までの数値を2つランダムに選択し小さな値と大きな値を表示する」を mofmof.js でコード化するとこんな感じになります。

0..to(100).shuffle(2).nsort().f("small = @@, big = @@");
// -> "small = 2, big = 43"

素の JavaScript で同様の処理を書き下すと、こんな感じになるでしょうか。
真ん中らへんのソートはもうちょっと端折れる感じですかね。

(function() {
    var ary = [], i = 0, j, k;

    for (; i < 100; ++i) {
        ary.push(i);
    }

    // Fisher-Yates
    while (--i) {
        j = (Math.random() * (i + 1)) | 0;
        if (i !== j) {
            k      = ary[i];
            ary[i] = ary[j];
            ary[j] = k;
        }
    }
    ary.length = 2;

    ary.sort(function(a, b) {
        return a - b;
    });

    return "small = " + ary[0] + ", big = " + ary[1];
})();

要約すると、これ(↓)で十分なんですけどね。

(function() {
    var a = 0, b = 0;

    while (a === b) {
        a = Math.random() * 100 | 0;
        b = Math.random() * 100 | 0;
    }
    return "small = " + Math.min(a, b) + ", big = " + Math.max(a, b);
})();

FizzBuzz もこんな感じに書けます

// FizzBuzz
100..times(function(n) {
    ++n;
    return n % 15 === 0 ? "FizzBuzz"
         : n % 3  === 0 ? "Fizz"
         : n % 5  === 0 ? "Buzz" : n;
});
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29, "FizzBuzz", 31, 32, "Fizz", 34, "Buzz", "Fizz", 37, 38, "Fizz", "Buzz", 41, "Fizz", 43, 44, "FizzBuzz", 46, 47, "Fizz", 49, "Buzz", "Fizz", 52, 53, "Fizz", "Buzz", 56, "Fizz", 58, 59, "FizzBuzz", 61, 62, "Fizz", 64, "Buzz", "Fizz", 67, 68, "Fizz", "Buzz", 71, "Fizz", 73, 74, "FizzBuzz", 76, 77, "Fizz", 79, "Buzz", "Fizz", 82, 83, "Fizz", "Buzz", 86, "Fizz", 88, 89, "FizzBuzz", 91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98, "Fizz", "Buzz"]