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 }