Skip to content

Commit 5790120

Browse files
author
rw
committedSep 10, 2023
debug info
1 parent 3809fd6 commit 5790120

File tree

3 files changed

+78
-60
lines changed

3 files changed

+78
-60
lines changed
 

‎justfile

+3
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
test:
22
nix-instantiate --eval leetcode.nix | jq -r 'fromjson | .'
3+
4+
wtest:
5+
watch "nix-instantiate --eval leetcode.nix | jq -r 'fromjson | .'"

‎leetcode.nix

+72-58
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
# nix-instantiate --eval leetcode.nix | jq -r 'fromjson | .'
22

3-
let
3+
let
44
fac = self: acc: n: if n == 0 then acc else self (n * acc) (n - 1);
55
pow2 = n: builtins.bitAnd n (n - 1) == 0;
66
remainder = a: b:
77
if a < b then a
88
else remainder (a - b) b;
99
sumDivisors = n: builtins.foldl'
10-
(runningsum: current:
10+
(runningsum: current:
1111
if remainder n current == 0
12-
then current + runningsum
12+
then current + runningsum
1313
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));
1717
# https://leetcode.com/problems/perfect-number/
18-
perfectNumber = n:
18+
perfectNumber = n:
1919
if n < 6 then false
2020
else sumDivisors n == n;
2121
fib = n:
2222
if n == 0 then n else
2323
if n == 1 then n else
24-
fib(n - 1)+fib(n - 2);
24+
fib (n - 1) + fib (n - 2);
2525
fibTCO = self: acc: n:
2626
if n == 0 then acc else
2727
if n == 1 then acc else
@@ -30,71 +30,85 @@ let
3030
facTCO = n: tco fac 1 n;
3131
ftco = n: tco fibTCO 1 n;
3232
# https://leetcode.com/problems/take-gifts-from-the-richest-pile/
33-
sqrt = number: iterations:
34-
let
33+
sqrt = number: iterations:
34+
let
3535
nextGuess = guess: (guess + number / guess) / 2;
36-
improve = guess:
36+
improve = guess:
3737
if iterations == 0 then guess
3838
else improve (nextGuess guess) (iterations - 1);
39-
in improve 1 iterations;
39+
in
40+
improve 1 iterations;
4041
# 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
5557
then acc // {
56-
ans = [get h complement acc.i];
58+
ans = [ h.${complement} acc.i ];
59+
detected = true;
5760
}
5861
else acc // {
59-
acc.h = add acc.h (builtins.toString complement) acc.i;
62+
h = acc.h // {
63+
${complement} = acc.i;
64+
};
6065
i = acc.i + 1;
66+
nums = acc.nums ++ [ num ];
67+
complements = acc.complements ++ [ complement ];
6168
}
6269
)
6370
{
6471
i = 0;
6572
h = h;
66-
ans = [];
67-
73+
ans = [ ];
74+
nums = [ ];
75+
complements = [ ];
76+
detected = false;
6877
}
69-
nums).ans;
70-
78+
nums);
79+
in
80+
if debug then impl else impl.ans;
7181
# pickGifts = gifts: k:
7282
in
73-
# using builtins.toJSON to eagerly evaluate the tests
83+
# using builtins.toJSON to eagerly evaluate the tests
7484
# 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")
97112

98-
];
99-
twosum = twosum [2 7 11 15] 9;
100-
}
113+
];
114+
}

‎shell.nix

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
{ pkgs ? import <nixpkgs> {} }:
1+
{ pkgs ? import <nixpkgs> { } }:
22
pkgs.mkShell {
33
packages = [
44
pkgs.git
5-
pkgs.nixfmt
5+
pkgs.nixpkgs-fmt
66
pkgs.jq
77
pkgs.just
8+
pkgs.watch
89
];
910
}

0 commit comments

Comments
 (0)