Rätsel mit Strukturierten Typen

Feedback, Wünsche, Anregungen
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Nach langer Zeit mal wieder ein Rätsel um die grauen Zellen des ABAP-Entwicklers ein wenig in Schwung zu bringen.

Gegeben sei eine FORM-Routine, die via WRITE eine kurze Ausgabe auf den Bildschirm bringt. Dieser Form können alle möglichen Strukturen übergeben werden.
Das Rätsel ist nun recht kurz formuliert.
Wie viele verschiedene Ausgaben sind durch geschickt gewählte Übergabestrukturen möglich?

Hier erstmal das Coding inkl. einer Triviallösung --> Es gibt also mindestens 2 Verschiedene Lösungen.

Code: Alles auswählen.

REPORT.

data: gv_counter type i.

DATA: BEGIN OF trivial_solution,
        field_one    TYPE string,
        field_two    TYPE string,
      END OF trivial_solution.


START-OF-SELECTION.
  PERFORM mystery USING syst.               " --> fields missing
  PERFORM mystery USING trivial_solution.   " --> AB


*&---------------------------------------------------------------------*
*&      Form  mystery
*&---------------------------------------------------------------------*
FORM mystery USING is_input TYPE any.
  FIELD-SYMBOLS: <field_one>   TYPE ANY,
                 <field_two>   TYPE ANY.
  DATA:          c1     TYPE string,
                 c2     TYPE string,
                 result TYPE string,
                 len    TYPE i.

  add 1 to gv_counter.
  write:/(4) gv_counter,':'.


  ASSIGN COMPONENT 'FIELD_ONE' OF STRUCTURE is_input TO <field_one>.
  ASSIGN COMPONENT 'FIELD_TWO' OF STRUCTURE is_input TO <field_two>.
  IF <field_one> IS NOT ASSIGNED OR <field_two> IS NOT ASSIGNED.
    WRITE: 'fields missing'.
  ELSE.
    <field_one> = 'A'.
    <field_two> = 'B'.
    c1 = <field_one>.
    c2 = <field_two>.
    CONCATENATE c1 c2 INTO result.
    len = STRLEN( result ).
    IF len > 4.
      WRITE: result(4).
    ELSE.
      WRITE: result.
    ENDIF.
  ENDIF.


ENDFORM.                    "mystery
Wer mehr als diese 2 Lösungen hat bitte hier nur die Anzahl der Lösungen posten (und mir evtl. als PM zukommen lassen ) um die anderen anzuspornen.

Bedingungen: Eine Lösung muss hier gepostet werden können und alleine lauffähig sein.
Es darf nicht von außen in die natürliche Verarbeitung der mystery-Routine eingegriffen werden. ( Callback-routinen, Debugger-Änderungen oder Sprünge etc )

Ganz besonders perfide Lösungen ( Im Debugger Single-Step gibt es eine andere Ausgabe als im normalen Programmablauf, Frank schafft es die Konstanten zu verändern, etc ) sind durchaus erlaubt. Aber ich habe keine in petto - also müsst ihr (bisher) nicht groß danach suchen.

Einsendeschluss: Mittwoch Nacht - am Donnerstag poste ich dann die Lösungen die mir bis dahin bekannt gemacht wurden.
Zuletzt geändert von black_adept am 16.11.2012 20:28, insgesamt 1-mal geändert.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Und zum Anspornen die Lösungen, die mir bisher so eingefallen sind. Das Bild gibt ja vielleicht schon einen Hinweis auf meinen Ansatz.
Rätsel Abapforum ohne Servernamen.gif
Jetzt bin ich mal gespannt was noch so kommt.

Edit: Bild ausgetauscht gegen Version ohne Servernamen
Zuletzt geändert von black_adept am 19.11.2012 20:14, insgesamt 1-mal geändert.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von a-dead-trousers (Top Expert / 4402 / 224 / 1183 ) »
Hi!

Damit sind so ziemlich alle Ausgaben möglich:

Code: Alles auswählen.

