Knobelaufgabe zum Wochenende/Wochenbeginn

Alles Rund um SAP®.
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Moin allerseits,

da wir längere Zeit kein Rätsel / Knobelaufgabe mehr hatten habe ich mal wieder eins erstellt.
Kurze Regeln. Damit die Spannung ein wenig steigt bitte zunächst nur posten, ob ihr eine Lösung gefunden habt und - um den Wettbewerb ein wenig anzustacheln - wie viele Variablen/Befehle/Wörter (ohne Kommentare) eure Lösung benötigt (wobei eine kurze Lösung nicht unbedingt ein Qualitätsmerkmal sein muss ). Bitte auch die Lösung via PM an mich schicken, damit ich ein Fazit vorbereiten kann was für Lösungsansätze für verschiedene Probleme gewählt wurden.
Vorschlag wäre wie bei der letzen Knobelaufgabe eure Lösungen nach meinem finalen Fazit ( wahrscheinlich Freitag nächste Woche ) wieder bei pastebin zu veröffentlichen, damit auch andere später sehen können was für verschiedene Lösungsansätze zum Ziel führen.
____________________________________________________

Es geht diesmal um interne Tabellenverarbeitung. Gegeben ist eine gefüllte Tabelle mit drei Feldern: Name, Vorname, Geburtstag. Da die Geburtstage ein Jahr umfassen werden bei hinreichend vielen Einträgen mehrere Personen am selben Tag Geburtstag haben. Die Aufgabe ist nun folgende. Finde heraus welche Tage die drittmeisten Personen haben die an ihm Geburtstag haben. Die Eingabetabelle so soll geändert werden, dass am Ende nur noch Einträge vorhanden sind, die genau zu diesen Tagen gehören.
Beispiele mit denen die Aufgabe noch mal verdeutlicht wird und als kleine Prüfung ob euer Code das Richtige Ergebnis liefert.
Beispiel Startwert 10.000: Am 22.9. haben 44 Leute Geburtstag, am 18.12. 43 Leute, am 9.4. 42 Leute und am 7.7. 41 Leute. Somit sollte die Ausgabe alle 42 Einträge enthalten, welche am 9.4. Geburtstag haben.

Beispiel Startwert 10.002: Am 18.2. oder 14.2. haben jeweils 44 Leute Geburtstag, am 13.1. oder 20.9. jeweils 43 Leute und am 4.12. oder 3.7 jeweils 40 Leute. Der dritthäufigste Wert ist die 43 ( 2 Tage mit 44 haben mehr Geburtstage ) - aber es gibt mehrere Tage die diese Anzahl aufweisen. Somit sollte die Ausgabe alle 86 Einträge enthalten, die am 13.1. oder am 20.9. Geburtstag haben.

Startwert 10: Eingabe = Ausgabe
Startwert 1: Ausgabe = leer

Die Knobelaufgabe besteht jetzt darin eine kürzere/performantere/elegantere/ oder einfach bessere Lösung zu geben, indem der Code innerhalb der FORM-Routine DRITTMEISTE_GEBURTSTAGE durch eure Version ausgetauscht wird, so dass sich die Programmausgabe nicht ändert ( Reihenfolge der Rückgabetabelle CT_DATA ist egal, da die Rückgabetabelle vor der Ausgabe sortiert wird ).

Code: Alles auswählen.

REPORT.

TYPES: BEGIN OF ts_data,
         name     TYPE text40,
         vorname  TYPE text40,
         birthday TYPE sydatum,
       END OF ts_data,
       tt_data type STANDARD TABLE OF ts_data with NON-UNIQUE DEFAULT KEY.
DATA: gt_data TYPE tt_data.

PARAMETERS: anzahl TYPE i OBLIGATORy.

END-OF-SELECTION.

  PERFORM build_testdata.


  PERFORM drittmeiste_geburtstage CHANGING gt_data  .  " <<--  Diese Routine soll optimiert werden

  SORT gt_data.
  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<ls_data>).
    WRITE:/(40) <ls_data>-name,
           (40) <ls_data>-vorname,
                <ls_data>-birthday.
  ENDLOOP.

*&---------------------------------------------------------------------*
*& Form drittmeiste_geburtstage  " <<--  Das Coding dieser Routine soll optimiert werden
*&---------------------------------------------------------------------*
FORM drittmeiste_geburtstage CHANGING ct_data type tt_data.

  DATA: ls_data      LIKE LINE OF ct_data,
        ls_data2     LIKE LINE OF ct_data,
        lv_last_bday TYPE sydatum,
        lv_count     TYPE i,
        lv_count1    TYPE i,
        lv_count2    TYPE i,
        lv_count3    TYPE i,
        t_ergebnis   like ct_data.

* Zunächst für den drittmeisten vorkommenden Tag bestimmen
  SORT ct_data BY birthday.
  LOOP AT ct_data INTO ls_data.
