capsuletoy.js

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
 * Capsule Toy Machine
 * by Kazuki Maeda
 * Last-Modified: Dec. 6, 2022
 */

const prob = 100;                // 逆数が当たり確率
const bear = '🐻';
const panda = '🐼';

let mode = '';
let numpush = 0;
let prize = 0;
let stat;
let pushtext;
let historytext;


window.onload = function(){
    if(document.getElementById('push'))
        document.getElementById('push').addEventListener('click', push, true);
    if(document.getElementById('challenges'))
        document.getElementById('challenges').addEventListener('click', challenges, true);
    if(document.getElementById('retry'))
        document.getElementById('retry').addEventListener('click', retry, true);
}

function push(){
    if(mode != 'push'){
        if(mode != 'pushcontinue'){
            historytext = '';
        }

        document.getElementById('result').innerHTML = '';
        mode = 'push';
        numpush = 0;
        pushtext = '';
    }
    let r = Math.floor(Math.random()*prob);
    let addhistoryflag = false;
    let rchar;
    ++numpush;
    if(r){
        pushtext += bear;
    } else {
        pushtext += panda + ':' + numpush + '回でパンダ当たり!!';
        addhistoryflag = true;
        mode = 'pushcontinue';
        let push = document.getElementById('push');
        push.disabled = true;
        push.style.color = 'yellow';
        document.getElementById('retry').style.visibility = 'visible';
    }
    document.getElementById('result').innerHTML = '<em>履歴:</em>' + historytext + '<hr>' + pushtext ;
    if(addhistoryflag)
        historytext = historytext + '<br>' + pushtext;
}

function retry(){
    document.getElementById('result').innerHTML = '';
    mode = 'push';
    numpush = 0;
    pushtext = '';
    document.getElementById('result').innerHTML = '<em>履歴:</em>' + historytext + '<hr>' + pushtext ;
    let push = document.getElementById('push');
    push.disabled = false;
    push.style.color = 'red';
    document.getElementById('retry').style.visibility = 'hidden';
}

function addstat(stat, n){
    if(typeof stat[n] === 'undefined')
        stat[n] = 1;
    else
        ++stat[n];
}

function challenges(){
    mode = 'challenges';
    let numchallenges = Math.floor(document.getElementById('numchallenges').value);
    prize = 0;
    let restext = '';
    let stat = [];
    document.getElementById('result').innerHTML = '';
    for(let k = 0; k < numchallenges; ++k){
        numpush = 0;
        while(1){
            let r = Math.floor(Math.random()*prob);
            let rchar;
            if(r){
                ++numpush;
            } else {
                addstat(stat, numpush);
                let t = Math.pow(2, numpush);
                prize += t;
            }
            if(!r)
                break;
        }
    }
    document.getElementById('result').innerHTML = 'パンダを<em>' +
        numchallenges.toFixed() + '匹</em>ゲットするのに:<hr>';
    sumstat = 0;
    sum = 0;
    for(let k = 0; k < stat.length; ++k){
        let t;
        if(typeof stat[k] === 'undefined')
            t = 0;
        else
            t = stat[k];
        if(t){
            sumstat += t;
            sum += t*(k+1);
            document.getElementById('result').innerHTML += '<em>' + (k+1) + '回でゲット:</em>';
            document.getElementById('result').innerHTML += t + '匹(' + (t/numchallenges*100).toFixed(5) + '%)累積' + sumstat + '匹(' + (sumstat/numchallenges*100).toFixed(5) + '%)<br>';
        }
    }
    document.getElementById('result').innerHTML += '<hr><em>合計:</em>くま' + bear + (sum-numchallenges.toFixed()) + '匹(' + ((sum-numchallenges.toFixed())/sum*100).toFixed(5) + '%),パンダ' + panda + numchallenges.toFixed() + '匹(' + ((numchallenges.toFixed())/sum*100).toFixed(5) + '%)ゲット!';

}