FORM mystery USING us_data TYPE any.

  DATA:
    lr_value            TYPE REF TO data,
    ls_dfies            TYPE dfies,
    ld_name             TYPE fieldname,
    ld_convert          TYPE funcname,
    ld_timezone         TYPE timezone,
    ld_date             TYPE d,
    ld_time             TYPE t,
    lr_elemdescr        TYPE REF TO cl_abap_elemdescr,
    lr_typedescr        TYPE REF TO cl_abap_typedescr,
    lr_structdescr      TYPE REF TO cl_abap_structdescr.

  FIELD-SYMBOLS:
    <ls_component>      TYPE abap_compdescr,
    <lt_table>          TYPE ANY TABLE,
    <la_data>           TYPE any,
    <la_value>          TYPE any,
    <la_line>           TYPE any.

  ASSIGN us_data TO <la_data>.
  lr_typedescr = cl_abap_typedescr=>describe_by_data( us_data ).
* Referenzen auflösen
  WHILE lr_typedescr IS BOUND AND lr_typedescr->kind EQ cl_abap_typedescr=>kind_ref.
    ASSIGN <la_data>->* TO <la_data>.
    lr_typedescr = cl_abap_typedescr=>describe_by_data( us_data ).
  ENDWHILE.

  IF lr_typedescr IS NOT BOUND.
    RETURN.
  ENDIF.

  CASE lr_typedescr->kind.
    WHEN cl_abap_typedescr=>kind_table.
      ASSIGN <la_data> TO <lt_table>.
      LOOP AT <lt_table> ASSIGNING <la_line>.
        NEW-LINE.
        PERFORM mystery USING <la_line>.
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_struct.
      lr_structdescr ?= lr_typedescr.
      LOOP AT lr_structdescr->components ASSIGNING <ls_component>.
        ASSIGN COMPONENT <ls_component>-name OF STRUCTURE <la_data> TO <la_value>.
        PERFORM mystery USING <la_value>.
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_intf OR cl_abap_typedescr=>kind_class.
* Hier vielleicht die Public-Attribue auslesen und ausgeben (ist mir aber jetzt zu aufwändig)
    WHEN cl_abap_typedescr=>kind_elem.
      lr_elemdescr ?= lr_typedescr.
      ld_name = lr_elemdescr->get_relative_name( ).
      CLEAR ls_dfies.
      IF ld_name IS NOT INITIAL.
        CALL FUNCTION 'DDIF_FIELDINFO_GET'
          EXPORTING
            tabname        = ld_name
            ALL_TYPES      = abap_true
          IMPORTING
            dfies_wa       = ls_dfies
          EXCEPTIONS
            not_found      = 1
            internal_error = 2
            OTHERS         = 3.
      ENDIF.

      IF ls_dfies-convexit IS NOT INITIAL AND ls_dfies-outputlen IS NOT INITIAL.
        CREATE DATA lr_value TYPE c LENGTH ls_dfies-outputlen.
        ASSIGN lr_value->* TO <la_value>.
        <la_value> = <la_data>.

        CONCATENATE 'CONVERSION_EXIT_' ls_dfies-convexit '_OUTPUT' INTO ld_convert.
        TRANSLATE ld_convert TO UPPER CASE.               "#EC SYNTCHAR
        CONDENSE ld_convert NO-GAPS.

        TRY.
            CALL FUNCTION ld_convert
              EXPORTING
                input  = <la_data>
              IMPORTING
                output = <la_value>.
          CATCH cx_root.                                "#EC NO_HANDLER
