-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathD08P1.abap
75 lines (63 loc) · 2.65 KB
/
D08P1.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
FUNCTION Z_FB_AOC_2024_D08_1
IMPORTING
IT_INPUT TYPE STRING_TABLE
EXPORTING
EV_RESULT TYPE INT8.
CLEAR ev_result.
TYPES: BEGIN OF ltys_vec,
x TYPE i,
y TYPE i,
END OF ltys_vec.
TYPES ltyt_unique_vec TYPE SORTED TABLE OF ltys_vec WITH UNIQUE KEY y x.
TYPES: BEGIN OF ltys_emitters,
id TYPE char1,
emitters TYPE ltyt_unique_vec,
END OF ltys_emitters.
TYPES ltyt_emitters TYPE HASHED TABLE OF ltys_emitters WITH UNIQUE KEY id.
DATA lt_emitters TYPE ltyt_emitters.
DATA lt_antinodes TYPE ltyt_unique_vec.
LOOP AT it_input ASSIGNING FIELD-SYMBOL(<fv_line>).
DATA(lv_line_index) = sy-tabix.
DO strlen( <fv_line> ) TIMES.
DATA(lv_offset) = sy-index - 1.
DATA(lv_char) = <fv_line>+lv_offset(1).
IF lv_char = '.'.
CONTINUE.
ENDIF.
ASSIGN lt_emitters[ id = lv_char ]-emitters TO FIELD-SYMBOL(<ft_emitters>).
IF <ft_emitters> IS NOT ASSIGNED.
INSERT VALUE #( id = lv_char
emitters = VALUE #( ) ) INTO TABLE lt_emitters ASSIGNING FIELD-SYMBOL(<fs_emitters_entry>).
ASSIGN <fs_emitters_entry>-emitters TO <ft_emitters>.
ENDIF.
INSERT VALUE #( x = lv_offset
y = lv_line_index ) INTO TABLE <ft_emitters>.
UNASSIGN <ft_emitters>.
ENDDO.
ENDLOOP.
LOOP AT lt_emitters ASSIGNING <fs_emitters_entry>.
LOOP AT <fs_emitters_entry>-emitters ASSIGNING FIELD-SYMBOL(<fs_emitter_1>).
LOOP AT <fs_emitters_entry>-emitters ASSIGNING FIELD-SYMBOL(<fs_emitter_2>).
IF <fs_emitter_1>-x = <fs_emitter_2>-x AND <fs_emitter_1>-y = <fs_emitter_2>-y.
CONTINUE.
ENDIF.
" Calc diff vec: v2 - v1
DATA(ls_diff) = VALUE ltys_vec( x = <fs_emitter_2>-x - <fs_emitter_1>-x
y = <fs_emitter_2>-y - <fs_emitter_1>-y ).
" 1st antinode: v2 + diff
DATA(ls_a1) = VALUE ltys_vec( x = <fs_emitter_2>-x + ls_diff-x
y = <fs_emitter_2>-y + ls_diff-y ).
" 2nd antinode: v1 - diff
DATA(ls_a2) = VALUE ltys_vec( x = <fs_emitter_1>-x - ls_diff-x
y = <fs_emitter_1>-y - ls_diff-y ).
IF ls_a1-x >= 0 AND ls_a1-x < strlen( it_input[ 1 ] ) AND ls_a1-y > 0 AND ls_a1-y <= lines( it_input ).
INSERT ls_a1 INTO TABLE lt_antinodes.
ENDIF.
IF ls_a2-x >= 0 AND ls_a2-x < strlen( it_input[ 1 ] ) AND ls_a2-y > 0 AND ls_a2-y <= lines( it_input ).
INSERT ls_a2 INTO TABLE lt_antinodes.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ev_result = lines( lt_antinodes ).
ENDFUNCTION.