{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/packs/shared/maths.js","webpack:///./app/javascript/packs/projects/recaman.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","isSquare","number","Math","floor","sqrt","isPrime","fibs","isFibonacci","length","push","includes","isTriangle","option","start","sequence","scale","finalScale","canvas","document","getElementById","ctx","getContext","animateButton","termsInput","sequenceInput","speedInput","resultsDisplay","width","height","maxValue","targetScale","startScale","duration","buildRecamansSequence","noOfTerms","seq","buildBaseSequence","recamans","lastTerm","drawArc","x1","x2","fraction","hue","beginPath","strokeStyle","startAngle","endAngle","x","abs","PI","arc","stroke","drawSetup","fillStyle","fillRect","drawAll","max","translate","drawPartial","timestamp","elapsedSteps","Date","maxTerm","setScale","requestAnimationFrame","addEventListener","event","updateDrawAll","parseInt","innerHTML","join","target"],"mappings":"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","file":"js/projects/recaman-04eb68f1fff0a455987f.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 57);\n","const isSquare = (number) => {\n if (number < 0) { return false; }\n\n return (Math.floor(Math.sqrt(number)) ** 2) === number;\n};\n\nconst isPrime = (number) => {\n if (number < 2) { return false; }\n if (number === 2) { return true; }\n\n for (let i = 2; i < number; i += 1) {\n if (number % i == 0) {\n return false;\n }\n }\n return true;\n};\n\nconst fibs = [0, 1];\n\nconst isFibonacci = (number) => {\n if (number < 0) { return false; }\n\n while (fibs[fibs.length-1] < number) {\n fibs.push(fibs[fibs.length-1] + fibs[fibs.length-2]);\n }\n return fibs.includes(number);\n};\n\nconst isTriangle = (number) => {\n const option = Math.floor(Math.sqrt(number * 2));\n\n return (option * (option + 1)) / 2 === number;\n};\n\nexport { isSquare, isPrime, isFibonacci, isTriangle };\n","import { isPrime } from '../shared/maths';\n\nconst canvas = document.getElementById('canvas');\nconst ctx = canvas.getContext('2d');\n\nconst animateButton = document.getElementById('animate');\nconst termsInput = document.getElementById('terms');\nconst sequenceInput = document.getElementById('sequence-input');\nconst speedInput = document.getElementById('speed');\nconst resultsDisplay = document.getElementById('results');\n\ncanvas.width = 320;\ncanvas.height = 240;\n\nlet start, sequence, scale, finalScale;\nlet startScale = (canvas.width - 16) / 10;\nlet maxValue, targetScale;\nlet duration = 250;\n\nconst buildBaseSequence = (sequence, noOfTerms) => {\n let seq = [];\n if (sequence == 'fibonacci') { seq = [0, 1]; }\n\n for (let i = 1; seq.length < noOfTerms; i += 1) {\n if (sequence == 'integers') {\n seq.push(i);\n } else if (sequence == 'squares') {\n seq.push(i * i);\n } else if (sequence == 'fibonacci') {\n seq.push(seq[seq.length-1] + seq[seq.length-2]);\n } else if (sequence == 'triangles') {\n seq.push((i * (i+1)) / 2);\n } else if (sequence == 'primes' && isPrime(i)) {\n seq.push(i);\n }\n }\n\n return seq;\n};\n\nconst buildRecamansSequence = (sequence, noOfTerms) => {\n let seq;\n if (sequence != 'recamans') {\n seq = buildBaseSequence(sequence, noOfTerms);\n } else {\n seq = buildRecamansSequence('integers', noOfTerms);\n }\n const recamans = [0];\n\n let lastTerm = recamans[0];\n\n for (let i = 0; i < seq.length; i += 1) {\n const option = lastTerm - seq[i];\n if (option > 0 && !recamans.includes(option)) {\n lastTerm = option;\n } else {\n lastTerm += seq[i];\n }\n recamans.push(lastTerm);\n }\n\n return recamans;\n};\n\nconst drawArc = (x1, x2, fraction, scale, hue) => {\n ctx.beginPath();\n ctx.strokeStyle = `hsl(${hue}, 100%, 50%)`;\n const x = (x1 + x2) / 2;\n const r = Math.abs(x2 - x);\n let startAngle, endAngle;\n if (x2 < x1) {\n startAngle = 0;\n endAngle = Math.PI * fraction;\n } else {\n startAngle = Math.PI;\n endAngle = Math.PI * (1 + fraction);\n }\n ctx.arc(x * scale, 0, r * scale, startAngle, endAngle);\n ctx.stroke();\n};\n\nconst drawSetup = () => {\n ctx.fillStyle = 'black';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n};\n\nconst setFinalScale = () => {\n finalScale = (canvas.width - 16) / Math.max(...sequence);\n};\n\nconst setScale = (elapsedSteps) => {\n const fraction = (elapsedSteps - 1) / sequence.length;\n scale = (scale * (1 - fraction)) + (targetScale * fraction);\n};\n\nconst drawAll = () => {\n setFinalScale();\n drawSetup();\n\n ctx.translate(8, canvas.height/2);\n for (let i = 0; i < sequence.length; i += 1) {\n const hue = (i / sequence.length) * 300;\n drawArc(sequence[i], sequence[i+1], 1, finalScale, hue);\n }\n ctx.translate(-8, -canvas.height/2);\n};\n\nconst drawPartial = (timestamp) => {\n drawSetup();\n ctx.translate(8, canvas.height/2);\n\n const now = new Date();\n const elapsedSteps = (now - start) / duration;\n const maxTerm = Math.floor(elapsedSteps);\n\n if (sequence[maxTerm + 1] > maxValue) {\n maxValue = sequence[maxTerm + 1];\n targetScale = (canvas.width - 16) / sequence[maxTerm + 1];\n }\n if (scale != targetScale) { setScale(elapsedSteps); }\n\n for (let i = 0; i < maxTerm; i += 1) {\n const hue = (i / sequence.length) * 300;\n drawArc(sequence[i], sequence[i+1], 1, scale, hue);\n }\n\n if (maxTerm < sequence.length) {\n const hue = (maxTerm / sequence.length) * 300;\n drawArc(sequence[maxTerm], sequence[maxTerm+1], elapsedSteps - maxTerm, scale, hue);\n }\n ctx.translate(-8, -canvas.height/2);\n if (maxTerm <= sequence.length) { requestAnimationFrame(drawPartial); }\n};\n\nanimateButton.addEventListener('click', (event) => {\n start = new Date();\n scale = startScale;\n targetScale = startScale;\n maxValue = 10;\n drawPartial();\n})\n\nconst updateDrawAll = () => {\n sequence = buildRecamansSequence(sequenceInput.value, parseInt(termsInput.value));\n drawAll();\n resultsDisplay.innerHTML = sequence.join(', ') + '...';\n}\n\ntermsInput.addEventListener('input', (event) => {\n updateDrawAll();\n})\n\nsequenceInput.addEventListener('input', (event) => {\n if (event.target.value == 'fibonacci') {\n termsInput.max = 63;\n if (termsInput.value > 63) { termsInput.value = 63; }\n } else {\n termsInput.max = 255;\n }\n updateDrawAll();\n})\n\nspeedInput.addEventListener('input', (event) => {\n duration = 1000 / parseInt(event.target.value);\n})\n\nupdateDrawAll();\n"],"sourceRoot":""}