Skip to content

Commit 2507e98

Browse files
Merge pull request #171 from ErikSchierboom/all-your-base
Add all-your-base exercise and deprecate existing exercises. Closes #169
2 parents 3f2893e + 6185dd7 commit 2507e98

File tree

11 files changed

+231
-152
lines changed

11 files changed

+231
-152
lines changed

config.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@
1616
"bank-account",
1717
"grains",
1818
"leap",
19-
"binary",
2019
"hamming",
21-
"trinary",
2220
"etl",
23-
"octal",
2421
"pig-latin",
2522
"word-count",
2623
"roman-numerals",
@@ -42,7 +39,6 @@
4239
"luhn",
4340
"scrabble-score",
4441
"kindergarten-garden",
45-
"hexadecimal",
4642
"queen-attack",
4743
"meetup",
4844
"binary-search-tree",
@@ -99,10 +95,14 @@
9995
"go-counting",
10096
"ledger",
10197
"variable-length-quantity",
102-
"markdown"
98+
"markdown",
99+
"all-your-base"
103100
],
104-
"deprecated": [
105-
101+
"deprecated": [
102+
"binary",
103+
"octal",
104+
"hexadecimal",
105+
"trinary"
106106
],
107107
"ignored": [
108108
"docs",
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
module AllYourBaseTest
2+
3+
open NUnit.Framework
4+
5+
open AllYourBase
6+
7+
[<Test>]
8+
let ``Single bit one to decimal`` () =
9+
let inputBase = 2
10+
let inputDigits = [1]
11+
let outputBase = 10
12+
let outputDigits = Some [1]
13+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
14+
15+
[<Test>]
16+
[<Ignore("Remove to run test")>]
17+
let ``Binary to single decimal`` () =
18+
let inputBase = 2
19+
let inputDigits = [1; 0; 1]
20+
let outputBase = 10
21+
let outputDigits = Some [5]
22+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
23+
24+
[<Test>]
25+
[<Ignore("Remove to run test")>]
26+
let ``Single decimal to binary`` () =
27+
let inputBase = 10
28+
let inputDigits = [5]
29+
let outputBase = 2
30+
let outputDigits = Some [1; 0; 1]
31+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
32+
33+
[<Test>]
34+
[<Ignore("Remove to run test")>]
35+
let ``Binary to multiple decimal`` () =
36+
let inputBase = 2
37+
let inputDigits = [1; 0; 1; 0; 1; 0]
38+
let outputBase = 10
39+
let outputDigits = Some [4; 2]
40+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
41+
42+
[<Test>]
43+
[<Ignore("Remove to run test")>]
44+
let ``Decimal to binary`` () =
45+
let inputBase = 10
46+
let inputDigits = [4; 2]
47+
let outputBase = 2
48+
let outputDigits = Some [1; 0; 1; 0; 1; 0]
49+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
50+
51+
[<Test>]
52+
[<Ignore("Remove to run test")>]
53+
let ``Trinary to hexadecimal`` () =
54+
let inputBase = 3
55+
let inputDigits = [1; 1; 2; 0]
56+
let outputBase = 16
57+
let outputDigits = Some [2; 10]
58+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
59+
60+
[<Test>]
61+
[<Ignore("Remove to run test")>]
62+
let ``Hexadecimal to trinary`` () =
63+
let inputBase = 16
64+
let inputDigits = [2; 10]
65+
let outputBase = 3
66+
let outputDigits = Some [1; 1; 2; 0]
67+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
68+
69+
[<Test>]
70+
[<Ignore("Remove to run test")>]
71+
let ``15-bit integer`` () =
72+
let inputBase = 97
73+
let inputDigits = [3; 46; 60]
74+
let outputBase = 73
75+
let outputDigits = Some [6; 10; 45]
76+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
77+
78+
[<Test>]
79+
[<Ignore("Remove to run test")>]
80+
let ``Empty list`` () =
81+
let inputBase = 2
82+
let inputDigits = []
83+
let outputBase = 10
84+
let outputDigits = None
85+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
86+
87+
[<Test>]
88+
[<Ignore("Remove to run test")>]
89+
let ``Single zero`` () =
90+
let inputBase = 10
91+
let inputDigits = [0]
92+
let outputBase = 2
93+
let outputDigits = None
94+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
95+
96+
[<Test>]
97+
[<Ignore("Remove to run test")>]
98+
let ``Multiple zeros`` () =
99+
let inputBase = 10
100+
let inputDigits = [0; 0; 0]
101+
let outputBase = 2
102+
let outputDigits = None
103+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
104+
105+
[<Test>]
106+
[<Ignore("Remove to run test")>]
107+
let ``Leading zeros`` () =
108+
let inputBase = 7
109+
let inputDigits = [0; 6; 0]
110+
let outputBase = 10
111+
let outputDigits = None
112+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
113+
114+
[<Test>]
115+
[<Ignore("Remove to run test")>]
116+
let ``Negative digit`` () =
117+
let inputBase = 2
118+
let inputDigits = [1; -1; 1; 0; 1; 0]
119+
let outputBase = 10
120+
let outputDigits = None
121+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
122+
123+
[<Test>]
124+
[<Ignore("Remove to run test")>]
125+
let ``Invalid positive digit`` () =
126+
let inputBase = 2
127+
let inputDigits = [1; 2; 1; 0; 1; 0]
128+
let outputBase = 10
129+
let outputDigits = None
130+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
131+
132+
[<Test>]
133+
[<Ignore("Remove to run test")>]
134+
let ``First base is one`` () =
135+
let inputBase = 1
136+
let inputDigits = []
137+
let outputBase = 10
138+
let outputDigits = None
139+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
140+
141+
[<Test>]
142+
[<Ignore("Remove to run test")>]
143+
let ``Second base is one`` () =
144+
let inputBase = 2
145+
let inputDigits = [1; 0; 1; 0; 1; 0]
146+
let outputBase = 1
147+
let outputDigits = None
148+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
149+
150+
[<Test>]
151+
[<Ignore("Remove to run test")>]
152+
let ``First base is zero`` () =
153+
let inputBase = 0
154+
let inputDigits = []
155+
let outputBase = 10
156+
let outputDigits = None
157+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
158+
159+
[<Test>]
160+
[<Ignore("Remove to run test")>]
161+
let ``Second base is zero`` () =
162+
let inputBase = 10
163+
let inputDigits = [7]
164+
let outputBase = 0
165+
let outputDigits = None
166+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
167+
168+
[<Test>]
169+
[<Ignore("Remove to run test")>]
170+
let ``First base is negative`` () =
171+
let inputBase = -2
172+
let inputDigits = [1]
173+
let outputBase = 10
174+
let outputDigits = None
175+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
176+
177+
[<Test>]
178+
[<Ignore("Remove to run test")>]
179+
let ``Second base is negative`` () =
180+
let inputBase = 2
181+
let inputDigits = [1]
182+
let outputBase = -7
183+
let outputDigits = None
184+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))
185+
186+
[<Test>]
187+
[<Ignore("Remove to run test")>]
188+
let ``Both bases are negative`` () =
189+
let inputBase = -2
190+
let inputDigits = [1]
191+
let outputBase = -7
192+
let outputDigits = None
193+
Assert.That(rebase inputBase inputDigits outputBase, Is.EqualTo(outputDigits))

