Commit 013849cd authored by earndt's avatar earndt

[W6D5] (ArndtED) Adds js practice script

parent 19806621
<!-- What is the index of the first Fibonacci number with 1000 digits? -->
<html>
<head>
<title> Eric's awesome Demo </title>
<script type="text/javascript">
const getNumMaxDigitPosition = (num) => Math.floor(Math.log10(num))
const getNumAtDigitPosition = (num, digitPosition) =>
Math.floor(
(num % Math.pow(10, digitPosition + 1)) / Math.pow(10, digitPosition)
)
const generateNaturalNumberObject = (num) => {
const finalObj = {}
const numMaxDigitPosition = getNumMaxDigitPosition(num)
for (
let digitPosition = 0;
digitPosition <= numMaxDigitPosition;
digitPosition++
) {
finalObj[digitPosition] = getNumAtDigitPosition(num, digitPosition)
}
return finalObj
}
const multiplyNumberObjectByValue = (numObj, natValue) => {
for (let digitPosition in numObj) {
multiplyNumObjValueAtDigitPositionAndNatValue(
numObj,
digitPosition,
natValue
)
}
}
const eliminateValueAtNumMaxDigit = (num, numMaxDigitPosition) =>
num % Math.pow(10, numMaxDigitPosition)
const redistributeValuesOfNumObjectToCorrectPlaceIndices = (
numObj,
digitPosition
) => {
while (numObj[digitPosition] > 9) {
const presentValue = numObj[digitPosition]
const presentValueMaxDigitPosition = getNumMaxDigitPosition(presentValue)
const numObjIdxToBeModified =
parseInt(digitPosition) + presentValueMaxDigitPosition
const valueToAddToNumObjAtTargetIdx = getNumAtDigitPosition(
presentValue,
presentValueMaxDigitPosition
)
const currentValueAtTargetIdx = numObj[numObjIdxToBeModified]
numObj[numObjIdxToBeModified] = currentValueAtTargetIdx
? currentValueAtTargetIdx + valueToAddToNumObjAtTargetIdx
: valueToAddToNumObjAtTargetIdx
numObj[digitPosition] = eliminateValueAtNumMaxDigit(
presentValue,
presentValueMaxDigitPosition
)
}
}
const numberObjectCorrectlyFormatted = (numObj) => {
for (let value of Object.values(numObj)) {
if (value < 0 || 9 < value) return false
}
return true
}
const ensureNumberObjectCorrectlyFormatted = (numObj) => {
while (!numberObjectCorrectlyFormatted(numObj)) {
for (let digitPosition in numObj) {
redistributeValuesOfNumObjectToCorrectPlaceIndices(
numObj,
digitPosition
)
}
}
}
const calculateSumOfTwoNumberObjects = (smllrNumObj, lrgrNumObj) => {
const sumNumObj = generateNaturalNumberObject(0)
for (let digitPosition in lrgrNumObj) {
sumNumObj[digitPosition] = smllrNumObj[digitPosition]
? smllrNumObj[digitPosition] + lrgrNumObj[digitPosition]
: lrgrNumObj[digitPosition]
}
ensureNumberObjectCorrectlyFormatted(sumNumObj)
return sumNumObj
}
function calculateIndexOfFirstFibonacciTermWithNumDigits(num) {
if (num < 0) return undefined
if (num < 2) return 1
let previousNumObj = generateNaturalNumberObject(1)
let currentNumObj = generateNaturalNumberObject(1)
let nextNumObj = generateNaturalNumberObject(2)
let idx = 3
let digitCount = 1
while (digitCount < num - 1) {
const newNextNumObj = calculateSumOfTwoNumberObjects(
currentNumObj,
nextNumObj
)
previousNumObj = currentNumObj
currentNumObj = nextNumObj
nextNumObj = newNextNumObj
digitCount = Math.max(
...Object.keys(nextNumObj).map((numStr) => parseInt(numStr))
)
idx++
}
return idx
}
</script>
</head>
<body>
<script>
document.write("What is the index of the first Fibonacci number with 1000 digits? ")
document.write(calculateIndexOfFirstFibonacciTermWithNumDigits(1000))
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment