Skip to content

Commit ddc5c5b

Browse files
robkeimErikSchierboom
authored andcommitted
[WIP] Add complex numbers exercise - Part I (#378)
* Add complex numbers exercise - Part I * Update exercise to use ComplexNumber class * Change to class with instance methods * Fix build error after merge * Add exercise to solution * Convert to double * Fix processing doubles * Add generation for Exp function * Add implementation for exponents * Keep math symbols in exercises * Add custom assert for comparing the complex number class * Re-order methods to reflect implementation change
1 parent 080952f commit ddc5c5b

8 files changed

Lines changed: 669 additions & 107 deletions

File tree

config.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,17 @@
995995
"Algorithms"
996996
]
997997
},
998+
{
999+
"uuid": "0ed2de0f-70da-4f04-834e-01bfb0aa48d3",
1000+
"slug": "complex-numbers",
1001+
"core": false,
1002+
"unlocked_by": "leap",
1003+
"difficulty": 6,
1004+
"topics": [
1005+
"Tuples",
1006+
"Mathematics"
1007+
]
1008+
},
9981009
{
9991010
"uuid": "d03a9508-336a-4425-8f47-f04317d1ba15",
10001011
"slug": "poker",

exercises/Exercises.All.sln

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Microsoft Visual Studio Solution File, Format Version 12.00
22
# Visual Studio 15
3-
VisualStudioVersion = 15.0.26228.4
3+
VisualStudioVersion = 15.0.26403.7
44
MinimumVisualStudioVersion = 15.0.26124.0
55
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accumulate", "accumulate\Accumulate.csproj", "{F16C0EE1-6923-4328-B015-363CF24FF867}"
66
EndProject
@@ -218,6 +218,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpiralMatrix", "spiral-matr
218218
EndProject
219219
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CollatzConjecture", "collatz-conjecture\CollatzConjecture.csproj", "{18BC2EE7-E798-40DE-A346-0B803137E67D}"
220220
EndProject
221+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ComplexNumbers", "complex-numbers\ComplexNumbers.csproj", "{D0399EAC-5563-4234-9828-0C607BAF7623}"
222+
EndProject
221223
Global
222224
GlobalSection(SolutionConfigurationPlatforms) = preSolution
223225
Debug|Any CPU = Debug|Any CPU
@@ -1524,6 +1526,18 @@ Global
15241526
{18BC2EE7-E798-40DE-A346-0B803137E67D}.Release|x64.Build.0 = Release|Any CPU
15251527
{18BC2EE7-E798-40DE-A346-0B803137E67D}.Release|x86.ActiveCfg = Release|Any CPU
15261528
{18BC2EE7-E798-40DE-A346-0B803137E67D}.Release|x86.Build.0 = Release|Any CPU
1529+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1530+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|Any CPU.Build.0 = Debug|Any CPU
1531+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|x64.ActiveCfg = Debug|Any CPU
1532+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|x64.Build.0 = Debug|Any CPU
1533+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|x86.ActiveCfg = Debug|Any CPU
1534+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Debug|x86.Build.0 = Debug|Any CPU
1535+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|Any CPU.ActiveCfg = Release|Any CPU
1536+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|Any CPU.Build.0 = Release|Any CPU
1537+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|x64.ActiveCfg = Release|Any CPU
1538+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|x64.Build.0 = Release|Any CPU
1539+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|x86.ActiveCfg = Release|Any CPU
1540+
{D0399EAC-5563-4234-9828-0C607BAF7623}.Release|x86.Build.0 = Release|Any CPU
15271541
EndGlobalSection
15281542
GlobalSection(SolutionProperties) = preSolution
15291543
HideSolutionNode = FALSE

exercises/Exercises.Default.sln

Lines changed: 120 additions & 106 deletions
Large diffs are not rendered by default.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
3+
public struct ComplexNumber
4+
{
5+
public ComplexNumber(double real, double imaginary)
6+
{
7+
}
8+
9+
public double Real()
10+
{
11+
throw new NotImplementedException("You need to implement this function.");
12+
}
13+
14+
public double Imaginary()
15+
{
16+
throw new NotImplementedException("You need to implement this function.");
17+
}
18+
19+
public ComplexNumber Mul(ComplexNumber other)
20+
{
21+
throw new NotImplementedException("You need to implement this function.");
22+
}
23+
24+
public ComplexNumber Add(ComplexNumber other)
25+
{
26+
throw new NotImplementedException("You need to implement this function.");
27+
}
28+
29+
public ComplexNumber Sub(ComplexNumber other)
30+
{
31+
throw new NotImplementedException("You need to implement this function.");
32+
}
33+
34+
public ComplexNumber Div(ComplexNumber other)
35+
{
36+
throw new NotImplementedException("You need to implement this function.");
37+
}
38+
39+
public double Abs()
40+
{
41+
throw new NotImplementedException("You need to implement this function.");
42+
}
43+
44+
public ComplexNumber Conjugate()
45+
{
46+
throw new NotImplementedException("You need to implement this function.");
47+
}
48+
49+
public ComplexNumber Exp()
50+
{
51+
throw new NotImplementedException("You need to implement this function.");
52+
}
53+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp1.0</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<Compile Remove="Example.cs" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
14+
<PackageReference Include="xunit" Version="2.2.0" />
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
16+
</ItemGroup>
17+
18+
</Project>
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
// This file was auto-generated based on version 1.0.0 of the canonical data.
2+
3+
using Xunit;
4+
using System;
5+
6+
public class ComplexNumbersTest
7+
{
8+
[Fact]
9+
public void Real_part_of_a_purely_real_number()
10+
{
11+
var sut = new ComplexNumber(1, 0);
12+
Assert.Equal(1, sut.Real());
13+
}
14+
15+
[Fact(Skip = "Remove to run test")]
16+
public void Real_part_of_a_purely_imaginary_number()
17+
{
18+
var sut = new ComplexNumber(0, 1);
19+
Assert.Equal(0, sut.Real());
20+
}
21+
22+
[Fact(Skip = "Remove to run test")]
23+
public void Real_part_of_a_number_with_real_and_imaginary_part()
24+
{
25+
var sut = new ComplexNumber(1, 2);
26+
Assert.Equal(1, sut.Real());
27+
}
28+
29+
[Fact(Skip = "Remove to run test")]
30+
public void Imaginary_part_of_a_purely_real_number()
31+
{
32+
var sut = new ComplexNumber(1, 0);
33+
Assert.Equal(0, sut.Imaginary());
34+
}
35+
36+
[Fact(Skip = "Remove to run test")]
37+
public void Imaginary_part_of_a_purely_imaginary_number()
38+
{
39+
var sut = new ComplexNumber(0, 1);
40+
Assert.Equal(1, sut.Imaginary());
41+
}
42+
43+
[Fact(Skip = "Remove to run test")]
44+
public void Imaginary_part_of_a_number_with_real_and_imaginary_part()
45+
{
46+
var sut = new ComplexNumber(1, 2);
47+
Assert.Equal(2, sut.Imaginary());
48+
}
49+
50+
[Fact(Skip = "Remove to run test")]
51+
public void Imaginary_unit()
52+
{
53+
var sut = new ComplexNumber(0, 1);
54+
var expected = new ComplexNumber(-1, 0);
55+
Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 1)).Real(), 15);
56+
Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 1)).Imaginary(), 15);
57+
}
58+
59+
[Fact(Skip = "Remove to run test")]
60+
public void Add_purely_real_numbers()
61+
{
62+
var sut = new ComplexNumber(1, 0);
63+
var expected = new ComplexNumber(3, 0);
64+
Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(2, 0)).Real(), 15);
65+
Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(2, 0)).Imaginary(), 15);
66+
}
67+
68+
[Fact(Skip = "Remove to run test")]
69+
public void Add_purely_imaginary_numbers()
70+
{
71+
var sut = new ComplexNumber(0, 1);
72+
var expected = new ComplexNumber(0, 3);
73+
Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(0, 2)).Real(), 15);
74+
Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(0, 2)).Imaginary(), 15);
75+
}
76+
77+
[Fact(Skip = "Remove to run test")]
78+
public void Add_numbers_with_real_and_imaginary_part()
79+
{
80+
var sut = new ComplexNumber(1, 2);
81+
var expected = new ComplexNumber(4, 6);
82+
Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(3, 4)).Real(), 15);
83+
Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(3, 4)).Imaginary(), 15);
84+
}
85+
86+
[Fact(Skip = "Remove to run test")]
87+
public void Subtract_purely_real_numbers()
88+
{
89+
var sut = new ComplexNumber(1, 0);
90+
var expected = new ComplexNumber(-1, 0);
91+
Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(2, 0)).Real(), 15);
92+
Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(2, 0)).Imaginary(), 15);
93+
}
94+
95+
[Fact(Skip = "Remove to run test")]
96+
public void Subtract_purely_imaginary_numbers()
97+
{
98+
var sut = new ComplexNumber(0, 1);
99+
var expected = new ComplexNumber(0, -1);
100+
Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(0, 2)).Real(), 15);
101+
Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(0, 2)).Imaginary(), 15);
102+
}
103+
104+
[Fact(Skip = "Remove to run test")]
105+
public void Subtract_numbers_with_real_and_imaginary_part()
106+
{
107+
var sut = new ComplexNumber(1, 2);
108+
var expected = new ComplexNumber(-2, -2);
109+
Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(3, 4)).Real(), 15);
110+
Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(3, 4)).Imaginary(), 15);
111+
}
112+
113+
[Fact(Skip = "Remove to run test")]
114+
public void Multiply_purely_real_numbers()
115+
{
116+
var sut = new ComplexNumber(1, 0);
117+
var expected = new ComplexNumber(2, 0);
118+
Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(2, 0)).Real(), 15);
119+
Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(2, 0)).Imaginary(), 15);
120+
}
121+
122+
[Fact(Skip = "Remove to run test")]
123+
public void Multiply_purely_imaginary_numbers()
124+
{
125+
var sut = new ComplexNumber(0, 1);
126+
var expected = new ComplexNumber(-2, 0);
127+
Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 2)).Real(), 15);
128+
Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 2)).Imaginary(), 15);
129+
}
130+
131+
[Fact(Skip = "Remove to run test")]
132+
public void Multiply_numbers_with_real_and_imaginary_part()
133+
{
134+
var sut = new ComplexNumber(1, 2);
135+
var expected = new ComplexNumber(-5, 10);
136+
Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(3, 4)).Real(), 15);
137+
Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(3, 4)).Imaginary(), 15);
138+
}
139+
140+
[Fact(Skip = "Remove to run test")]
141+
public void Divide_purely_real_numbers()
142+
{
143+
var sut = new ComplexNumber(1, 0);
144+
var expected = new ComplexNumber(0.5, 0);
145+
Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(2, 0)).Real(), 15);
146+
Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(2, 0)).Imaginary(), 15);
147+
}
148+
149+
[Fact(Skip = "Remove to run test")]
150+
public void Divide_purely_imaginary_numbers()
151+
{
152+
var sut = new ComplexNumber(0, 1);
153+
var expected = new ComplexNumber(0.5, 0);
154+
Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(0, 2)).Real(), 15);
155+
Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(0, 2)).Imaginary(), 15);
156+
}
157+
158+
[Fact(Skip = "Remove to run test")]
159+
public void Divide_numbers_with_real_and_imaginary_part()
160+
{
161+
var sut = new ComplexNumber(1, 2);
162+
var expected = new ComplexNumber(0.44, 0.08);
163+
Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(3, 4)).Real(), 15);
164+
Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(3, 4)).Imaginary(), 15);
165+
}
166+
167+
[Fact(Skip = "Remove to run test")]
168+
public void Absolute_value_of_a_positive_purely_real_number()
169+
{
170+
var sut = new ComplexNumber(5, 0);
171+
Assert.Equal(5, sut.Abs());
172+
}
173+
174+
[Fact(Skip = "Remove to run test")]
175+
public void Absolute_value_of_a_negative_purely_real_number()
176+
{
177+
var sut = new ComplexNumber(-5, 0);
178+
Assert.Equal(5, sut.Abs());
179+
}
180+
181+
[Fact(Skip = "Remove to run test")]
182+
public void Absolute_value_of_a_purely_imaginary_number_with_positive_imaginary_part()
183+
{
184+
var sut = new ComplexNumber(0, 5);
185+
Assert.Equal(5, sut.Abs());
186+
}
187+
188+
[Fact(Skip = "Remove to run test")]
189+
public void Absolute_value_of_a_purely_imaginary_number_with_negative_imaginary_part()
190+
{
191+
var sut = new ComplexNumber(0, -5);
192+
Assert.Equal(5, sut.Abs());
193+
}
194+
195+
[Fact(Skip = "Remove to run test")]
196+
public void Absolute_value_of_a_number_with_real_and_imaginary_part()
197+
{
198+
var sut = new ComplexNumber(3, 4);
199+
Assert.Equal(5, sut.Abs());
200+
}
201+
202+
[Fact(Skip = "Remove to run test")]
203+
public void Conjugate_a_purely_real_number()
204+
{
205+
var sut = new ComplexNumber(5, 0);
206+
var expected = new ComplexNumber(5, 0);
207+
Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15);
208+
Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15);
209+
}
210+
211+
[Fact(Skip = "Remove to run test")]
212+
public void Conjugate_a_purely_imaginary_number()
213+
{
214+
var sut = new ComplexNumber(0, 5);
215+
var expected = new ComplexNumber(0, -5);
216+
Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15);
217+
Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15);
218+
}
219+
220+
[Fact(Skip = "Remove to run test")]
221+
public void Conjugate_a_number_with_real_and_imaginary_part()
222+
{
223+
var sut = new ComplexNumber(1, 1);
224+
var expected = new ComplexNumber(1, -1);
225+
Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15);
226+
Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15);
227+
}
228+
229+
[Fact(Skip = "Remove to run test")]
230+
public void Eulers_identity_formula()
231+
{
232+
var sut = new ComplexNumber(0, Math.PI);
233+
var expected = new ComplexNumber(-1, 0);
234+
Assert.Equal(expected.Real(), sut.Exp().Real(), 15);
235+
Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15);
236+
}
237+
238+
[Fact(Skip = "Remove to run test")]
239+
public void Exponential_of_0()
240+
{
241+
var sut = new ComplexNumber(0, 0);
242+
var expected = new ComplexNumber(1, 0);
243+
Assert.Equal(expected.Real(), sut.Exp().Real(), 15);
244+
Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15);
245+
}
246+
247+
[Fact(Skip = "Remove to run test")]
248+
public void Exponential_of_a_purely_real_number()
249+
{
250+
var sut = new ComplexNumber(1, 0);
251+
var expected = new ComplexNumber(Math.E, 0);
252+
Assert.Equal(expected.Real(), sut.Exp().Real(), 15);
253+
Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15);
254+
}
255+
}

0 commit comments

Comments
 (0)