exercises/all-your-base/Example.fs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module AllYourBase
2+
3+
let swap (a, b) = b, a
4+
5+
let divMod n d =
6+
let q = n / d
7+
let r = n % d
8+
(q, r)
9+
10+
let fromDigits fromBase digits =
11+
let folder acc x =
12+
if x < 0 || x >= fromBase || (x = 0 && acc = Some 0) then None
13+
else Option.map (fun y -> y * fromBase + x) acc
14+
15+
if List.isEmpty digits then None
16+
else List.fold folder (Some 0) digits
17+
18+
let toDigits toBase n =
19+
let unfolder x =
20+
if x = 0 then None
21+
else Some (divMod x toBase |> swap)
22+
23+
List.unfold unfolder n |> List.rev
24+
25+
let rebase inputBase inputDigits outputBase =
26+
if inputBase < 2 || outputBase < 2 then
27+
None
28+
else
29+
inputDigits
30+
|> fromDigits inputBase
31+
|> Option.map (toDigits outputBase)

exercises/binary/BinaryTests.fs

Lines changed: 0 additions & 26 deletions
This file was deleted.

exercises/binary/Example.fs

Lines changed: 0 additions & 13 deletions
This file was deleted.

exercises/hexadecimal/Example.fs

Lines changed: 0 additions & 14 deletions
This file was deleted.

exercises/hexadecimal/HexadecimalTest.fs

Lines changed: 0 additions & 22 deletions
This file was deleted.

exercises/octal/Example.fs

Lines changed: 0 additions & 10 deletions
This file was deleted.

exercises/octal/OctalTests.fs

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)