RosettaCodeData/Task/Power-set/ABAP/power-set.abap

181 lines
4.1 KiB
ABAP
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
report z_powerset.
interface set.
methods:
add_element
importing
element_to_be_added type any
returning
value(new_set) type ref to set,
remove_element
importing
element_to_be_removed type any
returning
value(new_set) type ref to set,
contains_element
importing
element_to_be_found type any
returning
value(contains) type abap_bool,
get_size
returning
value(size) type int4,
is_equal
importing
set_to_be_compared_with type ref to set
returning
value(equal) type abap_bool,
get_elements
exporting
elements type any table,
stringify
returning
value(stringified_set) type string.
endinterface.
class string_set definition.
public section.
interfaces:
set.
methods:
constructor
importing
elements type stringtab optional,
build_powerset
returning
value(powerset) type ref to string_set.
private section.
data elements type stringtab.
endclass.
class string_set implementation.
method constructor.
loop at elements into data(element).
me->set~add_element( element ).
endloop.
endmethod.
method set~add_element.
if not line_exists( me->elements[ table_line = element_to_be_added ] ).
append element_to_be_added to me->elements.
endif.
new_set = me.
endmethod.
method set~remove_element.
if line_exists( me->elements[ table_line = element_to_be_removed ] ).
delete me->elements where table_line = element_to_be_removed.
endif.
new_set = me.
endmethod.
method set~contains_element.
contains = cond abap_bool(
when line_exists( me->elements[ table_line = element_to_be_found ] )
then abap_true
else abap_false ).
endmethod.
method set~get_size.
size = lines( me->elements ).
endmethod.
method set~is_equal.
if set_to_be_compared_with->get_size( ) ne me->set~get_size( ).
equal = abap_false.
return.
endif.
loop at me->elements into data(element).
if not set_to_be_compared_with->contains_element( element ).
equal = abap_false.
return.
endif.
endloop.
equal = abap_true.
endmethod.
method set~get_elements.
elements = me->elements.
endmethod.
method set~stringify.
stringified_set = cond string(
when me->elements is initial
then `∅`
when me->elements eq value stringtab( ( `∅` ) )
then `{ ∅ }`
else reduce string(
init result = `{ `
for element in me->elements
next result = cond string(
when element eq ``
then |{ result }∅, |
when strlen( element ) eq 1 and element ne `∅`
then |{ result }{ element }, |
else |{ result }\{{ element }\}, | ) ) ).
stringified_set = replace(
val = stringified_set
regex = `, $`
with = ` }`).
endmethod.
method build_powerset.
data(powerset_elements) = value stringtab( ( `` ) ).
loop at me->elements into data(element).
do lines( powerset_elements ) times.
if powerset_elements[ sy-index ] ne `∅`.
append |{ powerset_elements[ sy-index ] }{ element }| to powerset_elements.
else.
append element to powerset_elements.
endif.
enddo.
endloop.
powerset = new string_set( powerset_elements ).
endmethod.
endclass.
start-of-selection.
data(set1) = new string_set( ).
data(set2) = new string_set( ).
data(set3) = new string_set( ).
write: |𝑷( { set1->set~stringify( ) } ) -> { set1->build_powerset( )->set~stringify( ) }|, /.
set2->set~add_element( `∅` ).
write: |𝑷( { set2->set~stringify( ) } ) -> { set2->build_powerset( )->set~stringify( ) }|, /.
set3->set~add_element( `1` )->add_element( `2` )->add_element( `3` )->add_element( `3` )->add_element( `4`
)->add_element( `4` )->add_element( `4` ).
write: |𝑷( { set3->set~stringify( ) } ) -> { set3->build_powerset( )->set~stringify( ) }|, /.