Code: Alles auswählen.
DATA:
lv_laenge1 TYPE string,
lv_laenge2 TYPE string,
lv_schritt TYPE i,
lv_dump TYPE string,
start TYPE i.
PARAMETERS:
Wort1 TYPE text,
Wort2 TYPE text.
lv_laenge1 = strlen( wort1 ).
lv_laenge2 = strlen( wort2 ).
lv_schritt = start + 1.
IF lv_laenge1 = lv_laenge2.
DO lv_laenge1 TIMES.
lv_schritt = start + 1.
IF lv_schritt < lv_laenge1.
MOVE wort1+start(1) TO lv_dump.
start = start + 1.
FIND lv_dump IN wort2 IGNORING CASE.
IF sy-subrc = 0.
REPLACE lv_dump IN wort2 WITH '.'.
ELSE.
WRITE:/ 'Kein Anagramm'.
RETURN.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
WRITE:/ 'Es ist ein Anagramm.'.
ELSE.
WRITE:/ 'Eingaben müssen die gleiche Länge haben.'.
ENDIF.
Code: Alles auswählen.
DATA:
lv_laenge1 TYPE string,
lv_laenge2 TYPE string,
* lv_schritt TYPE i,
lv_dump TYPE string,
start TYPE i.
PARAMETERS:
wort1 TYPE text,
wort2 TYPE text.
lv_laenge1 = strlen( wort1 ).
lv_laenge2 = strlen( wort2 ).
*lv_schritt = start + 1.
IF lv_laenge1 = lv_laenge2.
DO lv_laenge1 TIMES.
* lv_schritt = start + 1.
* IF lv_schritt < lv_laenge1.
MOVE wort1+start(1) TO lv_dump.
start = start + 1.
FIND lv_dump IN wort2 IGNORING CASE.
IF sy-subrc = 0.
REPLACE lv_dump IN wort2 WITH '.'.
ELSE.
WRITE:/ 'Kein Anagramm'.
RETURN.
ENDIF.
* ELSE.
* EXIT.
* ENDIF.
ENDDO.
WRITE:/ 'Es ist ein Anagramm.'.
ELSE.
WRITE:/ 'Eingaben müssen die gleiche Länge haben.'.
ENDIF.
Code: Alles auswählen.
DATA:
* lv_laenge1 TYPE string,
* lv_laenge2 TYPE string,
* lv_schritt TYPE i,
* lv_dump TYPE string,
start TYPE i.
PARAMETERS:
wort1 TYPE text,
wort2 TYPE text.
*lv_laenge1 = strlen( wort1 ).
*lv_laenge2 = strlen( wort2 ).
*lv_schritt = start + 1.
IF strlen( wort1 ) = strlen( wort2 ).
DO strlen( wort1 ) TIMES.
* lv_schritt = start + 1.
* IF lv_schritt < lv_laenge1.
* MOVE wort1+start(1) TO lv_dump.
FIND wort1+start(1) IN wort2 IGNORING CASE.
IF sy-subrc EQ 0.
REPLACE wort1+start(1) IN wort2 WITH '.'.
start = start + 1.
ELSE.
WRITE:/ 'Kein Anagramm'.
RETURN.
ENDIF.
* ELSE.
* EXIT.
* ENDIF.
ENDDO.
WRITE:/ 'Es ist ein Anagramm.'.
ELSE.
WRITE:/ 'Eingaben müssen die gleiche Länge haben.'.
ENDIF.
Code: Alles auswählen.
DATA: offset TYPE i,
anagramm TYPE xfeld.
PARAMETERS: word1 TYPE text OBLIGATORY,
word2 TYPE text OBLIGATORY.
START-OF-SELECTION.
IF strlen( word1 ) NE strlen( word2 ).
WRITE: / 'kein Anagramm'.
RETURN.
ENDIF.
anagramm = abap_true.
DO strlen( word1 ) TIMES.
IF count( val = word1 sub = word1+offset(1) case = abap_false )
NE count( val = word2 sub = word1+offset(1) case = abap_false ).
anagramm = abap_false.
EXIT.
ENDIF.
offset = offset + 1.
ENDDO.
CASE anagramm.
WHEN abap_true.
WRITE: / 'Anagramm'.
WHEN OTHERS.
WRITE: / 'kein Anagramm'.
ENDCASE.
Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
Nion
Ich liebe solche Aufgaben und Rätsel ja, und da kam mir diese Frage hier und Dein Link, rob_abc, nach meinem Urlaub gerade recht, um wieder "rein" zu kommen. 😊rob_abc hat geschrieben: ↑15.02.2023 13:27Wenn du solche Codingübungen machst, dann melde mich mal auf exercism an. Dort gibt es unter anderem auch eine Aufgabe zu Anagrammen. https://exercism.org/tracks/abap/exercises/anagram
Code: Alles auswählen.
CLASS zcl_anagram DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS anagram
IMPORTING input TYPE string
candidates TYPE string_table
RETURNING VALUE(result) TYPE string_table.
PROTECTED SECTION.
TYPES sorted_characters TYPE SORTED TABLE OF c WITH NON-UNIQUE KEY table_line.
METHODS characters_of
IMPORTING string TYPE string
RETURNING VALUE(result) TYPE sorted_characters.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_anagram IMPLEMENTATION.
METHOD anagram.
DATA(input_characters) = characters_of( input ).
DATA(lowercase_input) = to_lower( input ).
LOOP AT candidates INTO DATA(candidate).
CHECK to_lower( candidate ) <> lowercase_input
AND characters_of( candidate ) = input_characters.
INSERT candidate INTO TABLE result.
ENDLOOP.
ENDMETHOD.
METHOD characters_of.
DATA(characters) = replace( val = to_lower( string ) sub = ` ` with = `` occ = 0 ).
WHILE characters IS NOT INITIAL.
INSERT characters+0(1) INTO TABLE result.
SHIFT characters.
ENDWHILE.
ENDMETHOD.
ENDCLASS.
Hoppla, so soll das natürlich nicht. Wenn ich die lv_schritt-Teile auskommentiere, hängt er sich wieder an sowas wie "Aal" und "All" auf, aber wenn ich stattPeterPaletti hat geschrieben: ↑18.02.2023 06:37Hallo Nion,
ist schon ganz gut, aber leider nur ganz gut, denn es funktioniert noch nicht sauber. Deine Variable lv_schritt und die zugehörige IF-Abfrage führt dazu, dass das letzte Zeichen nicht überpüft wird: ROSE und ROST werden als Anagramm identifiziert.
Wenn du die ganze Logik mit lv_schritt auskommentierst funktioniert es wunderbar.
Wenn du es noch hübscher machen willst, das ist aber Geschmackssache, kannst du die Felder lv_laenge1, lv_laenge2 und lv_dump streichen und durch die Ausdrücke ersetzen. Dann brauchst du nicht mal das MOVECode: Alles auswählen.
DATA: lv_laenge1 TYPE string, lv_laenge2 TYPE string, * lv_schritt TYPE i, lv_dump TYPE string, start TYPE i. PARAMETERS: wort1 TYPE text, wort2 TYPE text. lv_laenge1 = strlen( wort1 ). lv_laenge2 = strlen( wort2 ). *lv_schritt = start + 1. IF lv_laenge1 = lv_laenge2. DO lv_laenge1 TIMES. * lv_schritt = start + 1. * IF lv_schritt < lv_laenge1. MOVE wort1+start(1) TO lv_dump. start = start + 1. FIND lv_dump IN wort2 IGNORING CASE. IF sy-subrc = 0. REPLACE lv_dump IN wort2 WITH '.'. ELSE. WRITE:/ 'Kein Anagramm'. RETURN. ENDIF. * ELSE. * EXIT. * ENDIF. ENDDO. WRITE:/ 'Es ist ein Anagramm.'. ELSE. WRITE:/ 'Eingaben müssen die gleiche Länge haben.'. ENDIF.
Dann sieht es so aus:Meine Lösung mit der Funktion count( ) sieht so übrigens so aus.Code: Alles auswählen.
DATA: * lv_laenge1 TYPE string, * lv_laenge2 TYPE string, * lv_schritt TYPE i, * lv_dump TYPE string, start TYPE i. PARAMETERS: wort1 TYPE text, wort2 TYPE text. *lv_laenge1 = strlen( wort1 ). *lv_laenge2 = strlen( wort2 ). *lv_schritt = start + 1. IF strlen( wort1 ) = strlen( wort2 ). DO strlen( wort1 ) TIMES. * lv_schritt = start + 1. * IF lv_schritt < lv_laenge1. * MOVE wort1+start(1) TO lv_dump. FIND wort1+start(1) IN wort2 IGNORING CASE. IF sy-subrc EQ 0. REPLACE wort1+start(1) IN wort2 WITH '.'. start = start + 1. ELSE. WRITE:/ 'Kein Anagramm'. RETURN. ENDIF. * ELSE. * EXIT. * ENDIF. ENDDO. WRITE:/ 'Es ist ein Anagramm.'. ELSE. WRITE:/ 'Eingaben müssen die gleiche Länge haben.'. ENDIF.
Ein schönes WochenendeCode: Alles auswählen.
DATA: offset TYPE i, anagramm TYPE xfeld. PARAMETERS: word1 TYPE text OBLIGATORY, word2 TYPE text OBLIGATORY. START-OF-SELECTION. IF strlen( word1 ) NE strlen( word2 ). WRITE: / 'kein Anagramm'. RETURN. ENDIF. anagramm = abap_true. DO strlen( word1 ) TIMES. IF count( val = word1 sub = word1+offset(1) case = abap_false ) NE count( val = word2 sub = word1+offset(1) case = abap_false ). anagramm = abap_false. EXIT. ENDIF. offset = offset + 1. ENDDO. CASE anagramm. WHEN abap_true. WRITE: / 'Anagramm'. WHEN OTHERS. WRITE: / 'kein Anagramm'. ENDCASE.
Code: Alles auswählen.
DATA:
lv_laenge1 TYPE string,
lv_laenge2 TYPE string,
* lv_schritt TYPE i,
lv_dump TYPE string,
start TYPE i.
PARAMETERS:
wort1 TYPE text,
wort2 TYPE text.
lv_laenge1 = strlen( wort1 ).
lv_laenge2 = strlen( wort2 ).
*lv_schritt = start + 1.
IF lv_laenge1 = lv_laenge2.
DO lv_laenge1 TIMES.
* lv_schritt = start + 1.
* IF lv_schritt < lv_laenge1.
MOVE wort1+start(1) TO lv_dump.
start = start + 1.
FIND lv_dump IN wort2 IGNORING CASE.
IF sy-subrc = 0.
REPLACE lv_dump IN wort2 WITH '.'.
ELSE.
WRITE:/ 'Kein Anagramm'.
RETURN.
ENDIF.
* ELSE.
* EXIT.
* ENDIF.
ENDDO.
WRITE:/ 'Es ist ein Anagramm.'.
ELSE.
WRITE:/ 'Eingaben müssen die gleiche Länge haben.'.
ENDIF.
Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
Nion
Ergibt Sinn.PeterPaletti hat geschrieben: ↑20.02.2023 09:50Merkwürdig, also bei mir funktioniert dein Quellcode ohne lv_schritt auch bei Aal und All.
Du definierst doch schon durch lv_laenge1 die Anzahl der Schleifendurchläufe. lv_schritt ist ein zusätzlicher Zähler und die Abfrage IF lv_schritt <= lv_laenge1 ist bei jedem Schleifendurchlauf wahr. Der Zähler macht eigentlich nur in einer reinen DO..ENDDO Schleife Sinn.
Code: Alles auswählen.
TYPES sorted_characters TYPE SORTED TABLE OF c WITH NON-UNIQUE KEY table_line.
Code: Alles auswählen.
DATA(characters) = VALUE sorted_characters( ).
DATA(anagram) = replace( val = input sub = ` ` with = `` occ = 0 ).
WHILE anagram IS NOT INITIAL.
INSERT CONV #( anagram+0(1) ) INTO TABLE characters.
SHIFT anagram.
ENDWHILE.
Code: Alles auswählen.
TYPES sorted_characters TYPE SORTED TABLE OF c WITH NON-UNIQUE KEY table_line.
PARAMETERS:
string1 TYPE string LOWER CASE OBLIGATORY DEFAULT `Tom Marvolo Riddle`,
string2 TYPE string LOWER CASE OBLIGATORY DEFAULT `I am Lord Voldemort`.
START-OF-SELECTION.
DATA(string1_characters) = VALUE sorted_characters( ).
DATA(string2_characters) = VALUE sorted_characters( ).
PERFORM characters USING string1 CHANGING string1_characters.
PERFORM characters USING string2 CHANGING string2_characters.
WRITE: / 'Is an anagram:', COND #( WHEN string1_characters = string2_characters THEN `Yes` ELSE `No` ).
FORM characters USING string TYPE string CHANGING result TYPE sorted_characters.
DATA(characters) = replace( val = to_upper( string ) sub = ` ` with = `` occ = 0 ).
WHILE characters IS NOT INITIAL.
INSERT CONV #( characters+0(1) ) INTO TABLE result.
SHIFT characters.
ENDWHILE.
ENDFORM.