RosettaCodeData/Task/Morse-code/ABAP/morse-code.abap

73 lines
7.3 KiB
ABAP

REPORT morse_code.
TYPES: BEGIN OF y_morse_code,
letter TYPE string,
code TYPE string,
END OF y_morse_code,
ty_morse_code TYPE STANDARD TABLE OF y_morse_code WITH EMPTY KEY.
cl_demo_output=>new(
)->begin_section( |Morse Code|
)->write( REDUCE stringtab( LET words = VALUE stringtab( ( |sos| )
( | Hello World!| )
( |Rosetta Code| ) )
morse_code = VALUE ty_morse_code( ( letter = 'A' code = '.- ' )
( letter = 'B' code = '-... ' )
( letter = 'C' code = '-.-. ' )
( letter = 'D' code = '-.. ' )
( letter = 'E' code = '. ' )
( letter = 'F' code = '..-. ' )
( letter = 'G' code = '--. ' )
( letter = 'H' code = '.... ' )
( letter = 'I' code = '.. ' )
( letter = 'J' code = '.--- ' )
( letter = 'K' code = '-.- ' )
( letter = 'L' code = '.-.. ' )
( letter = 'M' code = '-- ' )
( letter = 'N' code = '-. ' )
( letter = 'O' code = '--- ' )
( letter = 'P' code = '.--. ' )
( letter = 'Q' code = '--.- ' )
( letter = 'R' code = '.-. ' )
( letter = 'S' code = '... ' )
( letter = 'T' code = '- ' )
( letter = 'U' code = '..- ' )
( letter = 'V' code = '...- ' )
( letter = 'W' code = '.- - ' )
( letter = 'X' code = '-..- ' )
( letter = 'Y' code = '-.-- ' )
( letter = 'Z' code = '--.. ' )
( letter = '0' code = '----- ' )
( letter = '1' code = '.---- ' )
( letter = '2' code = '..--- ' )
( letter = '3' code = '...-- ' )
( letter = '4' code = '....- ' )
( letter = '5' code = '..... ' )
( letter = '6' code = '-.... ' )
( letter = '7' code = '--... ' )
( letter = '8' code = '---.. ' )
( letter = '9' code = '----. ' )
( letter = '''' code = '.----. ' )
( letter = ':' code = '---... ' )
( letter = ',' code = '--..-- ' )
( letter = '-' code = '-....- ' )
( letter = '(' code = '-.--.- ' )
( letter = '.' code = '.-.-.- ' )
( letter = '?' code = '..--.. ' )
( letter = ';' code = '-.-.-. ' )
( letter = '/' code = '-..-. ' )
( letter = '_' code = '..--.- ' )
( letter = ')' code = '---.. ' )
( letter = '=' code = '-...- ' )
( letter = '@' code = '.--.-. ' )
( letter = '\' code = '.-..-. ' )
( letter = '+' code = '.-.-. ' )
( letter = ' ' code = '/' ) )
IN INIT word_coded_tab TYPE stringtab
FOR word IN words
NEXT word_coded_tab = VALUE #( BASE word_coded_tab ( REDUCE string( INIT word_coded TYPE string
FOR index = 1 UNTIL index > strlen( word )
LET _morse_code = VALUE #( morse_code[ letter = COND #( WHEN index = 1 THEN to_upper( word(index) )
ELSE LET prev = index - 1 IN to_upper( word+prev(1) ) ) ]-code OPTIONAL )
IN NEXT word_coded = |{ word_coded } { _morse_code }| ) ) ) )
)->display( ).