-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathd8.hoon
81 lines (81 loc) · 2.25 KB
/
d8.hoon
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
76
77
78
79
80
81
|= input=(list @t)
=<
=/ height=@ud (lent input)
=/ width=@ud (lent (trip +2:input))
=/ tree-grid=(map (pair @ud @ud) @ud) (convert-input input)
=| visible-trees=(set (pair @ud @ud))
=. visible-trees (check-left tree-grid visible-trees width height)
=. visible-trees (check-right tree-grid visible-trees width height)
=. visible-trees (check-down tree-grid visible-trees width height)
=. visible-trees (check-up tree-grid visible-trees width height)
~(wyt in visible-trees)
|%
++ check-up
|= [tg=(map (pair @ud @ud) @ud) vt=(set (pair @ud @ud)) width=@ud height=@ud]
^- (set (pair @ud @ud))
=| w=@ud
=/ h=@ud (sub height 1)
|-
?: =(w width) vt
=| biggest=@ud
|-
?: =(h 0) ^$(vt (~(put in vt) [w h]), w +(w), h (sub height 1))
?: ?|(=(+(h) height) (gth (~(got by tg) [w h]) biggest))
$(vt (~(put in vt) [w h]), biggest (~(got by tg) [w h]), h (sub h 1))
$(h (sub h 1))
::
++ check-down
|= [tg=(map (pair @ud @ud) @ud) vt=(set (pair @ud @ud)) width=@ud height=@ud]
^- (set (pair @ud @ud))
=| w=@ud
=| h=@ud
|-
?: =(w width) vt
=| biggest=@ud
|-
?: =(h height) ^$(w +(w), h 0)
?: ?|(=(h 0) =(+(h) height) (gth (~(got by tg) [w h]) biggest))
$(vt (~(put in vt) [w h]), biggest (~(got by tg) [w h]), h +(h))
$(h +(h))
::
++ check-right
|= [tg=(map (pair @ud @ud) @ud) vt=(set (pair @ud @ud)) width=@ud height=@ud]
^- (set (pair @ud @ud))
=/ w=@ud (sub width 1)
=| h=@ud
|-
?: =(h height) vt
=| biggest=@ud
|-
?: =(w 0) ^$(vt (~(put in vt) [w h]), h +(h), w (sub width 1))
?: ?|(=(+(w) width) (gth (~(got by tg) [w h]) biggest))
$(vt (~(put in vt) [w h]), biggest (~(got by tg) [w h]), w (sub w 1))
$(w (sub w 1))
::
++ check-left
|= [tg=(map (pair @ud @ud) @ud) vt=(set (pair @ud @ud)) width=@ud height=@ud]
^- (set (pair @ud @ud))
=| w=@ud
=| h=@ud
|-
?: =(h height) vt
=| biggest=@ud
|-
?: =(w width) ^$(h +(h), w 0)
?: ?|(=(w 0) =(+(w) width) (gth (~(got by tg) [w h]) biggest))
$(vt (~(put in vt) [w h]), biggest (~(got by tg) [w h]), w +(w))
$(w +(w))
::
++ convert-input
|= in=(list @t)
^- (map (pair @ud @ud) @ud)
=| out=(map (pair @ud @ud) @ud)
=| w=@ud
=| h=@ud
|-
?~ in out
=/ line=tape (trip i.in)
|-
?~ line ^$(in t.in, h +(h), w 0)
$(out (~(put by out) [w h] (slav %ud i.line)), w +(w), line t.line)
--