開発環境
- 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 コメント:
コメントを投稿