diff --git a/README.md b/README.md index 8ce9be8..c0d2699 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,22 @@ Learn to code with version control system using Git. There are several study case and code example we can use to expertise our skill on Git, such as: -- [x] [Basic](pages/basic/index.html) -- [x] Functional Programming - - [x] [Factorial - Functional](pages/functional/factorial.html) - - [x] [Fizz Buzz - Functional](pages/functional/fizz-buzz.html) - - [x] [Palindrome - Functional](pages/functional/palindrome.html) - - [x] [Fibonacci - Functional](pages/functional/fibonacci.html) -- [x] Object Oriented Programming - - [x] [Factorial - OOP](pages/oop/factorial.html) - - [x] [Fizz Buzz - OOP](pages/oop/fizz-buzz.html) - - [x] [Palindrome - OOP](pages/oop/palindrome.html) - - [x] [Fibonacci - OOP](pages/oop/fibonacci.html) -- [x] [Standard Library](pages/standard-library/index.html) -- [x] [Modules](pages/modules/index.html) -- [x] [Asynchronous](pages/asynchronous/index.html) +- [X] [Basic](pages/basic/index.html) +- [X] Functional Programming + - [X] [Factorial - Functional](pages/functional/factorial.html) + - [X] [Fizz Buzz - Functional](pages/functional/fizz-buzz.html) + - [X] [Palindrome - Functional](pages/functional/palindrome.html) + - [X] [Fibonacci - Functional](pages/functional/fibonacci.html) +- [X] Object Oriented Programming + - [X] [Factorial - OOP](pages/oop/factorial.html) + - [X] [Fizz Buzz - OOP](pages/oop/fizz-buzz.html) + - [X] [Palindrome - OOP](pages/oop/palindrome.html) + - [X] [Fibonacci - OOP](pages/oop/fibonacci.html) +- [X] [Standard Library](pages/standard-library/index.html) +- [X] [Modules](pages/modules/index.html) +- [X] [Asynchronous](pages/asynchronous/index.html) - [ ] [Node.js](pages/nodejs/index.html) - - [x] [Standard Library](pages/nodejs/standard-library/index.html) + - [X] [Standard Library](pages/nodejs/standard-library/index.html) You can add your own study case into the list above by contributing to this repository. See [Contributing](#contributing) section for more information. @@ -61,6 +61,7 @@ Please see [CONTRIBUTING](CONTRIBUTING.md) for details. - [ianriizky/rwid-git](https://github.com/ianriizky/rwid-git) - [sdesakt/rwid-challenge](https://github.com/sdesakt/rwid-challenge) - [dianprsty/rwid-git](https://github.com/dianprsty/rwid-git) +- [JayaMustika/rwid-gi](https://github.com/JayaMustika/rwid-git)t - **and more...** ## License @@ -69,6 +70,6 @@ The MIT License (MIT). Please see [License File](LICENSE.md) for more informatio ## Credits -| Role | Name | -| ------ | -------------------------------------------------------- | +| Role | Name | +| ------ | ----------------------------------------------------- | | Author | [Septianata Rizky Pratama](https://github.com/ianriizky) | diff --git a/pages/asynchronous/ajax.js b/pages/asynchronous/course/ajax.js similarity index 100% rename from pages/asynchronous/ajax.js rename to pages/asynchronous/course/ajax.js diff --git a/pages/asynchronous/ajax_load.js b/pages/asynchronous/course/ajax_load.js similarity index 100% rename from pages/asynchronous/ajax_load.js rename to pages/asynchronous/course/ajax_load.js diff --git a/pages/asynchronous/async_function.js b/pages/asynchronous/course/async_function.js similarity index 100% rename from pages/asynchronous/async_function.js rename to pages/asynchronous/course/async_function.js diff --git a/pages/asynchronous/fetch_request.js b/pages/asynchronous/course/fetch_request.js similarity index 100% rename from pages/asynchronous/fetch_request.js rename to pages/asynchronous/course/fetch_request.js diff --git a/pages/asynchronous/fibonacci.js b/pages/asynchronous/course/fibonacci.js similarity index 100% rename from pages/asynchronous/fibonacci.js rename to pages/asynchronous/course/fibonacci.js diff --git a/pages/asynchronous/function_sequence.js b/pages/asynchronous/course/function_sequence.js similarity index 100% rename from pages/asynchronous/function_sequence.js rename to pages/asynchronous/course/function_sequence.js diff --git a/pages/asynchronous/index.html b/pages/asynchronous/course/index.html similarity index 100% rename from pages/asynchronous/index.html rename to pages/asynchronous/course/index.html diff --git a/pages/asynchronous/login_promise_await.js b/pages/asynchronous/course/login_promise_await.js similarity index 100% rename from pages/asynchronous/login_promise_await.js rename to pages/asynchronous/course/login_promise_await.js diff --git a/pages/asynchronous/login_promise_callback.js b/pages/asynchronous/course/login_promise_callback.js similarity index 100% rename from pages/asynchronous/login_promise_callback.js rename to pages/asynchronous/course/login_promise_callback.js diff --git a/pages/asynchronous/login_set_timeout_promise.js b/pages/asynchronous/course/login_set_timeout_promise.js similarity index 100% rename from pages/asynchronous/login_set_timeout_promise.js rename to pages/asynchronous/course/login_set_timeout_promise.js diff --git a/pages/asynchronous/sequence_control.js b/pages/asynchronous/course/sequence_control.js similarity index 100% rename from pages/asynchronous/sequence_control.js rename to pages/asynchronous/course/sequence_control.js diff --git a/pages/asynchronous/sequence_control_callback.js b/pages/asynchronous/course/sequence_control_callback.js similarity index 100% rename from pages/asynchronous/sequence_control_callback.js rename to pages/asynchronous/course/sequence_control_callback.js diff --git a/pages/asynchronous/set_timeout.js b/pages/asynchronous/course/set_timeout.js similarity index 100% rename from pages/asynchronous/set_timeout.js rename to pages/asynchronous/course/set_timeout.js diff --git a/pages/asynchronous/set_timeout_promise_static.js b/pages/asynchronous/course/set_timeout_promise_static.js similarity index 100% rename from pages/asynchronous/set_timeout_promise_static.js rename to pages/asynchronous/course/set_timeout_promise_static.js diff --git a/pages/asynchronous/set_timeout_race.js b/pages/asynchronous/course/set_timeout_race.js similarity index 100% rename from pages/asynchronous/set_timeout_race.js rename to pages/asynchronous/course/set_timeout_race.js diff --git a/pages/asynchronous/set_timeout_race_callback.js b/pages/asynchronous/course/set_timeout_race_callback.js similarity index 100% rename from pages/asynchronous/set_timeout_race_callback.js rename to pages/asynchronous/course/set_timeout_race_callback.js diff --git a/pages/asynchronous/set_timeout_race_promise.js b/pages/asynchronous/course/set_timeout_race_promise.js similarity index 100% rename from pages/asynchronous/set_timeout_race_promise.js rename to pages/asynchronous/course/set_timeout_race_promise.js diff --git a/pages/asynchronous/worker.js b/pages/asynchronous/course/worker.js similarity index 100% rename from pages/asynchronous/worker.js rename to pages/asynchronous/course/worker.js diff --git a/pages/asynchronous/worker_2.js b/pages/asynchronous/course/worker_2.js similarity index 100% rename from pages/asynchronous/worker_2.js rename to pages/asynchronous/course/worker_2.js diff --git a/pages/asynchronous/worker_fibonacci.js b/pages/asynchronous/course/worker_fibonacci.js similarity index 100% rename from pages/asynchronous/worker_fibonacci.js rename to pages/asynchronous/course/worker_fibonacci.js diff --git a/pages/asynchronous/fetch_api/generateMember.js b/pages/asynchronous/fetch_api/generateMember.js index a84296e..cc07ea9 100644 --- a/pages/asynchronous/fetch_api/generateMember.js +++ b/pages/asynchronous/fetch_api/generateMember.js @@ -1 +1,7 @@ -export { member as m12 } from "../../modules/generateMember12.js"; +export { member1 as m1 } from "./helper/generateMember1.js"; +export { member2 as m2 } from "./helper/generateMember2.js"; +export { member3 as m3 } from "./helper/generateMember3.js"; +export { member4 as m4 } from "./helper/generateMember4.js"; +export { member5 as m5 } from "./helper/generateMember5.js"; +export { member6 as m6 } from "./helper/generateMember6.js"; +export { member7 as m7 } from "./helper/generateMember7.js"; diff --git a/pages/asynchronous/fetch_api/generateTrElement.js b/pages/asynchronous/fetch_api/generateTrElement.js index b1fe1ef..4a011cd 100644 --- a/pages/asynchronous/fetch_api/generateTrElement.js +++ b/pages/asynchronous/fetch_api/generateTrElement.js @@ -11,6 +11,6 @@ export function generateTrElement(data = {}, tbodyTarget = "repo-tbody") { row.insertCell(2).innerHTML = data?.github_url ? `${data?.github_url}` : ""; - row.insertCell(3).textContent = data?.visibility; + row.insertCell(3).textContent = data?.public_repos; row.insertCell(4).textContent = data?.created_at; } diff --git a/pages/asynchronous/fetch_api/helper/Member.js b/pages/asynchronous/fetch_api/helper/Member.js new file mode 100644 index 0000000..c3f4ac8 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/Member.js @@ -0,0 +1,32 @@ +import { Person } from "./Person.js"; +import { generateTrElement } from "../generateTrElement.js"; + +export class Member extends Person { + /** @type {number} */ + index; + + /** @type {string} */ + address; + + /** @type {string} */ + sim_batch; + + /** @type {string} */ + github_url; + + /** + * @param {string} name + * @param {number} index + * @param {string} address + * @param {string} sim_batch + * @param {string} github_url + */ + constructor(name, index, username, sim_batch, github_url) { + super(name); + + this.index = index; + this.username = username; + this.sim_batch = sim_batch; + this.github_url = github_url; + } +} diff --git a/pages/modules/Person.js b/pages/asynchronous/fetch_api/helper/Person.js similarity index 77% rename from pages/modules/Person.js rename to pages/asynchronous/fetch_api/helper/Person.js index 48c6fe0..7c73683 100644 --- a/pages/modules/Person.js +++ b/pages/asynchronous/fetch_api/helper/Person.js @@ -3,7 +3,7 @@ export class Person { name; /** - * @param {Person["name"]} name + * @param {string} name */ constructor(name) { this.name = name; diff --git a/pages/asynchronous/fetch_api/helper/generateMember1.js b/pages/asynchronous/fetch_api/helper/generateMember1.js new file mode 100644 index 0000000..151b1c7 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember1.js @@ -0,0 +1,12 @@ +import { Member } from "./Member.js"; + + const member1 = new Member( + "Jaya Mustika", + 1, + "JayaMustika", + "07", + "https://github.com/JayaMustika" + ); + + +export { member1 }; diff --git a/pages/asynchronous/fetch_api/helper/generateMember2.js b/pages/asynchronous/fetch_api/helper/generateMember2.js new file mode 100644 index 0000000..5b26bb4 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember2.js @@ -0,0 +1,11 @@ +import { Member } from "./Member.js"; + + const member2 = new Member( + "Muchamad Faiz", + 3, + "muhammadfaiz", + "01", + "https://github.com/muchamadfaiz" + ); + +export { member2 }; diff --git a/pages/asynchronous/fetch_api/helper/generateMember3.js b/pages/asynchronous/fetch_api/helper/generateMember3.js new file mode 100644 index 0000000..f074476 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember3.js @@ -0,0 +1,11 @@ +import { Member } from "./Member.js"; + + const member3 = new Member( + "Ady Bagus", + 4, + "itsmeeep", + "07", + "https://github.com/itsmeeep" + ); + +export { member3 }; \ No newline at end of file diff --git a/pages/asynchronous/fetch_api/helper/generateMember4.js b/pages/asynchronous/fetch_api/helper/generateMember4.js new file mode 100644 index 0000000..6d2d981 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember4.js @@ -0,0 +1,11 @@ +import { Member } from "./Member.js"; + + const member4 = new Member( + "Bagus Irawan", + 5, + "oombagus", + "6", + "https://www.github.com/oombagus", + ); + +export { member4 }; diff --git a/pages/asynchronous/fetch_api/helper/generateMember5.js b/pages/asynchronous/fetch_api/helper/generateMember5.js new file mode 100644 index 0000000..9760ddf --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember5.js @@ -0,0 +1,11 @@ +import { Member } from "./Member.js"; + + const member5 = new Member( + "Riky Ridho Pangestu", + 8, + "ridhoriky", + "02", + "https://github.com/ridhoriky" + ); + + export { member5 }; \ No newline at end of file diff --git a/pages/asynchronous/fetch_api/helper/generateMember6.js b/pages/asynchronous/fetch_api/helper/generateMember6.js new file mode 100644 index 0000000..598dc99 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember6.js @@ -0,0 +1,12 @@ +import { Member } from "./Member.js"; + + const member6 = new Member( + "Abdurrochman Alfian", + 10, + "Alfian-IDN", + "10", + "https://github.com/Alfian-IDN" + ); + + +export { member6 }; diff --git a/pages/asynchronous/fetch_api/helper/generateMember7.js b/pages/asynchronous/fetch_api/helper/generateMember7.js new file mode 100644 index 0000000..da947f3 --- /dev/null +++ b/pages/asynchronous/fetch_api/helper/generateMember7.js @@ -0,0 +1,11 @@ +import { Member } from "./Member.js"; + + const member7 = new Member( + "Bambang Rewanggi", + 11, + "Rewanggi", + "08", + "https://github.com/Rewanggi" + ); + +export { member7 }; diff --git a/pages/asynchronous/fetch_api/index.html b/pages/asynchronous/fetch_api/index.html index 80fccfd..45c868b 100644 --- a/pages/asynchronous/fetch_api/index.html +++ b/pages/asynchronous/fetch_api/index.html @@ -14,7 +14,7 @@

GitHub API

No. Nama GitHub URL - Visibility + GitHub Repos Created At @@ -24,6 +24,6 @@

GitHub API

Back to Asynchronous

- + diff --git a/pages/asynchronous/fetch_api/main.mjs b/pages/asynchronous/fetch_api/main.js similarity index 84% rename from pages/asynchronous/fetch_api/main.mjs rename to pages/asynchronous/fetch_api/main.js index 0963caf..eda7b2c 100644 --- a/pages/asynchronous/fetch_api/main.mjs +++ b/pages/asynchronous/fetch_api/main.js @@ -1,6 +1,50 @@ import * as member from "./generateMember.js"; import { generateTrElement } from "./generateTrElement.js"; +/** + * @param {import("../../modules/Member.js").Member} member + * @returns {Promise<{ member: import("../../modules/Member.js") + * .Member; response: ResponseRepo; }>} + */ +async function fetchGitHubApi(member) { + const username = member.username + + const promiseResponse = await fetch( + `https://api.github.com/users/${username}`, + ); + + return { + member, + response: await promiseResponse.json(), + }; +} + +function arrayOfMember () { + const members = []; + + for (let index = 1; index <= 7; index++) { + members.push(member[`m${index}`]); + } + + return members; +}; + +const members = arrayOfMember (); + +const response = await Promise.all( //It doesn't work with .any and i don't know why, :) + members.map(member => fetchGitHubApi(member)), +); + +response.forEach(({ member, response }) => +generateTrElement({ + index: member.index, + name: member.name, + github_url: member.github_url, + public_repos: response?.public_repos, + created_at: new Date(response?.created_at), +}), +); + /** * @typedef {{ owner?: string; repo_name?: string; }} Repo * @typedef {Array} Repos @@ -113,35 +157,4 @@ import { generateTrElement } from "./generateTrElement.js"; network_count: number; subscribers_count: number; }} ResponseRepo - */ - -/** - * @param {import("../../modules/Member.js").Member} member - * @returns {Promise<{ member: import("../../modules/Member.js").Member; response: ResponseRepo; }>} - */ -async function fetchGitHubApi(member) { - const promiseResponse = await fetch( - `https://api.github.com/repos/${member.github_owner}/${member.github_repo}`, - ); - - return { - member, - response: await promiseResponse.json(), - }; -} - -const members = [member.m12]; - -const response = await Promise.all( - members.map(member => fetchGitHubApi(member)), -); - -response.forEach(({ member, response }) => - generateTrElement({ - index: member.index, - name: member.name, - github_url: member.github_url, - visibility: response?.visibility, - created_at: new Date(response?.created_at), - }), -); + */ \ No newline at end of file diff --git a/pages/functional/js/factorial.js b/pages/functional/js/factorial.js index deb63e1..53eeffe 100644 --- a/pages/functional/js/factorial.js +++ b/pages/functional/js/factorial.js @@ -1,50 +1,40 @@ import { parseNumber } from "../../js/helper.js"; /** - * Count factorial number from the given "n" value using loop way. - * - * @param {number} n + * Factorial Iterative Approach + * @param {number} n */ -function countFactorialUsingLoop(n) { - n = parseNumber(n); - - let result = 1; +function factorialUsingLoop (n) { + let formula = n; - for (let index = n; index > 0; index--) { - result *= index; + for (let i = 1; i < n; i += 1) { + formula *= (n-i); } - - return result; + + return formula; } /** - * Count factorial number from the given "n" value using recursive way. - * - * @param {number} n - * @returns {number} - */ -function countFactorialUsingRecursive(n) { - n = parseNumber(n); - - if (n < 2) { - return 1; - } - - return n * countFactorialUsingRecursive(n - 1); +* Factorial Recursive Approach +* @param {number} n +*/ +function factorialUsingrecursive (n) { + return n <= 1 + ? 1 + : factorialUsingrecursive (n - 1) * n; } -/** + /** * Count factorial number from the given "n" value. - * * @param {number} n * @param {"loop" | "recursive"} method * @throws {Error} */ function countFactorial(n, method) { if (method == "loop") { - return countFactorialUsingLoop(n); + return factorialUsingLoop(n); } else if (method == "recursive") { - return countFactorialUsingRecursive(n); + return factorialUsingrecursive(n); } else { throw new Error("Method must be loop or recursive."); } diff --git a/pages/functional/js/fibonacci.js b/pages/functional/js/fibonacci.js index edfa5ac..45c5bb6 100644 --- a/pages/functional/js/fibonacci.js +++ b/pages/functional/js/fibonacci.js @@ -1,50 +1,39 @@ import { parseNumber } from "../../js/helper.js"; /** - * Create an array filled by fibonacci sequence using loop way. - * - * @param {number} sequence - */ -function generateFibonacciUsingLoop(sequence) { - sequence = parseNumber(sequence); - - let result = []; - let prev = 0; - let next = 1; - - for (let index = 0; index < sequence; index++) { - result.push(prev); - - const current = prev + next; - prev = next; - next = current; - } - - return result; +* Fibonacci Recursive Approach +* @param {number} sequence +*/ +function fibbonaciUsingRecursive (sequence) { + return sequence < 1 + ? 0 + : sequence <= 2 + ? 1 + : fibbonaciUsingRecursive (sequence - 1) + + fibbonaciUsingRecursive (sequence - 2); } /** - * Create an array filled by fibonacci sequence using recursive way. - * - * @param {number} sequence - */ -function generateFibonacciUsingRecursive(sequence) { - /** - * @param {number} n - * @returns {number} - */ - function fibonacci(n) { - return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2); +* Fibonacci Loop Approach +* @param {number} sequence +*/ +function fibbonaciUsingLoop (sequence) { + if (sequence < 1) { + return 0; + } else if (sequence <= 2) { + return 1 } - sequence = parseNumber(sequence); - - let result = []; - - for (let index = 0; index < sequence; index++) { - const current = fibonacci(index); + let previous = 0; + + let next = 1; + + let result = 1; - result.push(current); + for (let iteration = 2; iteration <= sequence; iteration++) { + result = previous + next; + previous = next; + next = result; } return result; @@ -52,16 +41,15 @@ function generateFibonacciUsingRecursive(sequence) { /** * Create an array filled by fibonacci sequence. - * * @param {number} sequence * @param {"loop"| "recursive"} method * @throws {Error} */ function generateFibonacci(sequence, method) { if (method === "loop") { - return generateFibonacciUsingLoop(sequence); + return fibbonaciUsingLoop(sequence); } else if (method === "recursive") { - return generateFibonacciUsingRecursive(sequence); + return fibbonaciUsingRecursive(sequence); } else { throw new Error("Method must be loop or recursive."); } diff --git a/pages/functional/js/fizz-buzz.js b/pages/functional/js/fizz-buzz.js index e6bd12e..fe97c69 100644 --- a/pages/functional/js/fizz-buzz.js +++ b/pages/functional/js/fizz-buzz.js @@ -1,55 +1,48 @@ import { parseNumber } from "../../js/helper.js"; /** - * Create an array filled by "fizz", "buzz", or "fizz buzz" based on - * this requirement below (highest priority from above). - * - * Muliples of 4 or 7: "fizz buzz" - * Odd sequence: "fizz" - * Even sequence: "buzz" - * - * @param {number} sequence - */ -function generateFizzBuzz(sequence) { - sequence = parseNumber(sequence); - - let result = []; - - for (let index = 1; index <= sequence; index++) { - if (index % 4 === 0 || index % 7 === 0) { - result.push("fizz buzz"); - } else if (index % 2 === 1) { - result.push("fizz"); - } else if (index % 2 === 0) { - result.push("buzz"); +* FizzBuzz Loop Approach +* @param {number} sequence +*/ +function generateFizzBuzz (sequence) { + let array = []; + + for (let i = 1; i <= sequence; i++) { + if (i % 4 === 0 || i % 7 === 0) { + array.push (`fizz buzz ${i}`); + continue; + } else if (i % 2 === 1) { + array.push (`fizz ${i}`) + } else if (i % 2 === 0) { + array.push (`buzz ${i}`) + } } - } - return result; + return array; } document.getElementById("form").addEventListener("submit", function (event) { - event.preventDefault(); - - try { - const sequence = event.target["sequence"].value; - - const fizzBuzzs = generateFizzBuzz(sequence); - - document.getElementById("result").innerHTML = fizzBuzzs - .map( - (fizzBuzz, index) => - `
${index + 1} ${fizzBuzz}
`, - ) - .join(""); - } catch (error) { - alert(error.message); - console.error(error); - } -}); + event.preventDefault(); + + try { + const sequence = event.target["sequence"].value; + + const fizzBuzzs = generateFizzBuzz(sequence); + + document.getElementById("result").innerHTML = fizzBuzzs + .map( + (fizzBuzz, index) => + `
${index + 1} ${fizzBuzz}
`, + ) + .join(""); + } catch (error) { + alert(error.message); + console.error(error); + } + }); \ No newline at end of file diff --git a/pages/functional/js/palindrome.js b/pages/functional/js/palindrome.js index 3007919..6f042a7 100644 --- a/pages/functional/js/palindrome.js +++ b/pages/functional/js/palindrome.js @@ -1,72 +1,91 @@ import { parseString } from "../../js/helper.js"; /** - * Determine whether the given value is a palindrome or not using reverse way. - * + * Reverse Method Approach * @param {string} value */ -function isPalindromeUsingReverse(value) { - value = parseString(value); +function isPalindrome(value) { + let array = []; - let newValue = ""; + for (const spread of value) { + array.push(spread); + } + + let reverseArray = []; - for (let index = value.length - 1; index >= 0; index--) { - newValue += value[index]; + for (i = 1; i <= array.length; i++) { + reverseArray.push(array[array.length - i]); } - return value === newValue; + return JSON.stringify(array) === JSON.stringify(reverseArray); } /** - * Determine whether the given value is a palindrome or not using loop way. - * + * Iterative Approach * @param {string} value */ -function isPalindromeUsingLoop(value) { - value = parseString(value); +function isPalindrome2(value) { + console.log(value.length); - for (let index = 0; index < Math.floor(value.length / 2); index++) { - const lastCharacterIndex = value.length - (index + 1); + label: for (let index = 0; index < Math.ceil(value.length / 2); index++) { + const firstChar = value[index]; - const firstCharacter = value[index]; - const lastCharacter = value[lastCharacterIndex]; + const lastChar = value[value.length - (index + 1)]; - if (firstCharacter !== lastCharacter) { + if (lastChar !== firstChar) { return false; } + + console.log(`iteration ${value} ${index + 1}`); + + continue label; } return true; } /** - * Determine whether the given value is a palindrome or not using recursive way. - * + * Function Generator Approach * @param {string} value - * @param {number} index */ -function isPalindromeUsingRecursive(value, index = 0) { - value = parseString(value); +function isPalindrome3(value) { + function* fGen() { + for (const spread of value) { + yield spread; + } + } + + function* fgen2() { + for (i = 1; i <= array.length; i++) { + yield fGen[fGen.length - i]; + } + } - if (index < Math.floor(value.length / 2)) { - const lastCharacterIndex = value.length - (index + 1); + return JSON.stringify(fGen) === JSON.stringify(fgen2); +} - const firstCharacter = value[index]; - const lastCharacter = value[lastCharacterIndex]; +/** + * Recursive Approach + * @param {string} value + * @param {number} index + */ +function isPalindrome4(value, index = 0) { + const firstChar = value[index]; - if (firstCharacter !== lastCharacter) { - return false; - } + const lastChar = value[value.length - (index + 1)]; - return isPalindromeUsingRecursive(value, index + 1); + if (firstChar !== lastChar) { + return false; + } else if (index < Math.ceil(value.length / 2)) { + return isPalindrome4(value, index + 1); } + console.log(`iteration ${value} ${index + 1}`); + return true; } /** - * Return palindrome human-readable description. - * * @param {string} word * @param {"reverse" | "loop" | "recursive"} method * @throws {Error} @@ -75,11 +94,13 @@ function generatePalindromeStatus(word, method) { let isPalindrome; if (method === "reverse") { - isPalindrome = isPalindromeUsingReverse(word); + isPalindrome = isPalindrome(word); } else if (method === "loop") { - isPalindrome = isPalindromeUsingLoop(word); + isPalindrome = isPalindrome2(word); } else if (method === "recursive") { - isPalindrome = isPalindromeUsingRecursive(word); + isPalindrome = isPalindrome4(word); + } else if (method === "generative") { + isPalindrome = isPalindrome3(word); } else { throw new Error("Method must be reverse, loop, or recursive."); } diff --git a/pages/functional/palindrome.html b/pages/functional/palindrome.html index 82d8d1c..20cdcff 100644 --- a/pages/functional/palindrome.html +++ b/pages/functional/palindrome.html @@ -54,6 +54,16 @@

Palindrome (Functional)

/> Recursive + diff --git a/pages/modules/Member.js b/pages/modules/Member.js deleted file mode 100644 index 4c0ae7d..0000000 --- a/pages/modules/Member.js +++ /dev/null @@ -1,66 +0,0 @@ -import { Person } from "./Person.js"; -import { generateTrElement } from "./generateTrElement.js"; - -export class Member extends Person { - /** @type {number} */ - index; - - /** @type {string} */ - address; - - /** @type {string} */ - sim_batch; - - /** @type {string} */ - github_url; - - /** @type {string | undefined} */ - github_owner; - - /** @type {string | undefined} */ - github_repo; - - /** - * @param {Member["name"]} name - * @param {Member["index"]} index - * @param {Member["address"]} address - * @param {Member["sim_batch"]} sim_batch - * @param {Member["github_url"]} github_url - * @param {Member["github_owner"]} github_owner - * @param {Member["github_repo"]} github_repo - */ - constructor( - name, - index, - address, - sim_batch, - github_url, - github_owner, - github_repo, - ) { - super(name); - - this.index = index; - this.address = address; - this.sim_batch = sim_batch; - this.github_url = github_url; - this.github_owner = github_owner; - this.github_repo = github_repo; - } - - /** - * @param {string} prefixTarget - */ - generateTrElement(tbodyTarget = "member-tbody") { - generateTrElement( - { - index: this.index, - name: this.name, - address: this.address, - sim_batch: this.sim_batch, - github_url: this.github_url, - }, - tbodyTarget, - ); - } -} diff --git a/pages/modules/Mentor.js b/pages/modules/Mentor.js deleted file mode 100644 index 2ca41a7..0000000 --- a/pages/modules/Mentor.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Person } from "./Person.js"; - -export class Mentor extends Person { - showAtDocument(target = "mentor_name") { - document.getElementById(target).textContent = this.name; - } -} diff --git a/pages/modules/UMR.js b/pages/modules/UMR.js new file mode 100644 index 0000000..d1a18fe --- /dev/null +++ b/pages/modules/UMR.js @@ -0,0 +1,46 @@ +import { Region } from "./region.js"; +import { generateTrElement } from "./generateTrElement.js"; + +export class Umr extends Region { + /** @type {number} */ + index; + + /** @type {string} */ + country; + + /** @type {string} */ + basic_salary; + + /** @type {string} */ + web_source; + + /** + * @param {number} index + * @param {string} region + * @param {string} country + * @param {string} basic_salary + * @param {string} web_source + */ + constructor (index, region, country, basic_salary, web_source) { + super (region); + + this.index = index; + this.country = country; + this.basic_salary = basic_salary; + this.web_source = web_source; + } + + + generateTrElement (tbodyTarget = "member-tbody") { //Different method with a same name + generateTrElement ( //Input Data From Class + { + index: this.index, + region: this.region, + country: this.country, + basic_salary: this.basic_salary, + web_source: this.web_source, + }, + tbodyTarget + ); + } +} \ No newline at end of file diff --git a/pages/modules/generateElement.js b/pages/modules/generateElement.js new file mode 100644 index 0000000..d343ba7 --- /dev/null +++ b/pages/modules/generateElement.js @@ -0,0 +1,10 @@ +export { UmrElement1 as m1 } from "./generateElement1.js"; +export { UmrElement2 as m2 } from "./generateElement2.js"; +export { UmrElement3 as m3 } from "./generateElement3.js" +export { UmrElement4 as m4 } from "./generateElement4.js" +export { UmrElement5 as m5 } from "./generateElement5.js" +export { UmrElement6 as m6 } from "./generateElement6.js" +export { UmrElement7 as m7 } from "./generateElement7.js" +export { UmrElement8 as m8 } from "./generateElement8.js" +export { UmrElement9 as m9 } from "./generateElement9.js" +export { UmrElement10 as m10 } from "./generateElement10.js"; \ No newline at end of file diff --git a/pages/modules/generateElement1.js b/pages/modules/generateElement1.js new file mode 100644 index 0000000..0972f94 --- /dev/null +++ b/pages/modules/generateElement1.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement1 { + static region1 = new Umr ( + 1, + "Bandung", + "Indonesia", + "Rp. 3,800,000", + "https://databoks.katadata.co.id", + ); + } \ No newline at end of file diff --git a/pages/modules/generateElement10.js b/pages/modules/generateElement10.js new file mode 100644 index 0000000..e6b0012 --- /dev/null +++ b/pages/modules/generateElement10.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement10 { + static region10 = new Umr ( + 10, + "Bern", + "Switzerland", + "Rp. 104,000,000", + "https://studyinginswitzerland.com", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement2.js b/pages/modules/generateElement2.js new file mode 100644 index 0000000..51df527 --- /dev/null +++ b/pages/modules/generateElement2.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement2 { + static region2 = new Umr ( + 2, + "Beijing", + "China", + "Rp. 4,500,000", + "https://www.hrone.com", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement3.js b/pages/modules/generateElement3.js new file mode 100644 index 0000000..a3f4c4b --- /dev/null +++ b/pages/modules/generateElement3.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement3 { + static region3 = new Umr ( + 3, + "Kuala Lumpur", + "Malaysia", + "Rp. 5,300,000", + "https://althr.my", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement4.js b/pages/modules/generateElement4.js new file mode 100644 index 0000000..3ddf481 --- /dev/null +++ b/pages/modules/generateElement4.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement4 { + static region4 = new Umr ( + 4, + "Madinah", + "Saudi Arabia", + "Rp. 15,000,000", + "https://www.minimum-wage.org", + ); + } \ No newline at end of file diff --git a/pages/modules/generateElement5.js b/pages/modules/generateElement5.js new file mode 100644 index 0000000..b960257 --- /dev/null +++ b/pages/modules/generateElement5.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement5 { + static region5 = new Umr ( + 5, + "Tokyo", + "Japan", + "Rp. 20,000,000", + "https://www.japantimes.co.jp", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement6.js b/pages/modules/generateElement6.js new file mode 100644 index 0000000..d345e63 --- /dev/null +++ b/pages/modules/generateElement6.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement6 { + static region6 = new Umr ( + 6, + "Seoul", + "South Korea", + "Rp. 23,000,000", + "https://asia.nikkei.com", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement7.js b/pages/modules/generateElement7.js new file mode 100644 index 0000000..a645395 --- /dev/null +++ b/pages/modules/generateElement7.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement7 { + static region7 = new Umr ( + 7, + "New York", + "USA", + "Rp. 35,000,000", + "https://dol.ny.gov", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement8.js b/pages/modules/generateElement8.js new file mode 100644 index 0000000..1a4680c --- /dev/null +++ b/pages/modules/generateElement8.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement8 { + static region8 = new Umr ( + 8, + "Berlin", + "Germany", + "Rp. 66,000,000", + "https://www.dw.com", + ); +} \ No newline at end of file diff --git a/pages/modules/generateElement9.js b/pages/modules/generateElement9.js new file mode 100644 index 0000000..183bfd8 --- /dev/null +++ b/pages/modules/generateElement9.js @@ -0,0 +1,11 @@ +import { Umr } from "./UMR.js"; + +export class UmrElement9 { + static region9 = new Umr ( + 9, + "Capital of Luxembourg", + "Luxembourg", + "Rp. 91,000,000", + "https://datacommons.org", + ); +} \ No newline at end of file diff --git a/pages/modules/generateMember.js b/pages/modules/generateMember.js deleted file mode 100644 index 96dc33c..0000000 --- a/pages/modules/generateMember.js +++ /dev/null @@ -1,12 +0,0 @@ -export { generateMember as m1 } from "./generateMember1.js"; -export { generateMember as m2 } from "./generateMember2.js"; -export { generateMember as m3 } from "./generateMember3.js"; -export { generateMember as m4 } from "./generateMember4.js"; -export { generateMember as m5 } from "./generateMember5.js"; -export { generateMember as m6 } from "./generateMember6.js"; -export { generateMember as m7 } from "./generateMember7.js"; -export { generateMember as m8 } from "./generateMember8.js"; -export { generateMember as m9 } from "./generateMember9.js"; -export { generateMember as m10 } from "./generateMember10.js"; -export { generateMember as m11 } from "./generateMember11.js"; -export { generateMember as m12 } from "./generateMember12.js"; diff --git a/pages/modules/generateMember1.js b/pages/modules/generateMember1.js deleted file mode 100644 index 2116be2..0000000 --- a/pages/modules/generateMember1.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const member = new Member( - "Dian Prasetyo", - 1, - "Boyolali, Jawa Tengah", - "08", - "https://github.com/dianprsty", - "dianprsty", - ); - - member.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember10.js b/pages/modules/generateMember10.js deleted file mode 100644 index 59d047c..0000000 --- a/pages/modules/generateMember10.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const member = new Member( - "Abdurrochman Alfian", - 10, - "DKI Jakarta, Jakarta Selatan", - "10", - "https://github.com/Alfian-IDN", - "Alfian-IDN", - ); - - member.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember11.js b/pages/modules/generateMember11.js deleted file mode 100644 index 2b05de0..0000000 --- a/pages/modules/generateMember11.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const member = new Member( - "Bambang Rewanggi", - 11, - "Pekanbaru, Riau", - "08", - "https://github.com/Rewanggi", - "Rewanggi", - ); - - member.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember12.js b/pages/modules/generateMember12.js deleted file mode 100644 index a46d754..0000000 --- a/pages/modules/generateMember12.js +++ /dev/null @@ -1,17 +0,0 @@ -import { Member } from "./Member.js"; - -const member = new Member( - "Septianata Rizky Pratama", - 12, - "Sleman, Daerah Istimewa Yogyakarta", - "00", - "https://github.com/ianriizky", - "ianriizky", - "rwid-git", -); - -function generateMember() { - member.generateTrElement(); -} - -export { member, generateMember }; diff --git a/pages/modules/generateMember2.js b/pages/modules/generateMember2.js deleted file mode 100644 index 3bf24f3..0000000 --- a/pages/modules/generateMember2.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const member = new Member( - "Ahmad Ridlo Fadlli Robbi", - 2, - "Kudus, Jawa Tengah", - "09", - "https://github.com/fadlirobbi", - "fadlirobbi", - ); - - member.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember3.js b/pages/modules/generateMember3.js deleted file mode 100644 index 5c7fb52..0000000 --- a/pages/modules/generateMember3.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -const generateMember = () => { - const member = new Member( - "Muchamad Faiz", - 3, - "Serang, Banten", - "01", - "https://github.com/muchamadfaiz", - "muchamadfaiz", - ); - - member.generateTrElement(); -}; - -export { generateMember }; diff --git a/pages/modules/generateMember4.js b/pages/modules/generateMember4.js deleted file mode 100644 index 8874d88..0000000 --- a/pages/modules/generateMember4.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const data = new Member( - "Ady Bagus", - 4, - "Jakarta Barat", - "07", - "https://github.com/itsmeeep", - "itsmeeep", - ); - - data.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember5.js b/pages/modules/generateMember5.js deleted file mode 100644 index 4399f31..0000000 --- a/pages/modules/generateMember5.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Member } from "./Member.js"; - -function generateMember() { - const member = new Member( - "Bagus Irawan", - 5, - "Tangerang, Banten", - "6", - "https://www.github.com/oombagus", - "oombagus", - ); - - member.generateTrElement(); -} - -export { generateMember }; diff --git a/pages/modules/generateMember6.js b/pages/modules/generateMember6.js deleted file mode 100644 index d2fca3a..0000000 --- a/pages/modules/generateMember6.js +++ /dev/null @@ -1,13 +0,0 @@ -import { generateTrElement } from "./generateTrElement.js"; - -function generateMember() { - generateTrElement({ - index: 6, - name: "Iwan Purwadi", - address: "Palu, Sulawesi Tengah", - sim_batch: "07", - github_url: "https://github.com/nawiq7208", - }); -} - -export { generateMember }; diff --git a/pages/modules/generateMember7.js b/pages/modules/generateMember7.js deleted file mode 100644 index 2caa3c5..0000000 --- a/pages/modules/generateMember7.js +++ /dev/null @@ -1,13 +0,0 @@ -import { generateTrElement } from "./generateTrElement.js"; - -function generateMember() { - generateTrElement({ - index: 7, - name: "Muh. Akbar Razak", - address: "Makassar, Sulawesi Selatan", - sim_batch: "07", - github_url: "https://github.com/razak95", - }); -} - -export { generateMember }; diff --git a/pages/modules/generateMember8.js b/pages/modules/generateMember8.js deleted file mode 100644 index ed7899d..0000000 --- a/pages/modules/generateMember8.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Member } from "./Member.js"; - -export function generateMember() { - const member = new Member( - "Riky Ridho Pangestu", - 8, - "Kulon Progo, DIY", - "02", - "https://github.com/ridhoriky", - "ridhoriky", - ); - - member.generateTrElement(); -} diff --git a/pages/modules/generateMember9.js b/pages/modules/generateMember9.js deleted file mode 100644 index d04a571..0000000 --- a/pages/modules/generateMember9.js +++ /dev/null @@ -1,13 +0,0 @@ -import { generateTrElement } from "./generateTrElement.js"; - -function generateMember() { - generateTrElement({ - index: 9, - name: "Inga Resa", - address: "Kab. Magelang, Jawa Tengah", - sim_batch: "07", - github_url: "", - }); -} - -export { generateMember }; diff --git a/pages/modules/generateMentor.js b/pages/modules/generateMentor.js deleted file mode 100644 index 779cdab..0000000 --- a/pages/modules/generateMentor.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Mentor } from "./Mentor.js"; - -function generateMentor() { - const mentor = new Mentor("Septianata Rizky Pratama"); - - mentor.showAtDocument(); -} - -export { generateMentor }; diff --git a/pages/modules/generateTrElement.js b/pages/modules/generateTrElement.js index da631f7..aba20c0 100644 --- a/pages/modules/generateTrElement.js +++ b/pages/modules/generateTrElement.js @@ -1,16 +1,16 @@ /** * @param {string} prefixTarget - * @param {{ index?: number; name?: string; address?: string; sim_batch?: string; github_url?: string }} data + * @param {{ index?: number; region?: string; country?: string; basic_salary?: string; web_source?: string }} data */ -export function generateTrElement(data = {}, tbodyTarget = "member-tbody") { +export function generateTrElement (data = {}, tbodyTarget = "member-tbody") { /** @type {HTMLTableRowElement} */ const row = document.getElementById(tbodyTarget).insertRow(-1); row.insertCell(0).textContent = data?.index || ""; - row.insertCell(1).textContent = data?.name || ""; - row.insertCell(2).textContent = data?.address || ""; - row.insertCell(3).textContent = data?.sim_batch || ""; - row.insertCell(4).innerHTML = data?.github_url - ? `${data?.github_url}` + row.insertCell(1).textContent = data?.region || ""; + row.insertCell(2).textContent = data?.country || ""; + row.insertCell(3).textContent = data?.basic_salary || ""; + row.insertCell(4).innerHTML = data?.web_source + ? `${data?.web_source}` : ""; -} +} \ No newline at end of file diff --git a/pages/modules/generateWriter.js b/pages/modules/generateWriter.js new file mode 100644 index 0000000..7649853 --- /dev/null +++ b/pages/modules/generateWriter.js @@ -0,0 +1,7 @@ +import { Writer } from "./writer.js"; + +export function generateWriter () { + const writer = new Writer ("Jaya Mustika"); + + writer.showAtDocument (); +} \ No newline at end of file diff --git a/pages/modules/index.html b/pages/modules/index.html index d5e51b7..da9aede 100644 --- a/pages/modules/index.html +++ b/pages/modules/index.html @@ -3,29 +3,28 @@ - RWID - Modules + Practice - Modules -

Daftar Member RWID

+

UMR Around The Effing World

-

Nama Pementor:

+

Assembled by:

- - - - + + + +
No.NamaDomisiliSIM BatchGitHub URLRegionCountryBasic SalaryWeb Source
-

Back to Homepage

- + diff --git a/pages/modules/main.js b/pages/modules/main.js index 2e4ca88..8f3798f 100644 --- a/pages/modules/main.js +++ b/pages/modules/main.js @@ -1,12 +1,19 @@ -import * as generateMember from "./generateMember.js"; -import { generateMentor } from "./generateMentor.js"; +import * as generateElement from "./generateElement.js"; +import { generateWriter } from "./generateWriter.js"; function main() { - generateMentor(); + generateWriter(); - for (let index = 1; index <= 12; index++) { - generateMember[`m${index}`](); - } + generateElement.m1.region1.generateTrElement() + generateElement.m2.region2.generateTrElement(); + generateElement.m3.region3.generateTrElement(); + generateElement.m4.region4.generateTrElement(); + generateElement.m5.region5.generateTrElement(); + generateElement.m6.region6.generateTrElement(); + generateElement.m7.region7.generateTrElement(); + generateElement.m8.region8.generateTrElement(); + generateElement.m9.region9.generateTrElement(); + generateElement.m10.region10.generateTrElement(); } -main(); +main (); \ No newline at end of file diff --git a/pages/modules/region.js b/pages/modules/region.js new file mode 100644 index 0000000..227b03b --- /dev/null +++ b/pages/modules/region.js @@ -0,0 +1,11 @@ +export class Region { + /** @type {string} */ + region; + + /** + * @param {string} region + */ + constructor (region) { + this.region = region; + } +} \ No newline at end of file diff --git a/pages/modules/writer.js b/pages/modules/writer.js new file mode 100644 index 0000000..483c3d2 --- /dev/null +++ b/pages/modules/writer.js @@ -0,0 +1,8 @@ +import { Region } from "./region.js"; + +export class Writer extends Region { + showAtDocument (target = "writer_name") { + document.getElementById(target).textContent = + this.region; + } +} diff --git a/pages/oop/js/Factorial.js b/pages/oop/js/Factorial.js index 77a83a8..3ba1f66 100644 --- a/pages/oop/js/Factorial.js +++ b/pages/oop/js/Factorial.js @@ -1,60 +1,51 @@ import { parseNumber } from "../../js/helper.js"; export class Factorial { - /** @type {number} */ - n; - /** - * @param {number} n + * @param {number} n */ constructor(n) { - this.n = parseNumber(n); + this.n = n; } /** - * Count factorial number from the given "n" value using loop way. + * Iterative Approach + * @param {number} [n=this.n] */ - countUsingLoop() { + factorialUsingLoop() { let result = 1; - - for (let index = this.n; index > 0; index--) { - result = result * index; + + for (let index = 2; index <= this.n; index++) { + result *= index; } - + return result; } /** - * Count factorial number from the given "n" value using recursive way. - * - * @param {number | undefined} n - * @returns {number} + * Recursive approach. + * @param {number} [n=this.n] */ - countUsingRecursive(n = undefined) { - n ||= this.n; - - if (n < 2) { - return 1; - } - - return n * this.countUsingRecursive(n - 1); + factorialUsingRecursive(n = this.n) { + return n <= 1 + ? 1 + : this.factorialUsingRecursive(n - 1) * n; } - /** + /** * Count factorial number from the given "n" value. - * * @param {"loop" | "recursive"} method * @throws {Error} */ - count(method) { - if (method == "loop") { - return this.countUsingLoop(); - } else if (method == "recursive") { - return this.countUsingRecursive(); - } else { - throw new Error("Method must be loop or recursive."); + count(method) { + if (method == "loop") { + return this.factorialUsingLoop(); + } else if (method == "recursive") { + return this.factorialUsingRecursive(); + } else { + throw new Error("Method must be loop or recursive."); + } } - } } document.getElementById("form").addEventListener("submit", function (event) { @@ -62,6 +53,7 @@ document.getElementById("form").addEventListener("submit", function (event) { try { const n = event.target["n"].value; + const method = event.target["method"].value; const result = new Factorial(n).count(method); diff --git a/pages/oop/js/Fibonacci.js b/pages/oop/js/Fibonacci.js index 555a4f3..6b3deb5 100644 --- a/pages/oop/js/Fibonacci.js +++ b/pages/oop/js/Fibonacci.js @@ -1,90 +1,84 @@ import { parseNumber } from "../../js/helper.js"; export class Fibonacci { - /** @type {number} */ - sequence; - /** - * @param {number} sequence + * @param {number} n */ - constructor(sequence) { - this.sequence = parseNumber(sequence); + constructor(n) { + this.input = n; } /** - * @param {number} n - * @returns {number} + * Recursive Approach + * @param {number} [i=this.input] */ - static get(n) { - return n < 1 ? 0 : n <= 2 ? 1 : this.get(n - 1) + this.get(n - 2); + fibonacciUsingRecursive (i = this.input) { + return i <= 0 + ? 0 + : i <= 2 + ? 1 + : this.fibonacciUsingRecursive (i - 1) + + this.fibonacciUsingRecursive (i - 2); } /** - * Create an array filled by fibonacci sequence using loop way. - */ - generateUsingLoop() { - let result = []; - let prev = 0; - let next = 1; - - for (let index = 0; index < this.sequence; index++) { - result.push(prev); - - const current = prev + next; - prev = next; - next = current; + * Fibonacci Loop Approach + * @param {number} sequence + */ + fibbonaciUsingLoop (sequence = this.input) { + if (sequence < 1) { + return 0; + } else if (sequence <= 2) { + return 1 } - return result; - } - - /** - * Create an array filled by fibonacci sequence using recursive way. - */ - generateUsingRecursive() { - let result = []; - - for (let index = 0; index < this.sequence; index++) { - const current = Fibonacci.get(index); + let previous = 0; + + let next = 1; + + let result = 1; - result.push(current); + for (let iteration = 2; iteration <= sequence; iteration++) { + result = previous + next; + previous = next; + next = result; } return result; } /** - * Create an array filled by fibonacci sequence. - * - * @param {"loop" | "recursive"} method - */ + * Create an array filled by fibonacci sequence. + * @param {"loop" | "recursive"} method + */ generate(method) { - if (method === "loop") { - return this.generateUsingLoop(); - } else if (method === "recursive") { - return this.generateUsingRecursive(); - } else { - throw new Error("Method must be loop or recursive."); - } + if (method === "loop") { + return this.fibbonaciUsingLoop(); + } else if (method === "recursive") { + return this.fibonacciUsingRecursive(); + } else { + throw new Error("Method must be loop or recursive."); + } } } document.getElementById("form").addEventListener("submit", function (event) { - event.preventDefault(); - - try { - const sequence = event.target["sequence"].value; - const method = event.target["method"].value; - - const numbers = new Fibonacci(sequence).generate(method); - - document.getElementById("result").innerHTML = document.getElementById( - "result", +event.preventDefault(); +try { + const sequence = event.target["sequence"].value; + + const method = event.target["method"].value; + + const numbers = new Fibonacci(sequence).generate(method); + + document.getElementById("result").innerHTML = document.getElementById( + "result", ).innerHTML = numbers - .map(number => `
${number}
`) - .join(""); + .map(number => `
${number}
`) + .join(""); } catch (error) { alert(error.message); console.error(error); } }); + \ No newline at end of file diff --git a/pages/oop/js/FizzBuzz.js b/pages/oop/js/FizzBuzz.js index a9d1e6b..7b3e7de 100644 --- a/pages/oop/js/FizzBuzz.js +++ b/pages/oop/js/FizzBuzz.js @@ -1,35 +1,36 @@ import { parseNumber } from "../../js/helper.js"; export class FizzBuzz { - /** @type {number} */ - sequence; - /** - * @param {number} sequence + * Initializes a new instance of the FizzBuzz class. + * @param {number} n */ - constructor(sequence) { - this.sequence = parseNumber(sequence); + constructor(n) { + this.n = n; } /** - * Create an array filled by "fizz", "buzz", or "fizz buzz" based on - * this requirement below (highest priority from above). - * - * Muliples of 4 or 7: "fizz buzz" - * Odd sequence: "fizz" - * Even sequence: "buzz" + * Iterative Approach + * @param {number} [index=this.n] + * @yields {string} */ - generate() { + *fizzBuzzGenerator(index = this.n) { + for (let i = 1; i < index + 1; i++) { + yield i % 4 === 0 || i % 7 === 0 + ? `Iteration ${i} : Fizz Buzz` + : i % 2 === 0 + ? `Iteration ${i} : Fizz` + : i % 2 === 1 + ? `Iteration ${i} : Buzz` + : undefined; + } + } + + generate () { let result = []; - for (let index = 1; index <= this.sequence; index++) { - if (index % 4 === 0 || index % 7 === 0) { - result.push("fizz buzz"); - } else if (index % 2 === 1) { - result.push("fizz"); - } else if (index % 2 === 0) { - result.push("buzz"); - } + for (const x of this.fizzBuzzGenerator ()) { + result.push (x); } return result; diff --git a/pages/oop/js/Palindrome.js b/pages/oop/js/Palindrome.js index af85a2c..ff91e1a 100644 --- a/pages/oop/js/Palindrome.js +++ b/pages/oop/js/Palindrome.js @@ -1,84 +1,77 @@ import { parseString } from "../../js/helper.js"; export class Palindrome { - /** @type {string} */ - value; - /** - * @param {string} value + * Initializes a new instance of the Palindrome class. + * @param {string} n */ - constructor(value) { - this.value = parseString(value); + constructor(n) { + this.input = n; } /** - * Determine whether the given value is a palindrome or not using reverse way. + * Reverse Approach + * @param {string} [value = this.input] */ - evaluateUsingReverse() { - let newValue = ""; - - for (let index = this.value.length - 1; index >= 0; index--) { - newValue += this.value[index]; - } - - return this.value === newValue; + isPalindrome(value = this.input) { + const cleanedInput = value.replace(/\s/g, "").toLowerCase(); + + const reversedInput = cleanedInput.split("").reverse().join(""); + + return cleanedInput === reversedInput; } /** - * Determine whether the given value is a palindrome or not using loop way. - */ - evaluateUsingLoop() { - for (let index = 0; index < Math.floor(this.value.length / 2); index++) { - const lastCharacterIndex = this.value.length - (index + 1); - - const firstCharacter = this.value[index]; - const lastCharacter = this.value[lastCharacterIndex]; - - if (firstCharacter !== lastCharacter) { + * Iterative Approach + * @param {string} [value = this.input] + */ + isPalindrome2 (value = this.input) { + console.log (value.length); + + label : for (let index = 0; index < Math.ceil(value.length/2); index++) { + const firstChar = value [index]; + + const lastChar = value [value.length - (index + 1)]; + + if (lastChar !== firstChar) { return false; - } - } + } console.log (`iteration ${value} ${index + 1}`); + continue label; + } return true; } - /** - * Determine whether the given value is a palindrome or not using recursive way. - * - * @param {number | undefined} index - */ - evaluateUsingRecursive(index = undefined) { - index ||= 0; - - if (index < Math.floor(this.value.length / 2)) { - const lastCharacterIndex = this.value.length - (index + 1); - - const firstCharacter = this.value[index]; - const lastCharacter = this.value[lastCharacterIndex]; - - if (firstCharacter !== lastCharacter) { - return false; - } - - return this.evaluateUsingRecursive(this.value, index + 1); + /** + * Recursive Approach + * @param {string} [value = this.input] + * @param {number} index + */ + isPalindrome3 (value = this.input, index = 0) { + const firstChar = value [index]; + + const lastChar = value [value.length - (index + 1)] + + if (firstChar !== lastChar) { + return false; + } else if (index < Math.ceil (value.length/2)) { + return this.isPalindrome3 (value, index + 1); + } console.log (`iteration ${value} ${index + 1}`); + return true; } - return true; - } - /** - * Determine whether the given value is a palindrome or not. - * - * @typedef {"reverse" | "loop" | "recursive"} Method - * @param {Method} method - */ + * Determine whether the given value is a palindrome or not. + * @typedef {"reverse" | "loop" | "recursive"} Method + * @param {Method} method + */ evaluate(method) { if (method === "reverse") { - return this.evaluateUsingReverse(); + return this.isPalindrome(); } else if (method === "loop") { - return this.evaluateUsingLoop(); + return this.isPalindrome2(); } else if (method === "recursive") { - return this.evaluateUsingRecursive(); + return this.isPalindrome3(); } else { throw new Error("Method must be reverse, loop, or recursive."); } @@ -86,7 +79,6 @@ export class Palindrome { /** * Return palindrome human-readable description. - * * @param {Method} method */ generateStatus(method) { @@ -101,6 +93,7 @@ document.getElementById("form").addEventListener("submit", function (event) { try { const word = event.target["word"].value; + const method = event.target["method"].value; const result = new Palindrome(word).generateStatus(method);