* Alle Fehler der Konvertierung abfangen
        ENDTRY.

        WRITE <la_value>.
      ELSE.
        CASE ls_dfies-tabname.
          WHEN 'TIMESTAMPL' OR 'TIMESTAMP'.
            ld_timezone = 'UTC'.
            WRITE <la_data> TIME ZONE ld_timezone.
          WHEN OTHERS.
            CASE lr_elemdescr->type_kind.
              WHEN cl_abap_typedescr=>typekind_date OR cl_abap_typedescr=>typekind_time.
                WRITE <la_data>.
              WHEN cl_abap_typedescr=>typekind_packed OR cl_abap_typedescr=>typekind_decfloat
                OR cl_abap_typedescr=>typekind_decfloat16 OR cl_abap_typedescr=>typekind_decfloat34
                OR cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_int
                OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2
                OR cl_abap_typedescr=>typekind_num OR cl_abap_typedescr=>typekind_numeric.
                WRITE <la_data> EXPONENT 0 RIGHT-JUSTIFIED.
              WHEN cl_abap_typedescr=>typekind_hex OR cl_abap_typedescr=>typekind_xstring
                OR cl_abap_typedescr=>typekind_xsequence.
                WRITE <la_data>. "Vielleicht noch eine spezielle Aufbereitung für Binärdaten
              WHEN OTHERS.
                FIND REGEX '@[0-9A-Z]{2}(\\Q[^@])?@.*' IN <la_data>.
                IF sy-subrc EQ 0.
                  WRITE <la_data> AS ICON.
                ELSE.
                  WRITE <la_data>.
                ENDIF.
            ENDCASE.
        ENDCASE.
      ENDIF.
  ENDCASE.
ENDFORM.                    "mystery
Wenn die RTTI-Klassen nicht vorhandne sind, kann man das ganze auch via DESCRIBE FIELD lösen.

lg ADT

EDIT: Die Regex für die Ikonenerkennung sollte eigentlich '@[0-9A-Z]{2}(\\Q[^@])?@.*' lauten. Sollte es Regex nicht geben, kann man sich mit mit CP '@*@*' behelfen, wobei das nicht ganz so treffsicher ist.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Hmm -mir scheint ich habe die Aufgabenstellung nicht klar genug definiert.

Es soll die in der Beispiellösung vorgegebene Form "MYSTERY" aufgerufen werden. Diese Form soll auch nicht verändet werden sondern einfach so hingenommen werden wie sie ist.
Ich schreib sie sicherheitshalber noch mal auf - das hier ist die MYSTERY-FORM die aufgerufen werden soll.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*&      Form  mystery
*&---------------------------------------------------------------------*
FORM mystery USING is_input TYPE any.
  FIELD-SYMBOLS: <field_one>   TYPE ANY,
                 <field_two>   TYPE ANY.
  DATA:          c1     TYPE string,
                 c2     TYPE string,
                 result TYPE string,
                 len    TYPE i.

  ADD 1 TO gv_counter.
  WRITE:/(4) gv_counter,':'.


  ASSIGN COMPONENT 'FIELD_ONE' OF STRUCTURE is_input TO <field_one>.
  ASSIGN COMPONENT 'FIELD_TWO' OF STRUCTURE is_input TO <field_two>.
  IF <field_one> IS NOT ASSIGNED OR <field_two> IS NOT ASSIGNED.
    WRITE: 'fields missing'.
  ELSE.
    <field_one> = 'A'.
    <field_two> = 'B'.
    c1 = <field_one>.
    c2 = <field_two>.
    CONCATENATE c1 c2 INTO result.
    len = STRLEN( result ).
    IF len > 4.
      WRITE: result(4).
    ELSE.
      WRITE: result.
    ENDIF.
  ENDIF.


ENDFORM.                    "mystery
Das Problem ist die Eingabestrukturen in diese Form so geschickt zu wählen, dass verschiedene Ausgaben erzeugt werden.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von a-dead-trousers (Top Expert / 4402 / 224 / 1183 ) »
okay, dann versteh ich die Aufgabenstellung wirklich nicht. :?
Was soll es denn bringen, die Mystery-Form mit unterschiedlichen Eingabestrukturen aufzurufen?
Vorallem da die übergebenen Parameter in FIELD_ONE und FIELD_TWO innerhalb der Form mit A bzw B überschrieben werden.
Damit fallen Zahlen-, Datums- oder Zeitfelder schon mal flach.
Außerdem reagiert die Mystery-Form nicht auf den Typ der Felder sondern stopft alles willkürlich in einen String ohne respecting blanks.
Also ist auch nix mit Right-Justified und Einstellungen über den DDIC-Typ usw.

Wenn du statt den Zuweisungen ein WRITE verwenden würdest, könnte man ja noch mit den ganzen Formatierungsoptionen aus dem Dictionary punkten.
Aber so...

