@@ -5,11 +5,90 @@ const findLaziestGuards = (data) => {
5
5
return guards
6
6
}
7
7
8
+ const processActivities = ( data ) => {
9
+ // we'll store asleep as (#) and awake as (.)
10
+ const statesMap = {
11
+ 'begins shift' : '.' ,
12
+ 'wakes up' : '.' ,
13
+ 'falls asleep' : '#'
14
+ }
15
+
16
+ // store variables iterated through the loop
17
+ let store = data [ 0 ]
18
+ store . state = statesMap [ store . state ]
19
+
20
+ // let idx = 0
21
+
22
+ // Build up the results set
23
+ let results = [ {
24
+ date : store . date ,
25
+ guard : store . guard ,
26
+ activity : ''
27
+ } ]
28
+
29
+ // Iterate through events to log activities
30
+ data . forEach ( ( event , idx ) => {
31
+ // Crossed into new day
32
+ if ( event . date !== store . date ) {
33
+ // Finish out the open pattern
34
+ let prevAct = results [ results . length - 1 ] . activity
35
+ if ( prevAct . length < 60 ) {
36
+ results [ results . length - 1 ] . activity += store . state . repeat ( 60 - prevAct . length )
37
+ }
38
+
39
+ // Start a new activity pattern
40
+ // The new activity pattern should fill up to the current minute, or completely fill
41
+ // when the new event is in a later hour
42
+ let len = ( event . hour === 0 ) ? event . minute : 60
43
+ results . push ( {
44
+ date : event . date ,
45
+ guard : event . guard || store . guard ,
46
+ activity : ( len > 0 ) ? store . state . repeat ( len ) : ''
47
+ } )
48
+ }
49
+
50
+ // Event is the same day as the previous event
51
+ if ( event . date === store . date ) {
52
+ let act = results [ results . length - 1 ] . activity
53
+ // Populate the previous state up to the current minute or up to the full hour
54
+ // when it's no longer the 0 hour
55
+ let len = ( event . hour === 0 ) ? event . minute - act . length : 60 - act . length
56
+
57
+ if ( len > 0 && len < 60 ) {
58
+ results [ results . length - 1 ] . activity += store . state . repeat ( len )
59
+ }
60
+ }
61
+
62
+ // Update tracker with new event
63
+ store . state = statesMap [ event . activity ]
64
+ store . guard = event . guard || store . guard
65
+ store . date = event . date
66
+ store . hour = event . hour
67
+ store . minute = event . minute
68
+
69
+ // Mark the current event in the current activity pattern
70
+ if ( event . hour === 0 ) {
71
+ results [ results . length - 1 ] . activity += store . state
72
+ }
73
+ } )
74
+
75
+ // Finish up last entry by padding it out to the full width
76
+ results [ results . length - 1 ] . activity += store . state . repeat ( 60 - results [ results . length - 1 ] . activity . length )
77
+
78
+ console . log ( 'Resulting activity chart:' )
79
+ results . forEach ( ( res ) => {
80
+ console . log ( `${ res . date } ${ res . guard } ${ res . activity } ` )
81
+ } )
82
+
83
+ return results
84
+ }
85
+
8
86
const sortActivities = ( data ) => {
9
87
return data . sort ( helpers . dynamicSortMultiple ( 'date' , 'hour' , 'minute' ) )
10
88
}
11
89
12
90
module . exports = {
13
91
findLaziestGuards,
92
+ processActivities,
14
93
sortActivities
15
94
}
0 commit comments