Add run-length-encoding exercise (#38)
* Add run-length-encoding exercise * Lint, config update * Lint
This commit is contained in:
@@ -327,7 +327,7 @@
|
||||
"ignorePatterns": [],
|
||||
"local": "^LCL_.+$",
|
||||
"exception": "^LCX_.+$",
|
||||
"test": "^LTCL_.+$"
|
||||
"test": "^LT.+$"
|
||||
},
|
||||
"local_testclass_location": true,
|
||||
"local_variable_names": false,
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
"ignorePatterns": [],
|
||||
"local": "^LCL_.+$",
|
||||
"exception": "^LCX_.+$",
|
||||
"test": "^LTCL_.+$"
|
||||
"test": "^LT.+$"
|
||||
},
|
||||
"local_testclass_location": true,
|
||||
"local_variable_names": false,
|
||||
|
||||
@@ -108,6 +108,14 @@
|
||||
"practices": [],
|
||||
"prerequisites": [],
|
||||
"difficulty": 2
|
||||
},
|
||||
{
|
||||
"slug": "run-length-encoding",
|
||||
"name": "Run Length Encoding",
|
||||
"uuid": "18479071-0e8a-4ba6-8a32-fb2ee40cc94c",
|
||||
"practices": [],
|
||||
"prerequisites": [],
|
||||
"difficulty": 3
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
24
exercises/practice/run-length-encoding/.docs/instructions.md
Normal file
24
exercises/practice/run-length-encoding/.docs/instructions.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Description
|
||||
|
||||
Implement run-length encoding and decoding.
|
||||
|
||||
Run-length encoding (RLE) is a simple form of data compression, where runs
|
||||
(consecutive data elements) are replaced by just one data value and count.
|
||||
|
||||
For example we can represent the original 53 characters with only 13.
|
||||
|
||||
```text
|
||||
"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB" -> "12WB12W3B24WB"
|
||||
```
|
||||
|
||||
RLE allows the original data to be perfectly reconstructed from
|
||||
the compressed data, which makes it a lossless data compression.
|
||||
|
||||
```text
|
||||
"AABCCCDEEEE" -> "2AB3CD4E" -> "AABCCCDEEEE"
|
||||
```
|
||||
|
||||
For simplicity, you can assume that the unencoded string will only contain
|
||||
the letters A through Z (either lower or upper case) and whitespace. This way
|
||||
data to be encoded will never contain any numbers and numbers inside data to
|
||||
be decoded always represent the count for the following character.
|
||||
13
exercises/practice/run-length-encoding/.meta/config.json
Normal file
13
exercises/practice/run-length-encoding/.meta/config.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"blurb": "Implement run-length encoding and decoding.",
|
||||
"authors": ["pokrakam"],
|
||||
"contributors": [
|
||||
],
|
||||
"files": {
|
||||
"solution": ["zcl_rle.clas.abap"],
|
||||
"test": ["zcl_rle.clas.testclasses.abap"],
|
||||
"example": [".meta/zcl_rle.clas.abap"]
|
||||
},
|
||||
"source": "Wikipedia",
|
||||
"source_url": "https://en.wikipedia.org/wiki/Run-length_encoding"
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
CLASS zcl_rle DEFINITION
|
||||
PUBLIC
|
||||
FINAL
|
||||
CREATE PUBLIC .
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS encode IMPORTING input TYPE string
|
||||
RETURNING VALUE(result) TYPE string.
|
||||
|
||||
METHODS decode IMPORTING input TYPE string
|
||||
RETURNING VALUE(result) TYPE string.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS zcl_rle IMPLEMENTATION.
|
||||
|
||||
METHOD encode.
|
||||
|
||||
DATA: char TYPE string,
|
||||
duplicates TYPE string.
|
||||
|
||||
DATA(str) = input.
|
||||
|
||||
WHILE str IS NOT INITIAL.
|
||||
|
||||
FIND REGEX '([\w|\s])(\1*)(.*)' IN str SUBMATCHES char duplicates str ##SUBRC_OK.
|
||||
|
||||
IF duplicates IS NOT INITIAL.
|
||||
result = |{ result }{ strlen( duplicates ) + 1 }{ char }|.
|
||||
ELSE.
|
||||
result = |{ result }{ char }|.
|
||||
ENDIF.
|
||||
|
||||
ENDWHILE.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD decode.
|
||||
|
||||
DATA: char TYPE string,
|
||||
reps TYPE string.
|
||||
|
||||
DATA(str) = input.
|
||||
|
||||
WHILE str IS NOT INITIAL.
|
||||
|
||||
FIND REGEX '(\d*)([\w|\s])(.*)' IN str SUBMATCHES reps char str ##SUBRC_OK.
|
||||
|
||||
IF reps IS NOT INITIAL.
|
||||
result = |{ result }{ repeat( val = char occ = reps ) }|.
|
||||
ELSE.
|
||||
result = |{ result }{ char }|.
|
||||
ENDIF.
|
||||
|
||||
ENDWHILE.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
32
exercises/practice/run-length-encoding/zcl_rle.clas.abap
Normal file
32
exercises/practice/run-length-encoding/zcl_rle.clas.abap
Normal file
@@ -0,0 +1,32 @@
|
||||
CLASS zcl_rle DEFINITION
|
||||
PUBLIC
|
||||
FINAL
|
||||
CREATE PUBLIC .
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS encode IMPORTING input TYPE string
|
||||
RETURNING VALUE(result) TYPE string.
|
||||
|
||||
METHODS decode IMPORTING input TYPE string
|
||||
RETURNING VALUE(result) TYPE string.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS zcl_rle IMPLEMENTATION.
|
||||
|
||||
METHOD encode.
|
||||
|
||||
"Add solution here
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD decode.
|
||||
|
||||
"Add solution here
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
@@ -0,0 +1,118 @@
|
||||
CLASS ltc_encode DEFINITION FINAL FOR TESTING
|
||||
DURATION SHORT
|
||||
RISK LEVEL HARMLESS.
|
||||
|
||||
PRIVATE SECTION.
|
||||
DATA cut TYPE REF TO zcl_rle.
|
||||
|
||||
METHODS setup.
|
||||
|
||||
METHODS empty_string FOR TESTING RAISING cx_static_check.
|
||||
METHODS no_repeat FOR TESTING RAISING cx_static_check.
|
||||
METHODS no_singles FOR TESTING RAISING cx_static_check.
|
||||
METHODS mixed_singles_and_repeats FOR TESTING RAISING cx_static_check.
|
||||
METHODS mixed_and_spaces FOR TESTING RAISING cx_static_check.
|
||||
METHODS lowercase FOR TESTING RAISING cx_static_check.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_encode IMPLEMENTATION.
|
||||
|
||||
METHOD setup.
|
||||
cut = NEW zcl_rle( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD empty_string.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( `` )
|
||||
exp = `` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD no_repeat.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( `XYZ` )
|
||||
exp = `XYZ` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD no_singles.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( `AABBBCCCC` )
|
||||
exp = `2A3B4C` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD mixed_singles_and_repeats.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( `WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB` )
|
||||
exp = `12WB12W3B24WB` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD mixed_and_spaces.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( ` hsqq qww ` )
|
||||
exp = `2 hs2q q2w2 ` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lowercase.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->encode( `aabbbcccc` )
|
||||
exp = `2a3b4c` ).
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_decode DEFINITION FINAL FOR TESTING
|
||||
DURATION SHORT
|
||||
RISK LEVEL HARMLESS.
|
||||
|
||||
PRIVATE SECTION.
|
||||
DATA cut TYPE REF TO zcl_rle.
|
||||
|
||||
METHODS setup.
|
||||
|
||||
METHODS empty_string FOR TESTING RAISING cx_static_check.
|
||||
METHODS no_repeat FOR TESTING RAISING cx_static_check.
|
||||
METHODS no_singles FOR TESTING RAISING cx_static_check.
|
||||
METHODS mixed_singles_and_repeats FOR TESTING RAISING cx_static_check.
|
||||
METHODS mixed_and_spaces FOR TESTING RAISING cx_static_check.
|
||||
METHODS lowercase FOR TESTING RAISING cx_static_check.
|
||||
METHODS encode_and_decode FOR TESTING RAISING cx_static_check.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_decode IMPLEMENTATION.
|
||||
|
||||
METHOD setup.
|
||||
cut = NEW zcl_rle( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD empty_string.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `` )
|
||||
exp = `` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD no_repeat.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `XYZ` )
|
||||
exp = `XYZ` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD no_singles.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `2A3B4C` )
|
||||
exp = `AABBBCCCC` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD mixed_singles_and_repeats.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `12WB12W3B24WB` )
|
||||
exp = `WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD mixed_and_spaces.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `2 hs2q q2w2 ` )
|
||||
exp = ` hsqq qww ` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lowercase.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( `2a3b4c` )
|
||||
exp = `aabbbcccc` ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD encode_and_decode.
|
||||
cl_abap_unit_assert=>assert_equals( act = cut->decode( cut->encode( `zzz ZZ zZ` ) )
|
||||
exp = `zzz ZZ zZ` ).
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
Reference in New Issue
Block a user