trackler 2.2.1.85 → 2.2.1.86

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
  4. data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
  5. data/problem-specifications/package.json +2 -2
  6. data/problem-specifications/yarn.lock +61 -51
  7. data/tracks/bash/CONTRIBUTING.md +10 -6
  8. data/tracks/bash/README.md +1 -0
  9. data/tracks/bash/exercises/acronym/README.md +1 -1
  10. data/tracks/bash/exercises/anagram/README.md +1 -1
  11. data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
  12. data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
  13. data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
  14. data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
  15. data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
  16. data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
  17. data/tracks/bash/exercises/gigasecond/README.md +1 -1
  18. data/tracks/bash/exercises/hamming/README.md +1 -1
  19. data/tracks/bash/exercises/hello-world/README.md +1 -1
  20. data/tracks/bash/exercises/leap/README.md +1 -1
  21. data/tracks/bash/exercises/luhn/README.md +1 -1
  22. data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
  23. data/tracks/bash/exercises/pangram/README.md +1 -1
  24. data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
  25. data/tracks/bash/exercises/phone-number/README.md +1 -1
  26. data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
  27. data/tracks/bash/exercises/raindrops/README.md +1 -1
  28. data/tracks/bash/exercises/rna-transcription/README.md +1 -1
  29. data/tracks/bash/exercises/triangle/example.sh +23 -4
  30. data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
  31. data/tracks/bash/exercises/two-fer/README.md +1 -1
  32. data/tracks/bash/exercises/word-count/README.md +1 -1
  33. data/tracks/c/config.json +11 -0
  34. data/tracks/c/exercises/complex-numbers/README.md +67 -0
  35. data/tracks/c/exercises/complex-numbers/makefile +27 -0
  36. data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
  37. data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
  38. data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
  39. data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
  40. data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
  41. data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
  42. data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
  43. data/tracks/crystal/.github/stale.yml +18 -0
  44. data/tracks/csharp/exercises/bob/README.md +3 -2
  45. data/tracks/ecmascript/config.json +4 -4
  46. data/tracks/fsharp/exercises/bob/README.md +4 -2
  47. data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
  48. data/tracks/fsharp/generators/Generators.fs +76 -0
  49. data/tracks/go/exercises/tree-building/tree_test.go +15 -0
  50. data/tracks/haskell/.travis.yml +1 -1
  51. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  52. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  53. data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
  54. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  55. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  56. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
  57. data/tracks/haskell/exercises/allergies/package.yaml +1 -1
  58. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/anagram/package.yaml +1 -1
  61. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
  63. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
  67. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
  69. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/bob/package.yaml +1 -1
  71. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
  74. data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/change/package.yaml +1 -1
  76. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
  79. data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/connect/package.yaml +1 -1
  82. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  84. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/diamond/package.yaml +1 -1
  87. data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
  89. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
  91. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
  104. data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
  105. data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
  107. data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/luhn/package.yaml +1 -1
  115. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
  117. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/meetup/package.yaml +1 -1
  119. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  122. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  123. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  124. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  125. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  126. data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
  127. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  128. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  129. data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
  130. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  131. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  132. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  133. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  134. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  135. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  136. data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
  137. data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
  138. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  139. data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
  140. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  141. data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
  142. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  143. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  144. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  145. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
  146. data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
  147. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  148. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  149. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  150. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  151. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  152. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  153. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  154. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  155. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  156. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  157. data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
  158. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  159. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  160. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  161. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  162. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  163. data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
  164. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  165. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  166. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  167. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  168. data/tracks/java/config.json +12 -0
  169. data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
  170. data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
  171. data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
  172. data/tracks/java/exercises/alphametics/README.md +47 -0
  173. data/tracks/java/exercises/alphametics/build.gradle +18 -0
  174. data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
  175. data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
  176. data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
  177. data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
  178. data/tracks/java/exercises/beer-song/.meta/version +1 -0
  179. data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
  180. data/tracks/java/exercises/binary-search/.meta/version +1 -0
  181. data/tracks/java/exercises/book-store/.meta/version +1 -0
  182. data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
  183. data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
  184. data/tracks/java/exercises/list-ops/.meta/version +1 -1
  185. data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
  186. data/tracks/java/exercises/nth-prime/.meta/version +1 -0
  187. data/tracks/java/exercises/settings.gradle +1 -0
  188. data/tracks/java/exercises/tournament/.meta/version +1 -0
  189. data/tracks/java/exercises/transpose/.meta/version +1 -0
  190. data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
  191. data/tracks/java/exercises/wordy/.meta/version +1 -0
  192. data/tracks/javascript/.eslintignore +0 -1
  193. data/tracks/javascript/config.json +13 -3
  194. data/tracks/javascript/exercises/bowling/example.js +24 -10
  195. data/tracks/javascript/exercises/forth/README.md +56 -0
  196. data/tracks/javascript/exercises/forth/example.js +66 -0
  197. data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
  198. data/tracks/lua/config.json +92 -81
  199. data/tracks/lua/exercises/accumulate/README.md +42 -0
  200. data/tracks/lua/exercises/beer-song/README.md +1 -1
  201. data/tracks/lua/exercises/bob/README.md +2 -0
  202. data/tracks/lua/exercises/crypto-square/README.md +6 -4
  203. data/tracks/lua/exercises/house/README.md +1 -1
  204. data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
  205. data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
  206. data/tracks/lua/exercises/meetup/README.md +16 -12
  207. data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +1 -1
  209. data/tracks/lua/exercises/pov/README.md +0 -2
  210. data/tracks/lua/exercises/queen-attack/README.md +22 -22
  211. data/tracks/lua/exercises/rectangles/README.md +9 -9
  212. data/tracks/lua/exercises/reverse-string/README.md +23 -0
  213. data/tracks/lua/exercises/reverse-string/example.lua +7 -0
  214. data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
  215. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  216. data/tracks/lua/exercises/space-age/README.md +1 -2
  217. data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
  218. data/tracks/perl6/exercises/two-fer/README.md +1 -1
  219. data/tracks/python/exercises/luhn/luhn_test.py +1 -1
  220. metadata +39 -6
