開発環境
- macOS Sierra - Apple (OS)
 - Emacs (Text Editor)
 - JavaScript (プログラミング言語)
 - JavaScript Library
 - Safari(Web browser)
 - 参考書籍
    
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
 - JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
 
 
アルゴリズムパズル(Anany Levitin (著)、Maria Levitin (著)、黒川 洋 (翻訳)、松崎 公紀 (翻訳)、オライリージャパン)の中級パズル、57.(フィボナッチのウサギ問題(Fibonacci's Rabbits Problem))をJavaScriptで。
コード(Emacs)
HTML5
<div id="graph0"></div> <label for="months0"> 月数: </label> <input id="months0" type="number" min="0" step="1" value="12">ヶ月後, <span id="nums0"></span>匹 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.6/d3.min.js" integrity="sha256-5idA201uSwHAROtCops7codXJ0vja+6wbBrZdQ6ETQc=" crossorigin="anonymous"></script> <script src="array.js"></script> <script src="sample57.js"></script>
JavaScript
{
    'use strict';
    let width = 600,
        height = 600,
        padding = 50,
        div_graph = document.querySelector('#graph0'),
        input_months = document.querySelector('#months0'),
        span_nums = document.querySelector('#nums0'),
        memo = [2, 2];
    let calc = (n) => {
        if (memo[n]) {
            return memo[n];
        }
        let a = memo[0],
            b = memo[1];
        for (let i = 2; i <= n; i += 1) {
            memo[i] = a + b;
            let t = a;
            a = b;
            b = t + b;
        }
        return b;
    };
    let getNums = (n) => {
        return Array.range(n + 1).map(calc);
    };
    let draw = function () {
        let months = parseInt(input_months.value, 10),
            ys = getNums(months),
            xmin = 0,
            xmax = months,
            ymin = 0,
            ymax = Math.max.apply(null, ys);
        let xscale = d3.scaleLinear()
            .domain([xmin, xmax])
            .range([padding, width - padding]);
        let yscale = d3.scaleLinear()
            .domain([ymin, ymax])
            .range([height - padding, padding]);
        let xaxis = d3.axisBottom().scale(xscale);
        let yaxis = d3.axisLeft().scale(yscale);
        div_graph.innerHTML = '';
        let svg = d3.select('#graph0')
            .append('svg')
            .attr('width', width)
            .attr('height', height);
        svg.selectAll('line')
            .data(ys.slice(0, -1))
            .enter()
            .append('line')
            .attr('x1', (d, i) => xscale(i))
            .attr('y1', (d) => yscale(d))
            .attr('x2', (d, i) => xscale(i + 1))
            .attr('y2', (d, i) => yscale(ys[i + 1]))
            .attr('stroke', 'blue');
        svg.append('g')
            .attr('transform', `translate(0, ${height - padding})`)
            .call(xaxis);
        svg.append('g')
            .attr('transform', `translate(${padding}, 0)`)
            .call(yaxis);
        span_nums.innerText = ys.pop();
    };
    input_months.onchange = draw;
    draw();
}
ヶ月後, 匹
  
  
  
						
0 コメント:
コメントを投稿