/
app.tt
56 lines (50 loc) · 1.67 KB
/
app.tt
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
composer parsePacket
<list|empty>
rule empty: (<=''>)
rule list: (<='['>) [<element>*] (<=']'>)
rule element: (<=','>?) <list|INT>
end parsePacket
def packets: [$IN::lines -> parsePacket];
def pairs: [1..$packets::length:2 -> [$packets($), $packets($+1)]];
operator (left inOrder right)
0 -> #
when <?($left <..>)?($right <´´ ..~$left>)> do 1!
when <?($left <..>)?($right <´´ $left~..>)> do -1!
when <?($left <..>)?($right <´´ =$left>)> do 0!
when <?($left <..>)?($right <[]>)> do $ -> ([$left] inOrder $right)!
when <?($left <[]>)?($right <..>)> do $ -> ($left inOrder [$right])!
when <?($left <[](1..)>)?($right <[](0)>)> do 1!
when <?($left <[](0)>)?($right <[](1..)>)> do -1!
when <?($left <[](0)>)?($right <[](0)>)> do 0!
when <?($left <[]>)?($right <[]>)> do
($left(first) inOrder $right(first)) -> \(
when <´´ =-1|=1> do $!
otherwise ($left(first~..last) inOrder $right(first~..last))!
\)!
end inOrder
source solutionPart1
$pairs -> \[i](<?(($(first) inOrder $(last)) <=-1>)> $i!\)... -> ..=Sum&{of: :()}!
end solutionPart1
templates quicksort
@: [];
$ -> #
when <[](2..)> do
def pivot: $(1);
[ [ $(2..last)... -> \(
when <?(($ inOrder $pivot) <..0>)> do
$ !
otherwise
..|@quicksort: $;
\)] -> quicksort..., $pivot, $@ -> quicksort... ] !
otherwise
$ !
end quicksort
source solutionPart2
[[[2]], [[6]], $packets...] -> quicksort -> \[i](<´[]´ =[[2]]|=[[6]]> $i!\) -> $(first) * $(last)!
end solutionPart2
'$:'part' -> SYS::property;' -> \(
when <='part1'|=''> do $solutionPart1 !
when <='part2'> do $solutionPart2 !
otherwise 'Unknown part $;' !
\) -> '$;
' -> !OUT::write