* Jeden Geburtstag nur 1x probieren
    IF lv_last_bday <> ls_data-birthday.
      CLEAR lv_count.
      LOOP AT ct_data INTO ls_data2 WHERE birthday = ls_data-birthday.
        lv_count = lv_count + 1.
      ENDLOOP.
* Falls zu den ersten drei gehörend hier einsortieren
      IF lv_count > lv_count3.
        lv_count3 = lv_count.
      ENDIF.
      IF lv_count3 > lv_count2. " Ringtausch
        lv_count = lv_count2.
        lv_count2 = lv_count3.
        lv_count3 = lv_count.
      ENDIF.
      IF lv_count2 > lv_count1. " Ringtausch
        lv_count = lv_count1.
        lv_count1 = lv_count2.
        lv_count2 = lv_count.
      ENDIF.
    ENDIF.
    lv_last_bday = ls_data-birthday.
  ENDLOOP.
* in lv_count3 steht jetzt die Anzahl der 3meisten vorkommenden Geburtstage
  WRITE:/ 'Drittmeist:', lv_count3.

* jetzt alle Daten in Ausgabetabelle stellen die genau diese Anzahl haben
  clear lv_last_bday.
  LOOP AT ct_data INTO ls_data.
* Jeden Geburtstag nur 1x probieren
    IF lv_last_bday <> ls_data-birthday.
      CLEAR lv_count.
      LOOP AT ct_data INTO ls_data2 WHERE birthday = ls_data-birthday.
        lv_count = lv_count + 1.
      ENDLOOP.
* Aha - hat die richtige Anzahl --> in Ergebnistabelle sammeln
      if lv_count = lv_count3.
        loop at ct_data into ls_data2 where birthday = ls_data-birthday.
          append ls_data2 to t_ergebnis.
        endloop.
      endif.
    ENDIF.
    lv_last_bday = ls_data-birthday.
  ENDLOOP.

* Und Ergebnistabelle zurückgeben
  ct_data = t_ergebnis.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form build_testdata
*&---------------------------------------------------------------------*
FORM build_testdata .
  DATA: ls_data   LIKE LINE OF gt_data,
        lo_random TYPE REF TO cl_abap_random.
  lo_random = cl_abap_random=>create( seed = anzahl ).
  DO anzahl TIMES.
    ls_data-name = |Name_{ sy-index }|.
    ls_data-vorname = |Vorname_{ lo_random->intinrange( low = 1 high = 100 ) }|.

    ls_data-birthday = lo_random->intinrange( low = 730121 high = 730486 ).
    APPEND ls_data TO gt_data.
  ENDDO.
ENDFORM.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
qyurryusmasterhash

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

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


Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Statistiken der zu verbessernde Lösung:
Wörter : 159( mit MS-Word gezählt, alles zwischen FORM drittmeiste_geburtstage CHANGING ct_data TYPE tt_data. und ENDFORM ohne Kommentare )
Befehle : 47( MS-Word gezählt da jede Zeile ein Befehl )
Variablen: 8 ( alle explizit, keine impliziten, keine in Expressions )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von whaslbeck (ForumUser / 61 / 12 / 7 ) »
Mal sehen...
103 Wörter, 24 Zeilen, 3 Variablen, 2 Typdefinitionen, 1 Fieldsymbol

Walter

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Habe Dir meine Lösung per PN geschickt. Bin zu faul, Kommentare, Leerzeilen usw. rauszumachen, um diese Word-Statistik zu erstellen. Aber ich halte diese Word-Statistik auch nicht für aussagekräftig hinsichtlich der Qualität des Ergebnisses. Wenn ich z.B. das Ergebnis einer Tabellensuche wiederholt brauche, dann ist es ggf. kürzer, den Suchausdruck wiederholt hinzuschreiben, aber performanter, ihn einmal einem Feldsymbol zuzuweisen und damit weiterzuarbeiten. Auch kann man Wörter bei einer Tabellendeklaration einsparen, indem man einfach TYPE TABLE OF anstelle einer sortierten oder gehashten Tabellendeklaration mit ordentlichem Schlüssel schreibt, aber bei der (suchenden) Nutzung der Tabelle ist das unperformanter Pfusch.

Von daher bin ich der Meinung, dass wir uns die Lösungen inhaltlich anschauen müssen, anstatt sowas zu bewerten.

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Oops, jetzt habe ich meine Lösung an whaslbeck geschickt. Dabei ist die Aufgabe doch von black_adept... Ich schicke die Lösung gleich rum.

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
DeathAndPain hat geschrieben:
04.09.2020 14:12
[...]Von daher bin ich der Meinung, dass wir uns die Lösungen inhaltlich anschauen müssen, anstatt sowas zu bewerten.
Bin ich absolut bei dir - allerdings regt es manche Leute an zu sehen was geht. Und wenn eine Lösung mit 5 Befehlen statt den eigenen 100 daherkommt gibt das ja auch manchmal einen Hinweis, dass es wohl auch alternative Vorgehensweisen gibt. Und so lange man eben nicht weiß wie das Andere hinbekommen haben forscht man halt selber und entdeckt dabei evtl. weitere Alternativen, die man selber oder auch andere bisher nicht gesehen haben.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
black_adept hat geschrieben:
04.09.2020 11:23
Der dritthäufigste Wert ist die 43 ( 2 Tage mit 44 haben mehr Geburtstage ) - aber es gibt mehrere Tage die diese Anzahl aufweisen. Somit sollte die Ausgabe alle 86 Einträge enthalten, die am 13.1. oder am 20.9. Geburtstag haben.
Der dritthäufigste Wert ist doch 40?!

