Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions .github/workflows/UploadCoverageReport.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ name: UploadCoverageReport
- master
pull_request:

env:
REPORT_PATH: "coverage/coverage-final.json"

jobs:
UploadCoverageReport:
runs-on: ubuntu-latest
Expand All @@ -25,9 +28,18 @@ jobs:
- name: Generate coverage report
run: npm test -- --coverage

- name: Upload coverage to codecov
uses: codecov/codecov-action@v3
- name: Upload coverage to codecov (tokenless)
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository
uses: codecov/codecov-action@v4
with:
files: "${{ env.REPORT_PATH }}"
fail_ci_if_error: true

- name: Upload coverage to codecov (with token)
if: "! github.event.pull_request.head.repo.fork "
uses: codecov/codecov-action@v4
with:
files: "coverage/coverage-final.json"
token: ${{ secrets.CODECOV_TOKEN }}
files: "${{ env.REPORT_PATH }}"
fail_ci_if_error: true
...
38 changes: 38 additions & 0 deletions Compression/RLE.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* 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 }
13 changes: 13 additions & 0 deletions Compression/test/RLE.test.js
Original file line number Diff line number Diff line change
@@ -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')
})
})
18 changes: 11 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.