73 lines
2.8 KiB
ABAP
73 lines
2.8 KiB
ABAP
REPORT z_rosetta_abc.
|
|
|
|
" Type declaration for blocks of letters
|
|
TYPES: BEGIN OF block,
|
|
s1 TYPE char1,
|
|
s2 TYPE char1,
|
|
END OF block,
|
|
|
|
blocks_table TYPE STANDARD TABLE OF block.
|
|
|
|
DATA: blocks TYPE blocks_table.
|
|
|
|
CLASS word_maker DEFINITION.
|
|
PUBLIC SECTION.
|
|
CLASS-METHODS:
|
|
can_make_word
|
|
IMPORTING word TYPE string
|
|
letter_blocks TYPE blocks_table
|
|
RETURNING VALUE(found) TYPE abap_bool.
|
|
ENDCLASS.
|
|
|
|
CLASS word_maker IMPLEMENTATION.
|
|
METHOD can_make_word.
|
|
|
|
" Create a reader stream that reads 1 character at a time
|
|
DATA(reader) = NEW cl_abap_string_c_reader( word ).
|
|
|
|
DATA(blocks) = letter_blocks.
|
|
|
|
WHILE reader->data_available( ).
|
|
|
|
DATA(ch) = to_upper( reader->read( 1 ) ).
|
|
found = abap_false.
|
|
|
|
LOOP AT blocks REFERENCE INTO DATA(b).
|
|
IF ch = b->s1 OR ch = b->s2.
|
|
found = abap_true.
|
|
DELETE blocks INDEX sy-tabix.
|
|
EXIT. " the inner loop once a character is found
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
" If a character could not be found, stop looking further
|
|
IF found = abap_false.
|
|
RETURN.
|
|
ENDIF.
|
|
ENDWHILE.
|
|
|
|
ENDMETHOD.
|
|
ENDCLASS.
|
|
|
|
START-OF-SELECTION.
|
|
|
|
blocks = VALUE #( ( s1 = 'B' s2 = 'O' ) ( s1 = 'X' s2 = 'K' )
|
|
( s1 = 'D' s2 = 'Q' ) ( s1 = 'C' s2 = 'P' )
|
|
( s1 = 'N' s2 = 'A' ) ( s1 = 'G' s2 = 'T' )
|
|
( s1 = 'R' s2 = 'E' ) ( s1 = 'T' s2 = 'G' )
|
|
( s1 = 'Q' s2 = 'D' ) ( s1 = 'F' s2 = 'S' )
|
|
( s1 = 'J' s2 = 'W' ) ( s1 = 'H' s2 = 'U' )
|
|
( s1 = 'V' s2 = 'I' ) ( s1 = 'A' s2 = 'N' )
|
|
( s1 = 'O' s2 = 'B' ) ( s1 = 'E' s2 = 'R' )
|
|
( s1 = 'F' s2 = 'S' ) ( s1 = 'L' s2 = 'Y' )
|
|
( s1 = 'P' s2 = 'C' ) ( s1 = 'Z' s2 = 'M' )
|
|
).
|
|
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'A' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'BARK' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'BOOK' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'TREAT' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'COMMON' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'SQUAD' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|
|
WRITE:/ COND string( WHEN word_maker=>can_make_word( word = 'CONFUSE' letter_blocks = blocks ) = abap_true THEN 'True' ELSE 'False' ).
|