-
Notifications
You must be signed in to change notification settings - Fork 0
/
17.factor
57 lines (49 loc) · 1.84 KB
/
17.factor
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
USING: arrays assocs assocs.extras biassocs kernel math
math.vectors sequences sequences.extras sets ;
IN: 2022.17
! Pyroclastic Flow
! Tower height after 2022/1,000,000,000,000 rocks
CONSTANT: shapes {
{ { 0 0 } { 1 0 } { 2 0 } { 3 0 } }
{ { 0 1 } { 1 0 } { 1 1 } { 1 2 } { 2 1 } }
{ { 0 0 } { 1 0 } { 2 0 } { 2 1 } { 2 2 } }
{ { 0 0 } { 0 1 } { 0 2 } { 0 3 } }
{ { 0 0 } { 0 1 } { 1 0 } { 1 1 } }
}
: height ( set -- n ) members values ?supremum ?1+ ;
MACRO: ?move ( map cond -- quot: ( st fa -- st fa' ? ) )
'[ dup _ map
dup [ reach intersects? ] _ bi or
[ [ drop ] [ nip ] if ] keep not ] ;
: rock ( jet jets shape stopped -- jet' jets shape' stopped' )
2dup [ shapes nth ]
[ height 3 + '[ { 2 _ } v+ ] map ] bi*
[ 1 + 5 mod ] 2dip [
[ 2dup nth ] 3dip roll CHAR: < = [
[ { 1 0 } v- ] [ keys infimum 0 < ] ?move drop
] [
[ { 1 0 } v+ ] [ keys supremum 6 > ] ?move drop
] if [ [ 1 + ] dip [ length mod ] keep ] 3dip
[ { 0 1 } v- ] [ values infimum -1 = ] ?move
] loop union! ;
: part-1 ( jets -- n )
0 swap 0 HS{ } clone 2022 [ rock ] times 3nip height ;
: relative-heights ( set -- seq )
members 7 <iota> [
'[ _ = ] filter-keys values ?supremum
] with map dup ?infimum '[
_ 2dup [ not ] either? [ and ] [ - ] if
] map ;
:: part-2 ( jets -- n )
<bihash> 0 0 0 HS{ } clone :> ( cache n! jet shape stopped )
jet jets shape stopped [
rock n 1 + n! reach pick :> ( jet shape )
n stopped [ height 2array ]
[ relative-heights ] bi jet shape 3array
cache 2dup at dup
] [
[ 3drop ] [ set-at ] if
] until :> ( v' k cache v ) 4drop
v first v' v v- first2 :> ( n dn dh )
1,000,000,000,000 n -
[ dn /i dh * ] [ dn mod n + cache values at ] bi + ;