@@ -21,7 +21,7 @@ readable as we can.
21
21
 
22
22
  Run the tests with:
23
23
 
24
- bats whatever_test.sh
24
+ bats two_fer_test.sh
25
25
 
26
26
  ## Source
27
27
 
@@ -14,7 +14,7 @@ free: 1
14
14
 
15
15
  Run the tests with:
16
16
 
17
- bats whatever_test.sh
17
+ bats word_count_test.sh
18
18
 
19
19
  ## Source
20
20
 
data/tracks/c/config.json CHANGED
@@ -477,6 +477,17 @@
477
477
  "enums"
478
478
  ],
479
479
  "uuid": "b0a152e9-5a45-41f9-bda0-427111d9a56c"
480
+ },
481
+ {
482
+ "core": false,
483
+ "difficulty": 2,
484
+ "slug": "complex-numbers",
485
+ "topics": [
486
+ "structs",
487
+ "performance_optimizations"
488
+ ],
489
+ "unlocked_by": "difference-of-squares",
490
+ "uuid": "472b1a6b-2b7a-4609-a97d-4c2b6c941a1f"
480
491
  }
481
492
  ],
482
493
  "foregone": [],
@@ -0,0 +1,67 @@
1
+ # Complex Numbers
2
+
3
+ A complex number is a number in the form `a + b * i` where `a` and `b` are real and `i` satisfies `i^2 = -1`.
4
+
5
+ `a` is called the real part and `b` is called the imaginary part of `z`.
6
+ The conjugate of the number `a + b * i` is the number `a - b * i`.
7
+ The absolute value of a complex number `z = a + b * i` is a real number `|z| = sqrt(a^2 + b^2)`. The square of the absolute value `|z|^2` is the result of multiplication of `z` by its complex conjugate.
8
+
9
+ The sum/difference of two complex numbers involves adding/subtracting their real and imaginary parts separately:
10
+ `(a + i * b) + (c + i * d) = (a + c) + (b + d) * i`,
11
+ `(a + i * b) - (c + i * d) = (a - c) + (b - d) * i`.
12
+
13
+ Multiplication result is by definition
14
+ `(a + i * b) * (c + i * d) = (a * c - b * d) + (b * c + a * d) * i`.
15
+
16
+ The reciprocal of a non-zero complex number is
17
+ `1 / (a + i * b) = a/(a^2 + b^2) - b/(a^2 + b^2) * i`.
18
+
19
+ Dividing a complex number `a + i * b` by another `c + i * d` gives:
20
+ `(a + i * b) / (c + i * d) = (a * c + b * d)/(c^2 + d^2) + (b * c - a * d)/(c^2 + d^2) * i`.
21
+
22
+ Exponent of a complex number can be expressed as
23
+ `exp(a + i * b) = exp(a) * exp(i * b)`,
24
+ and the last term is given by Euler's formula `exp(i * b) = cos(b) + i * sin(b)`.
25
+
26
+
27
+ Implement the following operations:
28
+ - addition, subtraction, multiplication and division of two complex numbers,
29
+ - conjugate, absolute value, exponent of a given complex number.
30
+
31
+
32
+ Assume the programming language you are using does not have an implementation of complex numbers.
33
+
34
+
35
+ ## Getting Started
36
+
37
+ For installation and learning resources, refer to the
38
+ [exercism help page](http://exercism.io/languages/c).
39
+
40
+ ## Running the tests
41
+
42
+ To run the test suite, execute the following command:
43
+
44
+ ```bash
45
+ make test
46
+ ```
47
+
48
+ To check for memory leaks using [Valgrind](http://valgrind.org/), execute the following command:
49
+ ```bash
50
+ make memcheck
51
+ ```
52
+ You will need Valgrind to do this. See your distribution documentation for how to install Valgrind.
53
+
54
+ ## Feedback, Issues, Pull Requests
55
+
56
+ The [exercism/c](https://github.com/exercism/c) repository on
57
+ GitHub is the home for all of the C exercises.
58
+
59
+ If you have feedback about an exercise, or want to help implementing a new
60
+ one, head over there and create an issue. We'll do our best to help you!
61
+
62
+ ## Source
63
+
64
+ Wikipedia [https://en.wikipedia.org/wiki/Complex_number](https://en.wikipedia.org/wiki/Complex_number)
65
+
66
+ ## Submitting Incomplete Solutions
67
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,27 @@
1
+ CFLAGS = -std=c99
2
+ CFLAGS += -g
3
+ CFLAGS += -Wall
4
+ CFLAGS += -Wextra
5
+ CFLAGS += -pedantic
6
+ CFLAGS += -Werror
7
+
8
+ VFLAGS = --quiet
9
+ VFLAGS += --tool=memcheck
10
+ VFLAGS += --leak-check=full
11
+ VFLAGS += --error-exitcode=1
12
+
13
+ LDFLAGS = -lm
14
+
15
+ test: tests.out
16
+ @./tests.out
17
+
18
+ memcheck: tests.out
19
+ @valgrind $(VFLAGS) ./tests.out
20
+ @echo "Memory check passed"
21
+
22
+ clean:
23
+ rm -rf *.o *.out *.out.dSYM
24
+
25
+ tests.out: test/test_complex_numbers.c src/complex_numbers.c src/complex_numbers.h
26
+ @echo Compiling $@
27
+ @cc $(CFLAGS) src/complex_numbers.c test/vendor/unity.c test/test_complex_numbers.c $(LDFLAGS) -o tests.out
@@ -0,0 +1,46 @@
1
+ #include "complex_numbers.h"
2
+
3
+ complex_t c_add(complex_t a, complex_t b)
4
+ {
5
+ // TODO: implement
6
+ }
7
+
8
+ complex_t c_sub(complex_t a, complex_t b)
9
+ {
10
+ // TODO: implement
11
+ }
12
+
13
+ complex_t c_mul(complex_t a, complex_t b)
14
+ {
15
+ // TODO: implement
16
+ }
17
+
18
+ complex_t c_div(complex_t a, complex_t b)
19
+ {
20
+ // TODO: implement
21
+ }
22
+
23
+ double c_abs(complex_t x)
24
+ {
25
+ // TODO: implement
26
+ }
27
+
28
+ complex_t c_conjugate(complex_t x)
29
+ {
30
+ // TODO: implement
31
+ }
32
+
33
+ double c_real(complex_t x)
34
+ {
35
+ // TODO: implement
36
+ }
37
+
38
+ double c_imag(complex_t x)
39
+ {
40
+ // TODO: implement
41
+ }
42
+
43
+ complex_t c_exp(complex_t x)
44
+ {
45
+ // TODO: implement
46
+ }
@@ -0,0 +1,19 @@
1
+ #ifndef _COMPLEX_NUMBERS_H_
2
+ #define _COMPLEX_NUMBERS_H_
3
+
4
+ typedef struct {
5
+ double real;
6
+ double imag;
7
+ } complex_t;
8
+
9
+ complex_t c_add(complex_t a, complex_t b);
10
+ complex_t c_sub(complex_t a, complex_t b);
11
+ complex_t c_mul(complex_t a, complex_t b);
12
+ complex_t c_div(complex_t a, complex_t b);
13
+ double c_abs(complex_t x);
14
+ complex_t c_conjugate(complex_t x);
15
+ double c_real(complex_t x);
16
+ double c_imag(complex_t x);
17
+ complex_t c_exp(complex_t x);
18
+
19
+ #endif
@@ -0,0 +1,80 @@
1
+ #include "complex_numbers.h"
2
+ #include <math.h>
3
+
4
+ static double square(double x)
5
+ {
6
+ return x * x;
7
+ }
8
+
9
+ complex_t c_add(const complex_t a, const complex_t b)
10
+ {
11
+ complex_t result;
12
+ result.real = a.real + b.real;
13
+ result.imag = a.imag + b.imag;
14
+
15
+ return result;
16
+ }
17
+
18
+ complex_t c_sub(const complex_t a, const complex_t b)
19
+ {
20
+ complex_t result;
21
+ result.real = a.real - b.real;
22
+ result.imag = a.imag - b.imag;
23
+
24
+ return result;
25
+ }
26
+
27
+ complex_t c_mul(const complex_t a, const complex_t b)
28
+ {
29
+ complex_t result;
30
+ result.real = a.real * b.real - a.imag * b.imag;
31
+ result.imag = a.imag * b.real + a.real * b.imag;
32
+
33
+ return result;
34
+ }
35
+
36
+ complex_t c_div(const complex_t a, const complex_t b)
37
+ {
38
+ double denominator = square(b.real) + square(b.imag);
39
+
40
+ complex_t result;
41
+ result.real = (a.real * b.imag + a.imag * b.real) / denominator;
42
+ result.imag = (a.imag * b.real - a.real * b.imag) / denominator;
43
+
44
+ return result;
45
+ }
46
+
47
+ double c_abs(const complex_t x)
48
+ {
49
+ return sqrt(square(x.real) + square(x.imag));
50
+ }
51
+
52
+ complex_t c_conjugate(const complex_t x)
53
+ {
54
+ complex_t result;
55
+ result.real = x.real;
56
+ result.imag = -(x.imag);
57
+
58
+ return result;
59
+ }
60
+
61
+ double c_real(const complex_t x)
62
+ {
63
+ return x.real;
64
+ }
65
+
66
+ double c_imag(const complex_t x)
67
+ {
68
+ return x.imag;
69
+ }
70
+
71
+ complex_t c_exp(const complex_t x)
72
+ {
73
+ double real_exp = exp(x.real);
74
+
75
+ complex_t result;
76
+ result.real = real_exp * cos(x.imag);
77
+ result.imag = real_exp * sin(x.imag);
78
+
79
+ return result;
80
+ }
@@ -0,0 +1,397 @@
1
+ #include "../src/complex_numbers.h"
2
+
3
+ #define UNITY_FLOAT_TYPE double
4
+ #include "vendor/unity.h"
5
+
6
+ #include <math.h>
7
+
8
+ #define PI acos(-1)
9
+ #define E exp(1)
10
+
11
+ void compare_complex(complex_t lhs, complex_t rhs)
12
+ {
13
+ TEST_ASSERT_EQUAL_FLOAT(lhs.real, rhs.real);
14
+ TEST_ASSERT_EQUAL_FLOAT(lhs.imag, rhs.imag);
15
+ }
16
+
17
+ void test_imaginary_unit(void)
18
+ {
19
+ complex_t z = {.real = 0.0,.imag = 1.0 };
20
+
21
+ complex_t expected = {.real = -1.0,.imag = 0.0 };
22
+ complex_t actual = c_mul(z, z);
23
+
24
+ compare_complex(expected, actual);
25
+ }
26
+
27
+ void test_add_purely_real_numbers(void)
28
+ {
29
+ TEST_IGNORE();
30
+
31
+ complex_t z1 = {.real = 1.0,.imag = 0.0 };
32
+ complex_t z2 = {.real = 2.0,.imag = 0.0 };
33
+
34
+ complex_t expected = {.real = 3.0,.imag = 0.0 };
35
+ complex_t actual = c_add(z1, z2);
36
+
37
+ compare_complex(expected, actual);
38
+ }
39
+
40
+ void test_add_purely_imaginary_numbers(void)
41
+ {
42
+ TEST_IGNORE();
43
+ complex_t z1 = {.real = 0.0,.imag = 1.0 };
44
+ complex_t z2 = {.real = 0.0,.imag = 2.0 };
45
+
46
+ complex_t expected = {.real = 0.0,.imag = 3.0 };
47
+ complex_t actual = c_add(z1, z2);
48
+
49
+ compare_complex(expected, actual);
50
+ }
51
+
52
+ void test_add_numbers_with_real_and_imaginary_part(void)
53
+ {
54
+ TEST_IGNORE();
55
+ complex_t z1 = {.real = 1.0,.imag = 2.0 };
56
+ complex_t z2 = {.real = 3.0,.imag = 4.0 };
57
+
58
+ complex_t expected = {.real = 4.0,.imag = 6.0 };
59
+ complex_t actual = c_add(z1, z2);
60
+
61
+ compare_complex(expected, actual);
62
+ }
63
+
64
+ void test_subtract_purely_real_numbers(void)
65
+ {
66
+ TEST_IGNORE();
67
+ complex_t z1 = {.real = 1.0,.imag = 0.0 };
68
+ complex_t z2 = {.real = 2.0,.imag = 0.0 };
69
+
70
+ complex_t expected = {.real = -1.0,.imag = 0.0 };
71
+ complex_t actual = c_sub(z1, z2);
72
+
73
+ compare_complex(expected, actual);
74
+ }
75
+
76
+ void test_subtract_purely_imaginary_numbers(void)
77
+ {
78
+ TEST_IGNORE();
79
+ complex_t z1 = {.real = 0.0,.imag = 1.0 };
80
+ complex_t z2 = {.real = 0.0,.imag = 2.0 };
81
+
82
+ complex_t expected = {.real = 0.0,.imag = -1.0 };
83
+ complex_t actual = c_sub(z1, z2);
84
+
85
+ compare_complex(expected, actual);
86
+ }
87
+
88
+ void test_subtract_numbers_with_real_and_imaginary_part(void)
89
+ {
90
+ TEST_IGNORE();
91
+ complex_t z1 = {.real = 1.0,.imag = 2.0 };
92
+ complex_t z2 = {.real = 3.0,.imag = 4.0 };
93
+
94
+ complex_t expected = {.real = -2.0,.imag = -2.0 };
95
+ complex_t actual = c_sub(z1, z2);
96
+
97
+ compare_complex(expected, actual);
98
+ }
99
+
100
+ void test_multiply_purely_real_numbers(void)
101
+ {
102
+ TEST_IGNORE();
103
+ complex_t z1 = {.real = 1.0,.imag = 0.0 };
104
+ complex_t z2 = {.real = 2.0,.imag = 0.0 };
105
+
106
+ complex_t expected = {.real = 2.0,.imag = 0.0 };
107
+ complex_t actual = c_mul(z1, z2);
108
+
109
+ compare_complex(expected, actual);
110
+ }
111
+
112
+ void test_multiply_purely_imaginary_numbers(void)
113
+ {
114
+ TEST_IGNORE();
115
+ complex_t z1 = {.real = 0.0,.imag = 1.0 };
116
+ complex_t z2 = {.real = 0.0,.imag = 2.0 };
117
+
118
+ complex_t expected = {.real = -2.0,.imag = 0.0 };
119
+ complex_t actual = c_mul(z1, z2);
120
+
121
+ compare_complex(expected, actual);
122
+ }
123
+
124
+ void test_multiply_numbers_with_real_and_imaginary_part(void)
125
+ {
126
+ TEST_IGNORE();
127
+ complex_t z1 = {.real = 1.0,.imag = 2.0 };
128
+ complex_t z2 = {.real = 3.0,.imag = 4.0 };
129
+
130
+ complex_t expected = {.real = -5.0,.imag = 10.0 };
131
+ complex_t actual = c_mul(z1, z2);
132
+
133
+ compare_complex(expected, actual);
134
+ }
135
+
136
+ void test_divide_purely_real_numbers(void)
137
+ {
138
+ TEST_IGNORE();
139
+ complex_t z1 = {.real = 1.0,.imag = 0.0 };
140
+ complex_t z2 = {.real = 2.0,.imag = 0.0 };
141
+
142
+ complex_t expected = {.real = 0.5,.imag = 0.0 };
143
+ complex_t actual = c_div(z1, z2);
144
+
145
+ compare_complex(expected, actual);
146
+ }
147
+
148
+ void test_divide_purely_imaginary_numbers(void)
149
+ {
150
+ TEST_IGNORE();
151
+ complex_t z1 = {.real = 0.0,.imag = 1.0 };
152
+ complex_t z2 = {.real = 0.0,.imag = 2.0 };
153
+
154
+ complex_t expected = {.real = 0.5,.imag = 0.0 };
155
+ complex_t actual = c_div(z1, z2);
156
+
157
+ compare_complex(expected, actual);
158
+ }
159
+
160
+ void test_divide_numbers_with_real_and_imaginary_part(void)
161
+ {
162
+ TEST_IGNORE();
163
+ complex_t z1 = {.real = 1.0,.imag = 2.0 };
164
+ complex_t z2 = {.real = 3.0,.imag = 4.0 };
165
+
166
+ complex_t expected = {.real = 0.44,.imag = 0.08 };
167
+ complex_t actual = c_div(z1, z2);
168
+
169
+ compare_complex(expected, actual);
170
+ }
171
+
172
+ void test_abs_of_a_positive_purely_real_number(void)
173
+ {
174
+ TEST_IGNORE();
175
+ complex_t z = {.real = 5.0,.imag = 0.0 };
176
+
177
+ double expected = 5.0;
178
+ double actual = c_abs(z);
179
+
180
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
181
+ }
182
+
183
+ void test_abs_of_a_negative_purely_real_number(void)
184
+ {
185
+ TEST_IGNORE();
186
+ complex_t z = {.real = -5.0,.imag = 0.0 };
187
+
188
+ double expected = 5.0;
189
+ double actual = c_abs(z);
190
+
191
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
192
+ }
193
+
194
+ void test_abs_of_a_purely_imaginary_number_with_positive_imaginary_part(void)
195
+ {
196
+ TEST_IGNORE();
197
+ complex_t z = {.real = 0.0,.imag = 5.0 };
198
+
199
+ double expected = 5.0;
200
+ double actual = c_abs(z);
201
+
202
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
203
+ }
204
+
205
+ void test_abs_of_a_purely_imaginary_number_with_negative_imaginary_part(void)
206
+ {
207
+ TEST_IGNORE();
208
+ complex_t z = {.real = 0.0,.imag = -5.0 };
209
+
210
+ double expected = 5.0;
211
+ double actual = c_abs(z);
212
+
213
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
214
+ }
215
+
216
+ void test_abs_of_a_number_with_real_and_imaginary_part(void)
217
+ {
218
+ TEST_IGNORE();
219
+ complex_t z = {.real = 3.0,.imag = 4.0 };
220
+
221
+ double expected = 5.0;
222
+ double actual = c_abs(z);
223
+
224
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
225
+ }
226
+
227
+ void test_complex_conjugate_of_a_purely_real_number(void)
228
+ {
229
+ TEST_IGNORE();
230
+ complex_t z = {.real = 5.0,.imag = 0.0 };
231
+
232
+ complex_t expected = {.real = 5.0,.imag = 0.0 };
233
+ complex_t actual = c_conjugate(z);
234
+
235
+ compare_complex(expected, actual);
236
+ }
237
+
238
+ void test_complex_conjugate_of_a_purely_imaginary_number(void)
239
+ {
240
+ TEST_IGNORE();
241
+ complex_t z = {.real = 0.0,.imag = 5.0 };
242
+
243
+ complex_t expected = {.real = 0.0,.imag = -5.0 };
244
+ complex_t actual = c_conjugate(z);
245
+
246
+ compare_complex(expected, actual);
247
+ }
248
+
249
+ void test_complex_conjugate_of_a_number_with_real_and_imaginary_part(void)
250
+ {
251
+ TEST_IGNORE();
252
+ complex_t z = {.real = 1.0,.imag = 1.0 };
253
+
254
+ complex_t expected = {.real = 1.0,.imag = -1.0 };
255
+ complex_t actual = c_conjugate(z);
256
+
257
+ compare_complex(expected, actual);
258
+ }
259
+
260
+ void test_real_part_of_a_purely_real_number(void)
261
+ {
262
+ TEST_IGNORE();
263
+ complex_t z = {.real = 1.0,.imag = 0.0 };
264
+
265
+ double expected = 1.0;
266
+ double actual = c_real(z);
267
+
268
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
269
+ }
270
+
271
+ void test_real_part_of_a_purely_imaginary_number(void)
272
+ {
273
+ TEST_IGNORE();
274
+ complex_t z = {.real = 0.0,.imag = 1.0 };
275
+
276
+ double expected = 0.0;
277
+ double actual = c_real(z);
278
+
279
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
280
+ }
281
+
282
+ void test_real_part_of_a_number_with_real_and_imaginary_part(void)
283
+ {
284
+ TEST_IGNORE();
285
+ complex_t z = {.real = 1.0,.imag = 2.0 };
286
+
287
+ double expected = 1.0;
288
+ double actual = c_real(z);
289
+
290
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
291
+ }
292
+
293
+ void test_imaginary_part_of_a_purely_real_number(void)
294
+ {
295
+ TEST_IGNORE();
296
+ complex_t z = {.real = 1.0,.imag = 0.0 };
297
+
298
+ double expected = 0.0;
299
+ double actual = c_imag(z);
300
+
301
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
302
+ }
303
+
304
+ void test_imaginary_part_of_a_purely_imaginary_number(void)
305
+ {
306
+ TEST_IGNORE();
307
+ complex_t z = {.real = 0.0,.imag = 1.0 };
308
+
309
+ double expected = 1.0;
310
+ double actual = c_imag(z);
311
+
312
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
313
+ }
314
+
315
+ void test_imaginary_part_of_a_number_with_real_and_imaginary_part(void)
316
+ {
317
+ TEST_IGNORE();
318
+ complex_t z = {.real = 1.0,.imag = 2.0 };
319
+
320
+ double expected = 2.0;
321
+ double actual = c_imag(z);
322
+
323
+ TEST_ASSERT_EQUAL_FLOAT(expected, actual);
324
+ }
325
+
326
+ void test_eulers_identity(void)
327
+ {
328
+ TEST_IGNORE();
329
+ complex_t z = {.real = 0.0,.imag = PI };
330
+
331
+ complex_t expected = {.real = -1.0,.imag = 0.0 };
332
+ complex_t actual = c_exp(z);
333
+
334
+ TEST_ASSERT_FLOAT_WITHIN(1e-10, expected.real, actual.real);
335
+ TEST_ASSERT_FLOAT_WITHIN(1e-10, expected.imag, actual.imag);
336
+ }
337
+
338
+ void test_exponential_of_zero(void)
339
+ {
340
+ TEST_IGNORE();
341
+ complex_t zero = {.real = 0.0,.imag = 0.0 };
342
+
343
+ complex_t expected = {.real = 1.0,.imag = 0.0 };
344
+ complex_t actual = c_exp(zero);
345
+
346
+ compare_complex(expected, actual);
347
+ }
348
+
349
+ void test_exponential_of_a_purely_real_number(void)
350
+ {
351
+ TEST_IGNORE();
352
+ complex_t z = {.real = 1.0,.imag = 0.0 };
353
+
354
+ complex_t expected = {.real = E,.imag = 0.0 };
355
+ complex_t actual = c_exp(z);
356
+
357
+ compare_complex(expected, actual);
358
+ }
359
+
360
+ int main(void)
361
+ {
362
+ UnityBegin("test/test_complex_numbers.c");
363
+
364
+ RUN_TEST(test_imaginary_unit);
365
+ RUN_TEST(test_add_purely_real_numbers);
366
+ RUN_TEST(test_add_purely_imaginary_numbers);
367
+ RUN_TEST(test_add_numbers_with_real_and_imaginary_part);
368
+ RUN_TEST(test_subtract_purely_real_numbers);
369
+ RUN_TEST(test_subtract_purely_imaginary_numbers);
370
+ RUN_TEST(test_subtract_numbers_with_real_and_imaginary_part);
371
+ RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
372
+ RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
373
+ RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
374
+ RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
375
+ RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
376
+ RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
377
+ RUN_TEST(test_abs_of_a_positive_purely_real_number);
378
+ RUN_TEST(test_abs_of_a_negative_purely_real_number);
379
+ RUN_TEST(test_abs_of_a_purely_imaginary_number_with_positive_imaginary_part);
380
+ RUN_TEST(test_abs_of_a_purely_imaginary_number_with_negative_imaginary_part);
381
+ RUN_TEST(test_abs_of_a_number_with_real_and_imaginary_part);
382
+ RUN_TEST(test_complex_conjugate_of_a_purely_real_number);
383
+ RUN_TEST(test_complex_conjugate_of_a_purely_imaginary_number);
384
+ RUN_TEST(test_complex_conjugate_of_a_number_with_real_and_imaginary_part);
385
+ RUN_TEST(test_real_part_of_a_purely_real_number);
386
+ RUN_TEST(test_real_part_of_a_purely_imaginary_number);
387
+ RUN_TEST(test_real_part_of_a_number_with_real_and_imaginary_part);
388
+ RUN_TEST(test_imaginary_part_of_a_purely_real_number);
389
+ RUN_TEST(test_imaginary_part_of_a_purely_imaginary_number);
390
+ RUN_TEST(test_imaginary_part_of_a_number_with_real_and_imaginary_part);
391
+ RUN_TEST(test_eulers_identity);
392
+ RUN_TEST(test_exponential_of_zero);
393
+ RUN_TEST(test_exponential_of_a_purely_real_number);
394
+
395
+ UnityEnd();
396
+ return 0;
397
+ }