trackler 2.2.1.85 → 2.2.1.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }