From 1ff709e7bdaeb0d325fa789a150e4b1c357751ea Mon Sep 17 00:00:00 2001 From: ddaniel27 Date: Mon, 6 May 2024 22:13:25 -0500 Subject: [PATCH 1/5] [Solution] Project euler challenge 19 with tests --- Project-Euler/Problem019.js | 55 +++++++++++++++++++++++++++ Project-Euler/test/Problem019.test.js | 8 ++++ 2 files changed, 63 insertions(+) create mode 100644 Project-Euler/Problem019.js create mode 100644 Project-Euler/test/Problem019.test.js diff --git a/Project-Euler/Problem019.js b/Project-Euler/Problem019.js new file mode 100644 index 0000000000..6b273b5953 --- /dev/null +++ b/Project-Euler/Problem019.js @@ -0,0 +1,55 @@ +/** + * Problem 19 - Counting Sundays + * + * @see {@link https://projecteuler.net/problem=19} + * + * You are given the following information, but you may prefer to do some research for yourself. + * 1 Jan 1900 was a Monday. + * Thirty days has September, + * April, June and November. + * All the rest have thirty-one, + * Saving February alone, + * Which has twenty-eight, rain or shine. + * And on leap years, twenty-nine. + * A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. + * How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? + * + * @author ddaniel27 + */ + +// Check if a year is a leap year +// A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. +function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 +} + +function problem19() { + let sundaysCount = 0 // Count of Sundays + let dayOfWeek = 2 // 1st Jan 1900 was a Monday, so 1st Jan 1901 was a Tuesday + + for (let year = 1901; year <= 2000; year++) { + // From 1901 to 2000 + for (let month = 1; month <= 12; month++) { + // From January to December + if (dayOfWeek === 0) { + // If it's a Sunday (0 is Sunday, 1 is Monday, ..., 6 is Saturday) + sundaysCount++ + } + + let daysInMonth = 31 + if (month === 4 || month === 6 || month === 9 || month === 11) { + // April, June, September, November + daysInMonth = 30 + } else if (month === 2) { + // February + daysInMonth = isLeapYear(year) ? 29 : 28 + } + + dayOfWeek = (dayOfWeek + daysInMonth) % 7 // Calculate the day of the week + } + } + + return sundaysCount +} + +export { problem19 } diff --git a/Project-Euler/test/Problem019.test.js b/Project-Euler/test/Problem019.test.js new file mode 100644 index 0000000000..8845e5a0ac --- /dev/null +++ b/Project-Euler/test/Problem019.test.js @@ -0,0 +1,8 @@ +import { problem19 } from '../Problem019.js' + +describe('checking sundays during the twentieth century', () => { + // Project Euler Challenge Check + test('result should be 171', () => { + expect(problem19()).toBe(171) + }) +}) From 664da39d784ad0e0c90a960b0dbd576acab32bfc Mon Sep 17 00:00:00 2001 From: ddaniel27 Date: Mon, 27 May 2024 10:27:29 -0500 Subject: [PATCH 2/5] update leap year function --- Project-Euler/Problem019.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Project-Euler/Problem019.js b/Project-Euler/Problem019.js index 6b273b5953..75e8d7528b 100644 --- a/Project-Euler/Problem019.js +++ b/Project-Euler/Problem019.js @@ -16,12 +16,7 @@ * * @author ddaniel27 */ - -// Check if a year is a leap year -// A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. -function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 -} +import { isLeapYear } from '../Maths/LeapYear' function problem19() { let sundaysCount = 0 // Count of Sundays From 98a6fa4d80127096fbc82d821e70158b2e9dc638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sat, 15 Jun 2024 00:18:31 +0200 Subject: [PATCH 3/5] Remove unnecessary, confusingly placed comments --- Project-Euler/Problem019.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Project-Euler/Problem019.js b/Project-Euler/Problem019.js index 75e8d7528b..5b488c7f96 100644 --- a/Project-Euler/Problem019.js +++ b/Project-Euler/Problem019.js @@ -23,9 +23,7 @@ function problem19() { let dayOfWeek = 2 // 1st Jan 1900 was a Monday, so 1st Jan 1901 was a Tuesday for (let year = 1901; year <= 2000; year++) { - // From 1901 to 2000 for (let month = 1; month <= 12; month++) { - // From January to December if (dayOfWeek === 0) { // If it's a Sunday (0 is Sunday, 1 is Monday, ..., 6 is Saturday) sundaysCount++ From 2b70c8cd3987da64a77e22d7fd1e35644d6fe9fe Mon Sep 17 00:00:00 2001 From: ddaniel27 Date: Tue, 18 Jun 2024 10:22:16 -0500 Subject: [PATCH 4/5] [COMPRESSOR] RLE --- Compression/RLE.js | 41 ++++++++++++++++++++++++++++++++++++ Compression/test/RLE.test.js | 13 ++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 Compression/RLE.js create mode 100644 Compression/test/RLE.test.js diff --git a/Compression/RLE.js b/Compression/RLE.js new file mode 100644 index 0000000000..02a1ba1fed --- /dev/null +++ b/Compression/RLE.js @@ -0,0 +1,41 @@ +/* + * RLE (Run Length Encoding) is a simple form of data compression. + * The basic idea is to represent repeated successive characters as a single count and character. + * For example, the string "AAAABBBCCDAA" would be encoded as "4A3B2C1D2A". + * + * @author - [ddaniel27](https://github.com/ddaniel27) +*/ + +function Compress(str) { + let compressed = '' + let count = 1 + + for (let i = 0; i < str.length; i++) { + if (str[i] !== str[i + 1]) { + compressed += count + str[i] + count = 1 + continue + } + + count++ + } + + return compressed +} + +function Decompress(str) { + let decompressed = '' + let match = [...str.matchAll(/(\d+)(\D)/g)] // match all groups of digits followed by a non-digit character + + match.forEach(item => { + let [count, char] = [item[1], item[2]] + decompressed += char.repeat(count) + }) + + return decompressed +} + +export { + Compress, + Decompress +} diff --git a/Compression/test/RLE.test.js b/Compression/test/RLE.test.js new file mode 100644 index 0000000000..0094b5b7e2 --- /dev/null +++ b/Compression/test/RLE.test.js @@ -0,0 +1,13 @@ +import { Compress, Decompress } from '../RLE' + +describe('Test RLE Compressor/Decompressor', () => { + it('Test - 1, Pass long repetitive strings', () => { + expect(Compress('AAAAAAAAAAAAAA')).toBe('14A') + expect(Compress('AAABBQQQQQFG')).toBe('3A2B5Q1F1G') + }) + + it('Test - 2, Pass compressed strings', () => { + expect(Decompress('14A')).toBe('AAAAAAAAAAAAAA') + expect(Decompress('3A2B5Q1F1G')).toBe('AAABBQQQQQFG') + }) +}) From 3e1156c51b23352936899df3661d2534da3304af Mon Sep 17 00:00:00 2001 From: ddaniel27 Date: Tue, 18 Jun 2024 10:22:55 -0500 Subject: [PATCH 5/5] [COMPRESSOR] RLE style fixed --- Compression/RLE.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Compression/RLE.js b/Compression/RLE.js index 02a1ba1fed..81a1538646 100644 --- a/Compression/RLE.js +++ b/Compression/RLE.js @@ -1,10 +1,10 @@ /* - * RLE (Run Length Encoding) is a simple form of data compression. - * The basic idea is to represent repeated successive characters as a single count and character. - * For example, the string "AAAABBBCCDAA" would be encoded as "4A3B2C1D2A". - * - * @author - [ddaniel27](https://github.com/ddaniel27) -*/ + * RLE (Run Length Encoding) is a simple form of data compression. + * The basic idea is to represent repeated successive characters as a single count and character. + * For example, the string "AAAABBBCCDAA" would be encoded as "4A3B2C1D2A". + * + * @author - [ddaniel27](https://github.com/ddaniel27) + */ function Compress(str) { let compressed = '' @@ -27,15 +27,12 @@ function Decompress(str) { let decompressed = '' let match = [...str.matchAll(/(\d+)(\D)/g)] // match all groups of digits followed by a non-digit character - match.forEach(item => { + match.forEach((item) => { let [count, char] = [item[1], item[2]] decompressed += char.repeat(count) }) - return decompressed + return decompressed } -export { - Compress, - Decompress -} +export { Compress, Decompress } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy