trackler 2.0.5.4 → 2.0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/csharp/exercises/grep/GrepTest.cs +2 -0
  4. data/tracks/java/exercises/nucleotide-count/build.gradle +1 -1
  5. data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +42 -32
  6. data/tracks/java/exercises/series/build.gradle +0 -1
  7. data/tracks/java/exercises/simple-linked-list/build.gradle +0 -1
  8. data/tracks/java/exercises/simple-linked-list/src/test/java/SimpleLinkedListTest.java +18 -16
  9. data/tracks/javascript/docs/INSTALLATION.md +1 -1
  10. data/tracks/purescript/config.json +8 -0
  11. data/tracks/purescript/exercises/acronym/bower.json +17 -0
  12. data/tracks/purescript/exercises/acronym/examples/src/Acronym.purs +46 -0
  13. data/tracks/purescript/exercises/acronym/src/Acronym.purs +3 -0
  14. data/tracks/purescript/exercises/acronym/test/Main.purs +37 -0
  15. data/tracks/r/exercises/space-age/example.R +11 -2
  16. data/tracks/r/exercises/space-age/test_space-age.R +9 -25
  17. data/tracks/rust/config.json +8 -0
  18. data/tracks/rust/docs/INSTALLATION.md +1 -1
  19. data/tracks/rust/docs/TESTS.md +3 -10
  20. data/tracks/rust/exercises/sum-of-multiples/.gitignore +7 -0
  21. data/tracks/rust/exercises/sum-of-multiples/Cargo.toml +3 -0
  22. data/tracks/rust/exercises/sum-of-multiples/example.rs +17 -0
  23. data/tracks/rust/exercises/sum-of-multiples/tests/sum-of-multiples.rs +74 -0
  24. data/tracks/rust/problems.md +1 -0
  25. data/tracks/scala/exercises/difference-of-squares/example.scala +1 -5
  26. data/tracks/scala/exercises/difference-of-squares/src/test/scala/SquaresTest.scala +9 -9
  27. data/tracks/scala/exercises/robot-name/example.scala +13 -16
  28. data/tracks/scala/exercises/robot-name/src/test/scala/RobotNameTest.scala +21 -4
  29. data/tracks/swift/docs/TESTS.md +3 -3
  30. metadata +10 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f8cca57f85b5dabaa34b9cb752d0c823feaae46
4
- data.tar.gz: 314de611b35a6b245771b861cd7a6c6a0cf2a6d8
3
+ metadata.gz: 8d5432bf225e49f96fd078ad1c2e11e82d291780
4
+ data.tar.gz: 9ebb6ec88ed0bb64313051385c09b16e3a313f21
5
5
  SHA512:
6
- metadata.gz: da99a8648b63bc77112daa9be4506b98d49a4ba9a78c7914565833c46155df72b1973bc192066e7e864d795134775c8acbba2aec07b2204c92debf15aff687d4
7
- data.tar.gz: 080cc27639f4d6d57248e088f77a14a04fd363647af1338c528566803697ffbc37e6787e31403e8232e143c4f3890b291367074b819bc30d8f67595f020bc60c
6
+ metadata.gz: faf9bf3ac196a3c1f3cd6ee3ba48e31e182eb6176fea567ef641b4e2b941a671f77d6df6433a3393735c450a41a17236ba3d83ff20701db3aaa140963d32b967
7
+ data.tar.gz: ced5a0f1c865bb6322d2c2efd31720a545f9551630732ee6e5bf2bfc1a7a2660a860eab9ad2804600b7e7795c1eaabc2ad2de55fe3c7e07a618797249e9d5dc4
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.5.4"
2
+ VERSION = "2.0.5.5"
3
3
  end
@@ -42,6 +42,7 @@ That Shepherd, who first taught the chosen Seed
42
42
  [OneTimeSetUp]
43
43
  public void SetUp()
