Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,123 @@
CLASS {{p}}league_table DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_team TYPE c LENGTH 10.
TYPES:
BEGIN OF ty_match,
home_team TYPE ty_team,
away_team TYPE ty_team,
home_goals TYPE i,
away_goals TYPE i,
END OF ty_match.
TYPES tt_match TYPE STANDARD TABLE OF ty_match WITH EMPTY KEY.
TYPES:
BEGIN OF ty_row,
rank TYPE i,
team TYPE ty_team,
played TYPE i,
won TYPE i,
drawn TYPE i,
lost TYPE i,
goals_for TYPE i,
goals_against TYPE i,
goal_diff TYPE i,
points TYPE i,
END OF ty_row.
TYPES tt_row TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
METHODS evaluate
IMPORTING it_matches TYPE tt_match
RETURNING VALUE(rt_table) TYPE tt_row.
PRIVATE SECTION.
TYPES tt_work TYPE HASHED TABLE OF ty_row WITH UNIQUE KEY team.
METHODS is_invalid
IMPORTING is_match TYPE ty_match
RETURNING VALUE(rv_bad) TYPE abap_bool.
METHODS add_result
IMPORTING iv_team TYPE ty_team
iv_goals_for TYPE i
iv_goals_against TYPE i
CHANGING ct_work TYPE tt_work.
METHODS assign_rank
CHANGING ct_table TYPE tt_row.
ENDCLASS.
CLASS {{p}}league_table IMPLEMENTATION.
METHOD evaluate.
DATA lt_work TYPE tt_work.
LOOP AT it_matches INTO DATA(ls_match).
IF is_invalid( ls_match ) = abap_false.
add_result( EXPORTING iv_team = ls_match-home_team
iv_goals_for = ls_match-home_goals
iv_goals_against = ls_match-away_goals
CHANGING ct_work = lt_work ).
add_result( EXPORTING iv_team = ls_match-away_team
iv_goals_for = ls_match-away_goals
iv_goals_against = ls_match-home_goals
CHANGING ct_work = lt_work ).
ENDIF.
ENDLOOP.
rt_table = lt_work.
SORT rt_table BY points DESCENDING
goal_diff DESCENDING
goals_for DESCENDING
team ASCENDING.
assign_rank( CHANGING ct_table = rt_table ).
ENDMETHOD.
METHOD is_invalid.
rv_bad = xsdbool( is_match-home_team IS INITIAL
OR is_match-away_team IS INITIAL
OR is_match-home_team = is_match-away_team
OR is_match-home_goals < 0
OR is_match-away_goals < 0 ).
ENDMETHOD.
METHOD add_result.
ASSIGN ct_work[ team = iv_team ] TO FIELD-SYMBOL(<ls_row>).
IF sy-subrc <> 0.
INSERT VALUE ty_row( team = iv_team ) INTO TABLE ct_work ASSIGNING <ls_row>.
ENDIF.
<ls_row>-played = <ls_row>-played + 1.
<ls_row>-goals_for = <ls_row>-goals_for + iv_goals_for.
<ls_row>-goals_against = <ls_row>-goals_against + iv_goals_against.
<ls_row>-goal_diff = <ls_row>-goals_for - <ls_row>-goals_against.
IF iv_goals_for > iv_goals_against.
<ls_row>-won = <ls_row>-won + 1.
<ls_row>-points = <ls_row>-points + 3.
ELSEIF iv_goals_for <> iv_goals_against.
<ls_row>-drawn = <ls_row>-drawn + 1.
<ls_row>-points = <ls_row>-points + 1.
ELSE.
<ls_row>-lost = <ls_row>-lost + 1.
ENDIF.
ENDMETHOD.
METHOD assign_rank.
DATA lv_rank TYPE i.
DATA lv_position TYPE i.
DATA ls_previous TYPE ty_row.
LOOP AT ct_table ASSIGNING FIELD-SYMBOL(<ls_row>).
lv_position = lv_position + 1.
IF lv_position = 1
OR <ls_row>-points <> ls_previous-points
OR <ls_row>-goal_diff <> ls_previous-goal_diff
OR <ls_row>-goals_for <> ls_previous-goals_for.
lv_rank = lv_position.
ENDIF.
<ls_row>-rank = lv_rank.
ls_previous = <ls_row>.
ENDLOOP.
ENDMETHOD.
ENDCLASS.