1
1
# nix-instantiate --eval leetcode.nix | jq -r 'fromjson | .'
2
2
3
- let
3
+ let
4
4
fac = self : acc : n : if n == 0 then acc else self ( n * acc ) ( n - 1 ) ;
5
5
pow2 = n : builtins . bitAnd n ( n - 1 ) == 0 ;
6
6
remainder = a : b :
7
7
if a < b then a
8
8
else remainder ( a - b ) b ;
9
9
sumDivisors = n : builtins . foldl'
10
- ( runningsum : current :
10
+ ( runningsum : current :
11
11
if remainder n current == 0
12
- then current + runningsum
12
+ then current + runningsum
13
13
else runningsum )
14
- 0
15
- ( if n == 1 then [ ] else
16
- builtins . genList ( x : x + 1 ) ( n - 2 ) ) ;
14
+ 0
15
+ ( if n == 1 then [ ] else
16
+ builtins . genList ( x : x + 1 ) ( n - 2 ) ) ;
17
17
# https://leetcode.com/problems/perfect-number/
18
- perfectNumber = n :
18
+ perfectNumber = n :
19
19
if n < 6 then false
20
20
else sumDivisors n == n ;
21
21
fib = n :
22
22
if n == 0 then n else
23
23
if n == 1 then n else
24
- fib ( n - 1 ) + fib ( n - 2 ) ;
24
+ fib ( n - 1 ) + fib ( n - 2 ) ;
25
25
fibTCO = self : acc : n :
26
26
if n == 0 then acc else
27
27
if n == 1 then acc else
30
30
facTCO = n : tco fac 1 n ;
31
31
ftco = n : tco fibTCO 1 n ;
32
32
# https://leetcode.com/problems/take-gifts-from-the-richest-pile/
33
- sqrt = number : iterations :
34
- let
33
+ sqrt = number : iterations :
34
+ let
35
35
nextGuess = guess : ( guess + number / guess ) / 2 ;
36
- improve = guess :
36
+ improve = guess :
37
37
if iterations == 0 then guess
38
38
else improve ( nextGuess guess ) ( iterations - 1 ) ;
39
- in improve 1 iterations ;
39
+ in
40
+ improve 1 iterations ;
40
41
# https://leetcode.com/problems/two-sum/
41
- twosum = nums : target :
42
- let
43
- h = { } ;
44
- add = ( h : k : v : h // { k = v ; } ) ;
45
- get = ( h : k : h . k ) ;
46
- in
47
- ( builtins . foldl'
48
- ( acc : num :
49
- let
50
- complement = target - num ;
51
- in
52
- if builtins . length acc . ans > 0 then acc
53
- else
54
- if builtins . hasAttr ( builtins . toString complement ) h
42
+ twosum = { nums , target , debug ? false } :
43
+ let
44
+ h = { } ;
45
+ add = ( h : k : v : h // { k = v ; } ) ;
46
+ impl = ( builtins . foldl'
47
+ ( acc : num :
48
+ let
49
+ comp = target - num ;
50
+ complement = builtins . toString ( comp ) ;
51
+ exists = builtins . hasAttr complement h ;
52
+ compAddsToTarget = exists && comp + num == target ;
53
+ in
54
+ if builtins . length acc . ans > 0 then acc
55
+ else
56
+ if compAddsToTarget
55
57
then acc // {
56
- ans = [ get h complement acc . i ] ;
58
+ ans = [ h . ${ complement } acc . i ] ;
59
+ detected = true ;
57
60
}
58
61
else acc // {
59
- acc . h = add acc . h ( builtins . toString complement ) acc . i ;
62
+ h = acc . h // {
63
+ ${ complement } = acc . i ;
64
+ } ;
60
65
i = acc . i + 1 ;
66
+ nums = acc . nums ++ [ num ] ;
67
+ complements = acc . complements ++ [ complement ] ;
61
68
}
62
69
)
63
70
{
64
71
i = 0 ;
65
72
h = h ;
66
- ans = [ ] ;
67
-
73
+ ans = [ ] ;
74
+ nums = [ ] ;
75
+ complements = [ ] ;
76
+ detected = false ;
68
77
}
69
- nums ) . ans ;
70
-
78
+ nums ) ;
79
+ in
80
+ if debug then impl else impl . ans ;
71
81
# pickGifts = gifts: k:
72
82
in
73
- # using builtins.toJSON to eagerly evaluate the tests
83
+ # using builtins.toJSON to eagerly evaluate the tests
74
84
# jq then pretty prints the result
75
- builtins . toJSON {
76
- tests = [
77
- ( assert remainder 10 3 == 1 ; "remainder works" )
78
- ( assert perfectNumber 6 ; "six is perfect" )
79
- ( assert ! perfectNumber 7 ; "seven is not perfect" )
80
- ( assert pow2 33554432 ; "2^25 is a power of 2" )
81
- ( assert fib 1 == 1 ; "fib 1 is 1" )
82
- ( assert fib 2 == 1 ; "fib 2 is 1" )
83
- ( assert fib 3 == 2 ; "fib 3 is 2" )
84
- ( assert fib 4 == 3 ; "fib 4 is 3" )
85
- ( assert fib 5 == 5 ; "fib 5 is 5" )
86
- ( assert fib 6 == 8 ; "fib 6 is 8" )
87
- ( assert facTCO 15 == 1307674368000 ; "tail call optimized factorial works" )
88
- ( assert ftco 100 == 5050 ; "tail call optimized fibonacci works" )
89
- # # nums = [2,7,11,15], target = 9
90
- # (assert twosum [2 7 11 15] 9 == [0 1]; "two sum works")
91
- # # Input: nums = [3,2,4], target = 6
92
- # # Output: [1,2]
93
- # (assert twosum [3 2 4] 6 == [1 2]; "two sum works")
94
- # # Input: nums = [3,3], target = 6
95
- # # Output: [0,1]
96
- # (assert twosum [3 3] 6 == [0 1]; "two sum works")
85
+ builtins . toJSON {
86
+ twosum = twosum {
87
+ nums = [ 2 7 11 15 ] ;
88
+ target = 9 ;
89
+ debug = true ;
90
+ } ;
91
+ tests = [
92
+ ( assert remainder 10 3 == 1 ; "remainder works" )
93
+ ( assert perfectNumber 6 ; "six is perfect" )
94
+ ( assert ! perfectNumber 7 ; "seven is not perfect" )
95
+ ( assert pow2 33554432 ; "2^25 is a power of 2" )
96
+ ( assert fib 1 == 1 ; "fib 1 is 1" )
97
+ ( assert fib 2 == 1 ; "fib 2 is 1" )
98
+ ( assert fib 3 == 2 ; "fib 3 is 2" )
99
+ ( assert fib 4 == 3 ; "fib 4 is 3" )
100
+ ( assert fib 5 == 5 ; "fib 5 is 5" )
101
+ ( assert fib 6 == 8 ; "fib 6 is 8" )
102
+ ( assert facTCO 15 == 1307674368000 ; "tail call optimized factorial works" )
103
+ ( assert ftco 100 == 5050 ; "tail call optimized fibonacci works" )
104
+ # # nums = [2,7,11,15], target = 9
105
+ # (assert twosum [2 7 11 15] 9 == [0 1]; "two sum works")
106
+ # # Input: nums = [3,2,4], target = 6
107
+ # # Output: [1,2]
108
+ # (assert twosum [3 2 4] 6 == [1 2]; "two sum works")
109
+ # # Input: nums = [3,3], target = 6
110
+ # # Output: [0,1]
111
+ # (assert twosum [3 3] 6 == [0 1]; "two sum works")
97
112
98
- ] ;
99
- twosum = twosum [ 2 7 11 15 ] 9 ;
100
- }
113
+ ] ;
114
+ }
0 commit comments