Aus der Vorgabe das nur 'A' und 'B' zugelassen sind, kann man im Endeffekt ja nur mit Hex und Char Werten variieren.
Evtl. auf einem NICHT Unicode-System noch mit INT1 (habs jetzt nicht ausprobiert müsste aber theoretisch klappen).
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Hihi - DAS ist ja genau der Haken an der Sache. Welche Ausgaben kann man erzwingen?
Du hast ja schon einen Tipp gegeben was machbar ist - z.B. die Ausgabe A0B0 sollte mit deinen Hinweisen schon machbar sein und mit ein wenig Variation sollten da noch ein paar andere Resultate der Länge 3 oder 4 abfallen.
Aber ich will dich mal ein wenig neugierig machen - wie du an dem verpixelten Screenshot evtl. schon ablesen kannst gibt es eine Lösung der Länge 2, die nicht AB ist . Und DAS ist schon etwas schwieriger *lach*
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von ewx (Top Expert / 4851 / 313 / 642 ) »
9
/edit: 10
11
oh. Hatte den 2. Fall gar nicht.
12

Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Nachdem ewx sich ein paar Lösungen durch psychologisches Profiling ergaunert hat, hier noch ein paar Hinweise.

1.) Ich habe nichttriviale Lösungen gesehen der Länge 4,3,2,1.
2.) Ich habe nichttriviale Lösungen gesehen mit anderen Buchstaben als A oder B ( ich habe bisher 4 verschiedene Characters gesehen )
3a.) Ich habe nichttriviale Lösungen gesehen ohne A
3b.) Ich habe nichttriviale Lösungen gesehen ohne B
4.) Ich habe nichttriviale Lösungen gesehen in denen A oder B mehrfach vorkommt ( ich verrate aber nicht welchen der beiden Buchstaben ich mehrfach gesehen habe )

5.) Für Spezialisten: Auf non-Unicodesystemen gibt es Lösungen mit weiteren Buchstaben in 2.) wenn man Unicode-checks in den Programmattributen ausschaltet.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von ewx (Top Expert / 4851 / 313 / 642 ) »
black_adept hat geschrieben:Nachdem ewx sich ein paar Lösungen durch psychologisches Profiling ergaunert hat, hier noch ein paar Hinweise.
Einspruch eure Eiligkeit!
Die durch psychologisch fundierte Rückschlüsse ergaunerten Lösungen tauchten nicht in meiner Lösungszahl auf!

Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Teaser kurz vor Einsendeschluss:

a) Andere Zeichen als A oder B: Eine geschickte Wahl des Komponententyps oder -länge der Komponenten FIELD_ONE oder FIELD_TWO kann die Ausgabe beeinflussen. Nicht alle Typen sind möglich sondern erzeugen einen Dump. Aber es gibt noch andere Typen als "string" die eine Ausgabe ermöglichen.

b) Mehrfach auftauchende Zeichen Bisher war es mir nur möglich den Buchstaben "B" mehrfach in der Ausgabe auftauchen zu lassen ( Ausgabe "ABB" wäre z.B. ein Kandidat ). Da das Resultat durch einfaches Verketten zweier Variablen, die vorher auf einen definierten Wert gesetzt wurden, erzeugt wird, muss es wohl so sein, dass die beiden Felder trotz unterschiedlichen Namens teilweise auf einen gemeinsam benutzten Speicherbereich zugreifen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Die Lösungen kommen etwas später als angekündigt - aber irgendwie musste noch ein anderes Projekt vorher bedient werden.


Zunächst zur Aufgabenstellung. Diese hörte sich ja irgendwie sinnlos an, da eine Struktur mit 2 Feldern übergeben werden musste, die Felder wurden auf bekannte Werte initialisiert, in Strings überführt, concateniert und auf Länge 4 begrenzt.
Beim allerersten Draufschauen ergeben sich dann ja auch nur die beiden schon geposteten trivialen Lösungen
1) "fields missing", falls nicht beide Felder vorhanden sind
2) "AB", falls üblich definiert wurde.

Die erste Möglichkeit etwas anderes zu machen besteht darin, statt einfache CHAR-Variablen solche zu nehmen, denen man so etwas wie "A" oder "B" zuweisen kann ohne dass es dumpt, die aber beim Zuweisen zu einem String eine andere Ausgabe erzeugen.
Mir ist da nur ein X-Feld eingefallen, woraus sich dann die nächsten drei Lösungen ergeben
3) "A0B" - Field_one ist vom Typ X, Field_two vom Typ Char
4) "AB0" - Field_one ist vom Typ Char, Field_two vom Typ X
5) "A0B0" - Beide Felder vom Typ X


Der nächste Trick der mir eingefallen ist war die Länge der Felder zu variieren. Da beim Concatenate abschließende Blanks ignoriert werden, ist diese Methode nur bei der X-Variante zu gebrauchen und führt zu
6) "A000" - Field_one ist vom Typ X der Länge 2 oder mehr, Field_two ist egal
7) "AB00" - Field_one ist vom Typ Char, Field_two vom Typ X der Länge 2 oder mehr

Eine ganz andere Art von Lösungen basiert darauf, dass nirgends gefordert wurde, dass die beiden Felder keine Strukturen sein dürfen und dass sie überschneidungsfrei zu sein haben. Hier ist auch die ursprüngliche Idee zu diesem Rätsel geboren - beim Programmieren im FI-Bereich war es sehr schön auf gewisse Variablenbereicht mit "Tabelle-Juni" zugreifen zu können, wobei Juni genaugenommen 3 Felder waren, die ich sonst mittels Tabelle-FeldA06, Tabelle-FeldB06 und Tabelle-FeldC06 hätte ansprechen müssen.
Dass 2 Felder nicht überschneidungsfrei sein müssen zeigt folgender Ansatz

Der einfachste Fall hiervon wäre, wenn

Code: Alles auswählen.

types: begin of gty_1,
         field_one type char1,
       end of gty_1.
data: begin of special5.
         include type gty_1 as field_two.
data: end of special5.
In diesem Fall sind field_one und field_two identisch woraus sich dann
8) "BB" ergibt

und mit einem Füllfeld

Code: Alles auswählen.

types: begin of gty_1,
         dummy     type char1,
         field_one type char1,
       end of gty_1.
data: begin of special5.
         include type gty_1 as field_two.
data: end of special5.
9)"B"

Umgekehrt kann man auch field_two inkludieren und als field_one ansprechen. Das führt dann zu weiteren Lösungen
types: begin of gty_3,
* dummy type char1, " --> ABB |
* dummy type char2, " --> A BB|
* dummy type char3, " --> A B|B
dummy type char4, " --> A |BB
field_two type char1,
end of gty_3.
data: begin of special7.
include type gty_3 as field_one.
data: end of special7.
10)"ABB"
11)"A BB"
12)"A B"
13)"A"


Der Versuch des Mischens von überlagerten Strukturen und alternativen Typdeklarationen scheitert in Unicodesystemen, da einer Struktur mit X-Feldern kein String zugewiesen werden kann. Aber wenn man wie schon vorher gepostet die Unicodeprüfungen abschaltet, ergeben sich noch diverse zusätzliche Lösungen, bei deinen dann auch "20" (ASCII von Leerzeichen" und "42" (ASCII von A) als Teile der Ausgabe auftauchen.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ewx

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Rätsel mit Strukturierten Typen

Beitrag von ewx (Top Expert / 4851 / 313 / 642 ) »
Das ist schon echt ein lustiges Phänomen...! Danke!

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Von der XSD zum XML
vor 7 Stunden von ralf.wenzel 8 / 4042
XML gegen XSD validieren
vor 10 Stunden von IHe 10 / 643
Daten an Tabelle binden
vor 2 Tagen von Bright4.5 5 / 3723

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Von der XSD zum XML
vor 7 Stunden von ralf.wenzel 8 / 4042
XML gegen XSD validieren
vor 10 Stunden von IHe 10 / 643
Daten an Tabelle binden
vor 2 Tagen von Bright4.5 5 / 3723

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor einer Woche von snooga87 1 / 2234
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 5446