Platz 1: 44
Platz 2: 43
Platz 3: 40

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von masterhash (ForumUser / 22 / 6 / 0 ) »
Wörter 91
Zeilen 16
Befehle 16

Schönes Wochenende
Martin
Zuletzt geändert von masterhash am 09.09.2020 07:44, insgesamt 1-mal geändert.

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
ewx hat geschrieben:
04.09.2020 17:12
Der dritthäufigste Wert ist doch 40?!
Platz 1: 44
Platz 2: 43
Platz 3: 40
Genau genommen hast du recht. Aber ich hatte versucht das anders zu formulieren ohne gleich einen Lösungsvorschlag zu machen und das war dann immer so kompliziert, dass ich lieber bei dieser Version geblieben bin und versucht habe mit dem Beispiel klarzumachen was ich meine. Und die PMs die ich erhalten habe scheinen darauf hinzuweisen, dass Ottonormalprogrammier verstanden hat was ich will auch wenn es nicht korrekt ausgedrückt ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Wörter: 87
Zeilen: 18
Befehle: 6 (?)
Variablen: 2
Zuletzt geändert von ewx am 05.09.2020 20:04, insgesamt 2-mal geändert.

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Oh - hätte ich fast vergessen. Es gibt natürlich auch wieder eine Bonusaufgabe für die Obernerds.
Versuchen mit so wenigen Zeilen wie möglich auszukommen - egal was die Lesbarkeit dazu sagt wobei jeder neue Befehl auf einer neuen Zeile beginnen muss aber bei Bedarf über mehrere Zeilen gehen darf. ( Befehl = Anweisung mit abschließendem Punkt und ohne Doppelpunktsyntax )
Tipp: Wenn ihr nur glaubt das Optimum zu haben - es geht mit weniger wenn ihr auf einem recht neuen System unterwegs seid!
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Habe noch mal nachgearbeitet...
Wörter: 73
Zeilen: 7
Befehle: 4 (?)
Variablen: 1 (implizite nicht gezählt)

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
Ich bin mit meiner Lösung mit 12 Zeilen ausgekommen und dabei Wert auf Lesbarkeit und Nachvollziehbarkeit gelegt (7 Befehle).

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Zwischenstand:
Aktuell habe ich 6 Lösungsvorschläge bekommen - und die haben sich teilweise sehr voneinander unterschieden in der Art und Weise wie sie das Problem angehen. Allein das Ansehen der Verwendung einiger Befehle bzw. deren Zusätze haben mir gezeigt, dass man nie auslernt und sich ruhig noch mal mit eigentlich bekannten Befehlen von Zeit zu Zeit genauer auseinandersetzen sollte.
Und bis Freitag ( Mittag ) akzeptiere ich weitere Lösungen bis ich dann ein Fazit ziehe, die Probleme der Aufgabe mit den verschiedenen Ansätzen erkläre und dann eine aus allen Lösungen aggregierte "elegante" Lösung vorstelle von der ich hoffe, dass die Meisten davon erstaunt sein werden.
Aber da ich ja aggregieren möchte und bisher mehrfach die angesprochene elegante Lösung durch neue Erkenntnisse von Einsendungen überarbeitet habe hoffe ich auf noch ein paar Zusendungen getreu dem bekannten Sprichwort: Viele Köche ergeben einen tollen Brei.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
black_adept hat geschrieben:
09.09.2020 08:43
Viele Köche ergeben einen tollen Brei.
Oder wie wir aus der Objektorientierung gerne scherzhaft sagen:
Viele Köche vererben den Brei.
🥳 🤪

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


Vergleichbare Themen

14
Antw.
3813
Views
Knobelaufgabe zum Wochenende / Wochenbeginn
von black_adept » 23.08.2019 08:46 • Verfasst in SAP - Allgemeines
12
Antw.
979
Views
Knobelaufgabe zum Wochenende/Wochenbeginn ( Dezember 2020 )
von black_adept » 14.12.2020 15:54 • Verfasst in SAP - Allgemeines
5
Antw.
1513
Views
Knobelaufgabe zum Wochenbeginn ( Mai 2021 )
von black_adept » 11.05.2021 16:21 • Verfasst in SAP - Allgemeines
10
Antw.
2019
Views
Knobelaufgabe zum Wochenbeginn ( Juni 2021 )
von black_adept » 21.06.2021 16:29 • Verfasst in SAP - Allgemeines
2
Antw.
4073
Views

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140