44
44
  {
45
+ Directory.SetCurrentDirectory(Path.GetTempPath());
45
46
  File.WriteAllText(IliadFileName, IliadContents);
46
47
  File.WriteAllText(MidsummerNightFileName, MidsummerNightContents);
47
48
  File.WriteAllText(ParadiseLostFileName, ParadiseLostContents);
@@ -50,6 +51,7 @@ That Shepherd, who first taught the chosen Seed
50
51
  [OneTimeTearDown]
51
52
  public void TearDown()
52
53
  {
54
+ Directory.SetCurrentDirectory(Path.GetTempPath());
53
55
  File.Delete(IliadFileName);
54
56
  File.Delete(MidsummerNightFileName);
55
57
  File.Delete(ParadiseLostFileName);
@@ -8,7 +8,7 @@ repositories {
8
8
 
9
9
  dependencies {
10
10
  testCompile "junit:junit:4.12"
11
- testCompile "org.assertj:assertj-core:3.2.0"
11
+ testCompile 'org.hamcrest:hamcrest-library:1.3'
12
12
  }
13
13
 
14
14
  test {
@@ -1,53 +1,59 @@
1
- import static org.assertj.core.api.Assertions.assertThat;
2
- import static org.assertj.core.api.Assertions.entry;
3
-
4
- import org.junit.Test;
5
1
  import org.junit.Ignore;
2
+ import org.junit.Test;
3
+
4
+ import java.util.Map;
5
+
6
+ import static org.hamcrest.Matchers.*;
7
+ import static org.junit.Assert.*;
6
8
 
7
9
  public class NucleotideTest {
8
10
 
9
11
  @Test
10
12
  public void testEmptyDnaStringHasNoAdenosine() {
11
13
  DNA dna = new DNA("");
12
- assertThat(dna.count('A')).isEqualTo(0);
14
+ assertThat(dna.count('A'), is(0));
13
15
  }
14
16
 
15
17
  @Ignore
16
18
  @Test
17
19
  public void testEmptyDnaStringHasNoNucleotides() {
18
20
  DNA dna = new DNA("");
19
- assertThat(dna.nucleotideCounts()).hasSize(4).contains(
20
- entry('A', 0),
21
- entry('C', 0),
22
- entry('G', 0),
23
- entry('T', 0)
24
- );
21
+ Map<Character, Integer> counts = dna.nucleotideCounts();
22
+ assertThat(counts.size(), is(4));
23
+ assertThat(counts, allOf(
24
+ hasEntry('A', 0),
25
+ hasEntry('C', 0),
26
+ hasEntry('G', 0),
27
+ hasEntry('T', 0)
28
+ ));
25
29
  }
26
30
 
27
31
  @Ignore
28
32
  @Test
29
33
  public void testRepetitiveCytidineGetsCounted() {
30
34
  DNA dna = new DNA("CCCCC");
31
- assertThat(dna.count('C')).isEqualTo(5);
35
+ assertThat(dna.count('C'), is(5));
32
36
  }
33
37
 
34
38
  @Ignore
35
39
  @Test
36
40
  public void testRepetitiveSequenceWithOnlyGuanosine() {
37
41
  DNA dna = new DNA("GGGGGGGG");
38
- assertThat(dna.nucleotideCounts()).hasSize(4).contains(
39
- entry('A', 0),
40
- entry('C', 0),
41
- entry('G', 8),
42
- entry('T', 0)
43
- );
42
+ Map<Character, Integer> counts = dna.nucleotideCounts();
43
+ assertThat(counts.size(), is(4));
44
+ assertThat(counts, allOf(
45
+ hasEntry('A', 0),
46
+ hasEntry('C', 0),
47
+ hasEntry('G', 8),
48
+ hasEntry('T', 0)
49
+ ));
44
50
  }
45
51
 
46
52
  @Ignore
47
53
  @Test
48
54
  public void testCountsOnlyThymidine() {
49
55
  DNA dna = new DNA("GGGGGTAACCCGG");
50
- assertThat(dna.count('T')).isEqualTo(1);
56
+ assertThat(dna.count('T'), is(1));
51
57
  }
52
58
 
53
59
  @Ignore
@@ -55,7 +61,7 @@ public class NucleotideTest {
55
61
  public void testCountsANucleotideOnlyOnce() {
56
62
  DNA dna = new DNA("CGATTGGG");
57
63
  dna.count('T');
58
- assertThat(dna.count('T')).isEqualTo(2);
64
+ assertThat(dna.count('T'), is(2));
59
65
  }
60
66
 
61
67
  @Ignore
@@ -63,12 +69,14 @@ public class NucleotideTest {
63
69
  public void testDnaCountsDoNotChangeAfterCountingAdenosine() {
64
70
  DNA dna = new DNA("GATTACA");
65
71
  dna.count('A');
66
- assertThat(dna.nucleotideCounts()).hasSize(4).contains(
67
- entry('A', 3),
68
- entry('C', 1),
69
- entry('G', 1),
70
- entry('T', 2)
71
- );
72
+ Map<Character, Integer> counts = dna.nucleotideCounts();
73
+ assertThat(counts.size(), is(4));
74
+ assertThat(counts, allOf(
75
+ hasEntry('A', 3),
76
+ hasEntry('C', 1),
77
+ hasEntry('G', 1),
78
+ hasEntry('T', 2)
79
+ ));
72
80
  }
73
81
 
74
82
  @Ignore
@@ -83,11 +91,13 @@ public class NucleotideTest {
83
91
  public void testCountsAllNucleotides() {
84
92
  String s = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC";
85
93
  DNA dna = new DNA(s);
86
- assertThat(dna.nucleotideCounts()).hasSize(4).contains(
87
- entry('A', 20),
88
- entry('C', 12),
89
- entry('G', 17),
90
- entry('T', 21)
91
- );
94
+ Map<Character, Integer> counts = dna.nucleotideCounts();
95
+ assertThat(counts.size(), is(4));
96
+ assertThat(counts, allOf(
97
+ hasEntry('A', 20),
98
+ hasEntry('C', 12),
99
+ hasEntry('G', 17),
100
+ hasEntry('T', 21)
101
+ ));
92
102
  }
93
103
  }
@@ -8,7 +8,6 @@ repositories {
8
8
 
9
9
  dependencies {
10
10
  testCompile "junit:junit:4.12"
11
- testCompile "org.assertj:assertj-core:3.2.0"
12
11
  }
13
12
  test {
14
13
  testLogging {
@@ -8,7 +8,6 @@ repositories {
8
8
 
9
9
  dependencies {
10
10
  testCompile "junit:junit:4.12"
11
- testCompile "org.assertj:assertj-core:3.2.0"
12
11
  }
13
12
  test {
14
13
  testLogging {
@@ -1,8 +1,10 @@
1
+ import org.junit.Ignore;
2
+ import org.junit.Test;
1
3
 
2
4
  import java.util.NoSuchElementException;
3
- import static org.assertj.core.api.Assertions.assertThat;
4
- import org.junit.Test;
5
- import org.junit.Ignore;
5
+
6
+ import static org.hamcrest.CoreMatchers.*;
7
+ import static org.junit.Assert.*;
6
8
 
7
9
  public class SimpleLinkedListTest {
8
10
 
@@ -10,7 +12,7 @@ public class SimpleLinkedListTest {
10
12
  @Test
11
13
  public void aNewListIsEmpty() {
12
14
  SimpleLinkedList list = new SimpleLinkedList();
13
- assertThat(list.size()).isEqualTo(0);
15
+ assertThat(list.size(), is(0));
14
16
  }
15
17
 
16
18
  @Ignore
@@ -18,7 +20,7 @@ public class SimpleLinkedListTest {
18
20
  public void canCreateFromArray() {
19
21
  Integer[] values = new Integer[]{1, 2, 3};
20
22
  SimpleLinkedList list = new SimpleLinkedList(values);
21
- assertThat(list.size()).isEqualTo(3);
23
+ assertThat(list.size(), is(3));
22
24
  }
23
25
 
24
26
  @Ignore
@@ -34,10 +36,10 @@ public class SimpleLinkedListTest {
34
36
  SimpleLinkedList list = new SimpleLinkedList();
35
37
  list.push(9);
36
38
  list.push(8);
37
- assertThat(list.size()).isEqualTo(2);
38
- assertThat(list.pop()).isEqualTo(8);
39
- assertThat(list.pop()).isEqualTo(9);
40
- assertThat(list.size()).isEqualTo(0);
39
+ assertThat(list.size(), is(2));
40
+ assertThat(list.pop(), is(8));
41
+ assertThat(list.pop(), is(9));
42
+ assertThat(list.size(), is(0));
41
43
  }
42
44
 
43
45
  @Ignore
@@ -50,11 +52,11 @@ public class SimpleLinkedListTest {
50
52
  list.push(6);
51
53
  list.push(5);
52
54
  list.reverse();
53
- assertThat(list.pop()).isEqualTo(9);
54
- assertThat(list.pop()).isEqualTo(8);
55
- assertThat(list.pop()).isEqualTo(7);
56
- assertThat(list.pop()).isEqualTo(6);
57
- assertThat(list.pop()).isEqualTo(5);
55
+ assertThat(list.pop(), is(9));
56
+ assertThat(list.pop(), is(8));
57
+ assertThat(list.pop(), is(7));
58
+ assertThat(list.pop(), is(6));
59
+ assertThat(list.pop(), is(5));
58
60
  }
59
61
 
60
62
  @Ignore
@@ -67,7 +69,7 @@ public class SimpleLinkedListTest {
67
69
  list.push(6);
68
70
  list.push(5);
69
71
  Integer[] expected = {5, 6, 7, 8, 9};
70
- assertThat(list.asArray(Integer.class)).containsExactly(expected);
72
+ assertEquals(list.asArray(Integer.class), expected);
71
73
  }
72
74
 
73
75
  @Ignore
@@ -75,7 +77,7 @@ public class SimpleLinkedListTest {
75
77
  public void canReturnEmptyListAsEmptyArray() {
76
78
  SimpleLinkedList list = new SimpleLinkedList();
77
79
  Object[] expected = {};
78
- assertThat(list.asArray(Object.class)).containsExactly(expected);
80
+ assertEquals(list.asArray(Object.class), expected);
79
81
  }
80
82
 
81
83
  }
@@ -6,7 +6,7 @@ There are at least two common options to run JavaScript code: the browsers and [
6
6
 
7
7
  **Mac OS X users**: same as Windows users, you will find official installers on [Node.js downloads](https://nodejs.org/en/download/). Choose the LTS version. It will install Node.js and `npm` on your machine.
8
8
 
9
- **Linux users**: there are binaries for `node` and `npm` tools on the Node.js downloads page, but the recommended way to install them on a Linux machine is via a package manager. As of writing this, the recommended version of Node.js to install is 4.x. To install it on a Debian or Ubuntu Linux distribuion just execute these commands:
9
+ **Linux users**: there are binaries for `node` and `npm` tools on the Node.js downloads page, but the recommended way to install them on a Linux machine is via a package manager. As of writing this, the recommended version of Node.js to install is 4.x. To install it on a Debian or Ubuntu Linux distribution just execute these commands:
10
10
 
11
11
  curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
12
12
  sudo apt-get install -y nodejs
@@ -39,6 +39,14 @@
39
39
  "strings",
40
40
  "chars"
41
41
  ]
42
+ },
43
+ {
44
+ "slug": "acronym",
45
+ "difficulty": 2,
46
+ "topics": [
47
+ "strings",
48
+ "chars"
49
+ ]
42
50
  }
43
51
  ],
44
52
  "deprecated": [
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "leap",
3
+ "ignore": [
4
+ "**/.*",
5
+ "node_modules",
6
+ "bower_components",
7
+ "output"
8
+ ],
9
+ "dependencies": {
10
+ "purescript-prelude": "^2.1.0",
11
+ "purescript-unicode": "^2.0.1"
12
+ },
13
+ "devDependencies": {
14
+ "purescript-psci-support": "^2.0.0",
15
+ "purescript-test-unit": "^10.0.1"
16
+ }
17
+ }
@@ -0,0 +1,46 @@
1
+ module Acronym
2
+ ( abbreviate
3
+ ) where
4
+
5
+ import Prelude
6
+ import Data.Foldable (foldl)
7
+ import Data.String as String
8
+ import Data.Char as Char
9
+ import Data.List as List
10
+ import Data.List (List)
11
+ import Data.Char.Unicode as UChar
12
+
13
+ abbreviate :: String -> String
14
+ abbreviate =
15
+ initials <<< List.fromFoldable <<< String.toCharArray
16
+
17
+ data CharType
18
+ = Upper
19
+ | Lower
20
+ | Space
21
+ | Other
22
+
23
+
24
+ classify :: Char -> CharType
25
+ classify '-' = Space
26
+ classify ' ' = Space
27
+ classify c
28
+ | UChar.isUpper c = Upper
29
+ | UChar.isLower c = Lower
30
+ | otherwise = Other
31
+
32
+
33
+ initials :: List Char -> String
34
+ initials =
35
+ let
36
+ next Lower Upper c = String.singleton c
37
+ next Space _ c = String.singleton (Char.toUpper c)
38
+ next _ _ _ = ""
39
+
40
+ step { acc, last } c =
41
+ let charClass = classify c
42
+ in { acc: acc <> next last charClass c
43
+ , last: charClass
44
+ }
45
+ in
46
+ _.acc <<< foldl step { acc: "", last: Space }
@@ -0,0 +1,3 @@
1
+ module Acronym
2
+ ( abbreviate
3
+ ) where
@@ -0,0 +1,37 @@
1
+ module Test.Main where
2
+
3
+ import Prelude
4
+ import Test.Unit.Assert as Assert
5
+ import Acronym (abbreviate)
6
+ import Control.Monad.Eff (Eff)
7
+ import Test.Unit (suite, test)
8
+ import Test.Unit.Main (runTest)
9
+
10
+
11
+ main :: Eff _ Unit
12
+ main = runTest do
13
+ suite "Acronym.abbreviate" do
14
+ test "acronyms from title case" $
15
+ Assert.equal
16
+ "PNG" $
17
+ abbreviate "Portable Networks Graphic"
18
+
19
+ test "acronyms from lower case" $
20
+ Assert.equal
21
+ "ROR" $
22
+ abbreviate "Ruby on Rails"
23
+
24
+ test "acronyms from inconsistent case" $
25
+ Assert.equal
26
+ "HTML" $
27
+ abbreviate "HyperText Markup Language"
28
+
29
+ test "punctuation is ignored" $
30
+ Assert.equal
31
+ "FIFO" $
32
+ abbreviate "First in, First out"
33
+
34
+ test "acronyms ignoring punctuation and casing" $
35
+ Assert.equal
36
+ "CMOS" $
37
+ abbreviate "Complementary Metal-Oxide semiconductor"
@@ -1,3 +1,12 @@
1
- space_age <- function() {
2
-
1
+ space_age <- function(seconds,planet) {
2
+ earth_year <- 31557600 # number of seconds
3
+ conversion <- list(mercury = 0.2408467 * earth_year,
4
+ venus = 0.61519726 * earth_year,
5
+ earth = 1 * earth_year,
6
+ mars = 1.8808158 * earth_year,
7
+ jupiter = 11.862615 * earth_year,
8
+ saturn = 29.447498 * earth_year,
9
+ uranus = 84.016846 * earth_year,
10
+ neptune = 164.79132 * earth_year)
11
+ round(seconds / conversion[planet][[1]],2)
3
12
  }
@@ -3,58 +3,42 @@ suppressPackageStartupMessages({ require(testthat) })
3
3
 
4
4
  test_that("Age on Earth", {
5
5
  seconds <- 1000000000
6
- expect_equal(space_age(seconds),
7
- 31.69
8
- )
6
+ expect_equal(space_age(seconds, "earth"), 31.69)
9
7
  })
10
8
 
11
9
  test_that("Age on Mercury", {
12
- seconds <- 2213483568
13
- expect_equal(space_age(seconds),
14
- 280.88
15
- )
10
+ seconds <- 2134835688
11
+ expect_equal(space_age(seconds, "mercury"), 280.88)
16
12
  })
17
13
 
18
14
  test_that("Age on Venus", {
19
15
  seconds <- 189839836
20
- expect_equal(space_age(seconds),
21
- 9.78
22
- )
16
+ expect_equal(space_age(seconds, "venus"), 9.78)
23
17
  })
24
18
 
25
19
  test_that("Age on Mars", {
26
20
  seconds <- 2329871239
27
- expect_equal(space_age(seconds),
28
- 39.25
29
- )
21
+ expect_equal(space_age(seconds, "mars"), 39.25)
30
22
  })
31
23
 
32
24
  test_that("Age on Jupiter", {
33
25
  seconds <- 901876382
34
- expect_equal(space_age(seconds),
35
- 2.41
36
- )
26
+ expect_equal(space_age(seconds, "jupiter"), 2.41)
37
27
  })
38
28
 
39
29
  test_that("Age on Saturn", {
40
30
  seconds <- 3000000000
41
- expect_equal(space_age(seconds),
42
- 3.23
43
- )
31
+ expect_equal(space_age(seconds, "saturn"), 3.23)
44
32
  })
45
33
 
46
34
  test_that("Age on Uranus", {
47
35
  seconds <- 3210123456
48
- expect_equal(space_age(seconds),
49
- 1.21
50
- )
36
+ expect_equal(space_age(seconds,"uranus"), 1.21)
51
37
  })
52
38
 
53
39
  test_that("Age on Neptune", {
54
40
  seconds <- 8210123456
55
- expect_equal(space_age(seconds),
56
- 1.58
57
- )
41
+ expect_equal(space_age(seconds, "neptune"), 1.58)
58
42
  })
59
43
 
60
44
  print("All tests passed!")
@@ -63,6 +63,14 @@
63
63
  "map"
64
64
  ]
65
65
  },
66
+ {
67
+ "slug": "sum-of-multiples",
68
+ "difficulty": 1,
69
+ "topics": [
70
+ "algorithm",
71
+ "borrowing"
72
+ ]
73
+ },
66
74
  {
67
75
  "slug": "grains",
68
76
  "difficulty": 1,
@@ -1,3 +1,3 @@
1
1
  ## Installation
2
2
 
3
- Follow the ["Getting Started" chapter in the Rust book](https://doc.rust-lang.org/book/getting-started.html).
3
+ Methods for installing Rust change as the language evolves. To get up-to-date installation instructions head to the [Rust homepage](https://www.rust-lang.org/) and click the "Install Rust" link.
@@ -1,16 +1,8 @@
1
1
  ## Writing the Code
2
2
 
3
- Write your code in `src/lib.rs`
3
+ Write your code in `src/lib.rs`. Some exercises come with a stub file in `src/lib.rs` that will show you the signatures of the code you'll need to write. If the exercise does not come with a `src/lib.rs` file, create one.
4
4
 
5
- You'll be writing a *library crate*. Code for a crate is stored within the `src/` subdirectory. *Library crates* must contain at least a file named `lib.rs`. For more details, check out the rustlang book [chapter on crates and modules](http://doc.rust-lang.org/stable/book/crates-and-modules.html)
6
-
7
- If you were starting from scratch you could use `cargo new` to create the filestructure: e.g. `cargo new $projectname`.
8
- exercism has already created the projectname directory so you'll need to create `src/lib.rs` manually:
9
-
10
- ```bash
11
- mkdir src
12
- touch src/lib.rs
13
- ```
5
+ The directory must be named `src` and the file must be named `lib.rs` otherwise your code will not compile. For more details, check out the rustlang book [chapter on crates and modules](http://doc.rust-lang.org/stable/book/crates-and-modules.html)
14
6
 
15
7
  ### Running Tests
16
8
 
@@ -24,3 +16,4 @@ Only the first test is enabled by default. After you are ready to pass the next
24
16
 
25
17
  You should try to write as little code possible to get the tests to pass. Let the test failures guide you to what should be written next.
26
18
 
19
+ Because Rust checks all code at compile time you may find that your tests won't compile until you write the required code. Even `ignore`d tests are checked at compile time. You can [comment out](https://doc.rust-lang.org/stable/book/comments.html) tests that won't compile by starting each line with a `//`. Then, when you're ready to work on that test, you can un-comment it.
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,3 @@
1
+ [package]
2
+ name = "sum-of-multiples"
3
+ version = "0.0.0"
@@ -0,0 +1,17 @@
1
+ use std::collections::BTreeSet;
2
+
3
+ pub fn sum_of_multiples(limit: u32, factors: &[u32]) -> u32 {
4
+ let mut multiples: BTreeSet<u32> = BTreeSet::new();
5
+
6
+ for &f in factors {
7
+ let mut multiplier = 2;
8
+ let mut x = f;
9
+ while x < limit {
10
+ multiples.insert(x);
11
+ x = f * multiplier;
12
+ multiplier += 1;
13
+ }
14
+ }
15
+
16
+ multiples.iter().sum()
17
+ }
@@ -0,0 +1,74 @@
1
+ extern crate sum_of_multiples;
2
+
3
+ use sum_of_multiples::*;
4
+
5
+ #[test]
6
+ fn multiples_one() {
7
+ assert_eq!(0, sum_of_multiples(1, &vec![3, 5]))
8
+ }
9
+
10
+ #[test]
11
+ #[ignore]
12
+ fn multiples_two() {
13
+ assert_eq!(3, sum_of_multiples(4, &vec![3, 5]))
14
+ }
15
+
16
+ #[test]
17
+ #[ignore]
18
+ fn multiples_three() {
19
+ assert_eq!(23, sum_of_multiples(10, &vec![3, 5]))
20
+ }
21
+
22
+ #[test]
23
+ #[ignore]
24
+ fn multiples_four() {
25
+ assert_eq!(2318, sum_of_multiples(100, &vec![3, 5]))
26
+ }
27
+
28
+ #[test]
29
+ #[ignore]
30
+ fn multiples_five() {
31
+ assert_eq!(233168, sum_of_multiples(1000, &vec![3, 5]))
32
+ }
33
+
34
+ #[test]
35
+ #[ignore]
36
+ fn multiples_six() {
37
+ assert_eq!(51, sum_of_multiples(20, &vec![7, 13, 17]))
38
+ }
39
+
40
+ #[test]
41
+ #[ignore]
42
+ fn multiples_seven() {
43
+ assert_eq!(30, sum_of_multiples(15, &vec![4, 6]))
44
+ }
45
+
46
+ #[test]
47
+ #[ignore]
48
+ fn multiples_eight() {
49
+ assert_eq!(4419, sum_of_multiples(150, &vec![5, 6, 8]))
50
+ }
51
+
52
+ #[test]
53
+ #[ignore]
54
+ fn multiples_nine() {
55
+ assert_eq!(275, sum_of_multiples(51, &vec![5, 25]))
56
+ }
57
+
58
+ #[test]
59
+ #[ignore]
60
+ fn multiples_ten() {
61
+ assert_eq!(2203160, sum_of_multiples(10000, &vec![43, 47]))
62
+ }
63
+
64
+ #[test]
65
+ #[ignore]
66
+ fn multiples_eleven() {
67
+ assert_eq!(4950, sum_of_multiples(100, &vec![1]))
68
+ }
69
+
70
+ #[test]
71
+ #[ignore]
72
+ fn multiples_twelve() {
73
+ assert_eq!(0, sum_of_multiples(10000, &vec![]))
74
+ }
@@ -23,6 +23,7 @@ raindrops | case (or `format`). Mutable string
23
23
  bob | chars, string functions
24
24
  beer-song | case, string concatenation, vector (optional), loop
25
25
  difference-of-squares | fold & map
26
+ sum-of-multiples | algorithm, borrowing
26
27
  grains | math, panic
27
28
 
28
29
  ## Getting Rusty
@@ -1,6 +1,6 @@
1
1
  import scala.math.pow
2
2
 
3
- class Squares {
3
+ object Squares {
4
4
 
5
5
  def sumOfSquares(n: Int): Int = n * (n + 1) * (2 * n + 1) / 6
6
6
 
@@ -8,7 +8,3 @@ class Squares {
8
8
 
9
9
  def difference(n: Int): Int = squareOfSums(n) - sumOfSquares(n)
10
10
  }
11
-
12
- object Squares {
13
- def apply() = new Squares
14
- }
@@ -2,55 +2,55 @@ import org.scalatest.{Matchers, FlatSpec}
2
2
 
3
3
  class SquaresTest extends FlatSpec with Matchers {
4
4
  it should "calc square of sums to 5" in {
5
- val result = Squares().squareOfSums(5)
5
+ val result = Squares.squareOfSums(5)
6
6
  result should equal (225)
7
7
  }
8
8
 
9
9
  it should "calc sum of squares to 5" in {
10
10
  pending
11
- val result = Squares().sumOfSquares(5)
11
+ val result = Squares.sumOfSquares(5)
12
12
  result should equal (55)
13
13
  }
14
14
 
15
15
  it should "calc difference of sums to 5" in {
16
16
  pending
17
- val result = Squares().difference(5)
17
+ val result = Squares.difference(5)
18
18
  result should equal (170)
19
19
  }
20
20
 
21
21
  it should "calc square of sums to 10" in {
22
22
  pending
23
- val result = Squares().squareOfSums(10)
23
+ val result = Squares.squareOfSums(10)
24
24
  result should equal (3025)
25
25
  }
26
26
 
27
27
  it should "calc sum of squares to 10" in {
28
28
  pending
29
- val result = Squares().sumOfSquares(10)
29
+ val result = Squares.sumOfSquares(10)
30
30
  result should equal (385)
31
31
  }
32
32
 
33
33
  it should "calc difference of sums to 10" in {
34
34
  pending
35
- val result = Squares().difference(10)
35
+ val result = Squares.difference(10)
36
36
  result should equal (2640)
37
37
  }
38
38
 
39
39
  it should "calc square of sums to 100" in {
40
40
  pending
41
- val result = Squares().squareOfSums(100)
41
+ val result = Squares.squareOfSums(100)
42
42
  result should equal (25502500)
43
43
  }
44
44
 
45
45
  it should "calc sum of squares to 100" in {
46
46
  pending
47
- val result = Squares().sumOfSquares(100)
47
+ val result = Squares.sumOfSquares(100)
48
48
  result should equal (338350)
49
49
  }
50
50
 
51
51
  it should "calc difference of sums to 100" in {
52
52
  pending
53
- val result = Squares().difference(100)
53
+ val result = Squares.difference(100)
54
54
  result should equal (25164150)
55
55
  }
56
56
  }
@@ -1,21 +1,18 @@
1
1
  import scala.util.Random
2
2
 
3
- class Robot {
4
- private var _name: String = makeName
5
-
6
- def name: String = _name
7
-
8
- def reset(): Unit = _name = makeName
9
-
10
- private def makeName = prefix + suffix
11
-
12
- private def prefix = Random.shuffle(Robot.alphabet).take(2).mkString
13
-
14
- private def suffix = Random.shuffle(Robot.suffixes).head.toString
3
+ object UniqueNames {
4
+ val names =
5
+ Random.shuffle(1 to 26 * 26 * 1000).iterator.map(n => {
6
+ val lettersPart = n / 1000
7
+ val firstLetter = 'A' + (lettersPart / 26)
8
+ val secondLetter = 'A' + (lettersPart % 26)
9
+ f"$firstLetter%c$secondLetter%c${n % 1000}%03d"
10
+ })
15
11
  }
16
12
 
17
- object Robot {
18
- private val alphabet: Seq[Char] = 'A'.to('Z').toList
13
+ class Robot {
14
+ private var storedName = UniqueNames.names.next()
19
15
 
20
- private val suffixes: Seq[Int] = 100.to(999).toList
21
- }
16
+ def name: String = storedName
17
+ def reset(): Unit = storedName = UniqueNames.names.next()
18
+ }
@@ -1,10 +1,12 @@
1
1
  import org.scalatest._
2
2
 
3
+ import collection.mutable
4
+
3
5
  class RobotNameSpecs extends FunSpec with Matchers {
4
6
  val nameRegex = """[A-Z]{2}\d{3}"""
5
7
 
6
8
  it ("has a name") {
7
- new Robot().name should fullyMatch regex (nameRegex)
9
+ new Robot().name should fullyMatch regex nameRegex
8
10
  }
9
11
 
10
12
  it ("does not change its name") {
@@ -16,7 +18,7 @@ class RobotNameSpecs extends FunSpec with Matchers {
16
18
 
17
19
  it ("does not have the same name as other robots") {
18
20
  pending
19
- new Robot().name should not be (new Robot().name)
21
+ new Robot().name should not be new Robot().name
20
22
  }
21
23
 
22
24
  it ("can have its name reset") {
@@ -25,7 +27,22 @@ class RobotNameSpecs extends FunSpec with Matchers {
25
27
  val name = robot.name
26
28
  robot.reset()
27
29
  val name2 = robot.name
28
- name should not equal (name2)
29
- name2 should fullyMatch regex (nameRegex)
30
+ name should not equal name2
31
+ name2 should fullyMatch regex nameRegex
32
+ }
33
+
34
+ // Making this test pass is an optional extra exercise, should you want more of a challenge.
35
+ // It's ignored by default, to make it run, simply change "ignore" below to "it".
36
+ // There are 26^2 * 1,000 = 676,000 possible robot names - you have to ensure that none are repeated.
37
+ // The Robot code needs to be efficient enough to allow all 676,000 unique names to be generated.
38
+ ignore("a large number of new instances have unique names") {
39
+ val alreadySet = mutable.HashSet.empty[String]
40
+ for(_ <- 0 until 676000 - 6) { // as 6 robot names are generated in the tests above!!
41
+ val name = new Robot().name
42
+ if (alreadySet contains name) {
43
+ fail(s"$name is repeated")
44
+ }
45
+ alreadySet += name
46
+ }
30
47
  }
31
48
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  This guide explains how to create and configure a Swift-based Xcode project for Exercism.
4
4
 
5
- Apple does not support user-defined project templates in Xcode, and the default templates are more elaborate than what is needed for Exercism. This guide bridges that gap.
5
+ Apple does not support user-defined project templates in Xcode, and the default templates are more elaborate than those needed for Exercism. This guide bridges that gap.
6
6
 
7
7
  These instructions are written with the expectation that some readers will be very new to Xcode. Therefore each step is described in excruciating detail. However, after a few projects, setting up a fresh project should only take a minute.
8
8
 
@@ -78,13 +78,13 @@ In the Finder, locate the root folder `hello-world` for this exercise. Drag the
78
78
 
79
79
  ![tests_009-importTestSource](/docs/img/tests_009-importTestSource.png)
80
80
 
81
- Select the newly imported file in the File Inspector to open the source code. Add the line `@testable import HelloWorld` above the class declaration. (When the Xcode project name contains a hyphen, replace it with an underscore. For example, `Word-Count` would become `Word-Count`.) The image below shows how the document should appear. Red errors are likely at this stage, and normal.
81
+ Select the newly imported file in the File Inspector to open the source code. Add the line `@testable import HelloWorld` above the class declaration. (When the Xcode project name contains a hyphen, replace it with an underscore. For example, `Word-Count` would become `Word_Count`.) The image below shows how the document should appear. Red errors are likely at this stage, and normal.
82
82
 
83
83
  ![tests_010-testsImportExample](/docs/img/tests_010-testsImportExample.png)
84
84
 
85
85
  Here is how the file inspector should look now:
86
86
 
87
- ![011-finallayoutexample](/docs/img/011-finalLayoutExample.png)
87
+ ![011-finallayoutexample](/docs/img/tests_011-finalLayoutExample.png)
88
88
 
89
89
  The housekeeping is finished and Xcode is ready! To review:
90
90
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trackler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.5.4
4
+ version: 2.0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-19 00:00:00.000000000 Z
11
+ date: 2016-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -5456,6 +5456,10 @@ files:
5456
5456
  - tracks/purescript/docs/LEARNING.md
5457
5457
  - tracks/purescript/docs/RESOURCES.md
5458
5458
  - tracks/purescript/docs/TESTS.md
5459
+ - tracks/purescript/exercises/acronym/bower.json
5460
+ - tracks/purescript/exercises/acronym/examples/src/Acronym.purs
5461
+ - tracks/purescript/exercises/acronym/src/Acronym.purs
5462
+ - tracks/purescript/exercises/acronym/test/Main.purs
5459
5463
  - tracks/purescript/exercises/bob/bower.json
5460
5464
  - tracks/purescript/exercises/bob/examples/src/Bob.purs
5461
5465
  - tracks/purescript/exercises/bob/src/Bob.purs
@@ -6307,6 +6311,10 @@ files:
6307
6311
  - tracks/rust/exercises/sublist/Cargo.toml
6308
6312
  - tracks/rust/exercises/sublist/example.rs
6309
6313
  - tracks/rust/exercises/sublist/tests/sublist.rs
6314
+ - tracks/rust/exercises/sum-of-multiples/.gitignore
6315
+ - tracks/rust/exercises/sum-of-multiples/Cargo.toml
6316
+ - tracks/rust/exercises/sum-of-multiples/example.rs
6317
+ - tracks/rust/exercises/sum-of-multiples/tests/sum-of-multiples.rs
6310
6318
  - tracks/rust/exercises/tournament/.gitignore
6311
6319
  - tracks/rust/exercises/tournament/Cargo.lock
6312
6320
  - tracks/rust/exercises/tournament/Cargo.toml