trackler 2.0.8.11 → 2.0.8.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/common/README.md +70 -15
  3. data/common/canonical-schema.json +137 -0
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/elixir/config.json +7 -0
  6. data/tracks/elixir/exercises/simple-linked-list/example.exs +86 -0
  7. data/tracks/elixir/exercises/simple-linked-list/linked_list.exs +83 -0
  8. data/tracks/elixir/exercises/simple-linked-list/linked_list_test.exs +154 -0
  9. data/tracks/factor/README.md +0 -6
  10. data/tracks/factor/config.json +13 -3
  11. data/tracks/factor/docs/INSTALLATION.md +26 -29
  12. data/tracks/factor/exercises/hello-world/hello-world-example.factor +2 -2
  13. data/tracks/factor/exercises/leap/leap-example.factor +9 -0
  14. data/tracks/factor/exercises/leap/leap-tests.factor +32 -0
  15. data/tracks/go/exercises/phone-number/phone_number_test.go +5 -2
  16. data/tracks/go/exercises/pig-latin/example.go +2 -0
  17. data/tracks/go/exercises/pig-latin/pig_latin_test.go +8 -0
  18. data/tracks/java/config.json +5 -0
  19. data/tracks/java/exercises/anagram/src/test/java/AnagramTest.java +14 -0
  20. data/tracks/java/exercises/ocr-numbers/build.gradle +17 -0
  21. data/tracks/java/exercises/ocr-numbers/src/example/java/Digit.java +63 -0
  22. data/tracks/java/exercises/ocr-numbers/src/example/java/OpticalCharacterReader.java +67 -0
  23. data/tracks/java/exercises/ocr-numbers/src/main/java/OpticalCharacterReader.java +5 -0
  24. data/tracks/java/exercises/ocr-numbers/src/test/java/OpticalCharacterReaderTest.java +248 -0
  25. data/tracks/java/exercises/perfect-numbers/src/example/java/NaturalNumber.java +1 -1
  26. data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +52 -5
  27. data/tracks/java/exercises/settings.gradle +1 -0
  28. data/tracks/java/img/icon.png +0 -0
  29. data/tracks/javascript/exercises/phone-number/phone-number.spec.js +22 -2
  30. data/tracks/julia/exercises/bob/example.jl +1 -1
  31. data/tracks/julia/exercises/custom-set/HINTS.md +2 -0
  32. data/tracks/julia/exercises/custom-set/runtests.jl +2 -2
  33. data/tracks/julia/img/{logo.png → icon.png} +0 -0
  34. data/tracks/julia/img/{logo.svg → icon.svg} +0 -0
  35. data/tracks/prolog/README.md +6 -2
  36. data/tracks/prolog/config.json +1 -1
  37. data/tracks/prolog/img/icon.png +0 -0
  38. data/tracks/scala/exercises/simple-linked-list/build.sbt +3 -0
  39. data/tracks/vimscript/README.md +7 -0
  40. data/tracks/vimscript/img/icon.png +0 -0
  41. metadata +17 -5
  42. data/tracks/vimscript/img/.keep +0 -0
@@ -70,12 +70,6 @@ Here's what you need to do to start working with the Factor code in the `exercis
70
70
 
71
71
  If you think you've found a factual or technical error, or you just have a question or suggestion about some part of the Markdown or Factor documentation, we'd :heart: you to open an issue or pull request.
72
72
 
73
- ## License
74
-
75
- The MIT License (MIT)
76
-
77
- Copyright (c) 2016 Katrina Owen, _@kytrinyx.com
78
-
79
73
  ### [Factor icon](https://github.com/exercism/xfactor/tree/master/img/icon.png)
80
74
 
81
75
  The Factor "Tyrannosaurus Rex" logo is owned by John Benediktsson. We have adapted it, changing the colour scheme, with his permission.
@@ -6,7 +6,8 @@
6
6
  "test_pattern": "TODO",
7
7
 
8
8
  "problems": [
9
- "hello-world"
9
+ "hello-world",
10
+ "leap"
10
11
  ],
11
12
 
12
13
  "exercises": [
@@ -19,6 +20,16 @@
19
20
  "text formatting",
20
21
  "quotations"
21
22
  ]
23
+ },
24
+ {
25
+ "slug": "leap",
26
+ "difficulty": 2,
27
+ "topics": [
28
+ "quotations",
29
+ "word definition",
30
+ "conditionals",
31
+ "logical operators"
32
+ ]
22
33
  }
23
34
  ],
24
35
 
@@ -27,8 +38,7 @@
27
38
 
28
39
  "ignored": [
29
40
  "bin",
30
- "docs",
31
- "exercism-testing"
41
+ "docs"
32
42
  ],
33
43
 
34
44
  "foregone": [
@@ -1,27 +1,19 @@
1
1
  # Installing Factor, and making Factor and Exercism play nice
2
2
 
3
- [**Even if you already have Factor installed, you still need to read the last section of this document for important information about testing Factor code in the Exercism environment.**](#play-nice)
3
+ [**Even if you already have Factor 0.98 installed, you still need to read the last section of this document for important information about testing Factor code in the Exercism environment.**](#play-nice)
4
4
 
5
5
  ---
6
6
 
7
7
  ## Installing Factor
8
8
 
9
- To install Factor, you have a couple of choices.
9
+ To install Factor, you should use a [nightly](#nightly) or [bleeding-edge](#autobuild-from-source) build.
10
10
 
11
- For production servers and mission-critical applications, we recommend a stable binary release from the homepage, but because all commits and pulls are thoroughly tested and carefully reviewed, the [nightly builds](#nightly) and even the [bleeding edge of `git`](#autobuild-from-source) are quite safe.
12
-
13
- ---
14
-
15
- ### Stable
16
-
17
- Download a binary for your platform from <http://factorcode.org>, and run the installer.
18
-
19
- These binaries and sources are typically a few months behind `git`. If you want the latest bugfixes and features (dark mode UI, perhaps?), or if your platform isn't listed on that page (i.e. not Windows, Linux or Mac), then see the ["build from source"](#autobuild-from-source) section below, to obtain the up-to-the-minute version.
11
+ ***The last stable release of Factor was [0.97 released 2 Nov 2014](https://re-factor.blogspot.com/2014/11/factor-097-now-available.html) -- this is quite out of date and not recommended.***
20
12
 
21
13
  ---
22
14
  ### Nightly
23
15
 
24
- The website also provides nightly binaries, built from git. Only builds that pass are shown.
16
+ <http://factorcode.org> also provides nightly binaries, built from git. Only builds that pass are shown.
25
17
 
26
18
  ---
27
19
 
@@ -29,12 +21,15 @@ The website also provides nightly binaries, built from git. Only builds that pas
29
21
 
30
22
  If neither of the above options are good enough for you, and you need all the latest tech, then you will need a modern C++ compiler like GCC >=4.8 or Clang >=3.5, `make`, `curl`, and:
31
23
 
32
- 1. Download the `build` shell script: [**here** for `sh`, `bash`, etc](https://raw.githubusercontent.com/factor/factor/master/build.sh) or [**here** for Windows](https://raw.githubusercontent.com/factor/factor/master/build.cmd). Put it in the directory where Factor should be installed.
33
- 2. Run it with the `install` argument: `./build.sh install`, or `.\build.cmd install` on Windows. This will clone Factor's `git` repository, build it, and download a Factor VM image from <http://factorcode.org>. This process will take between 2 and 20 minutes, depending on the speed of your internet connection and processor.
24
+ 1. Download the `build` shell script: [**here** for Unix-likes / POSIX shells](https://raw.githubusercontent.com/factor/factor/master/build.sh) or [**here** for Windows](https://raw.githubusercontent.com/factor/factor/master/build.cmd). Put it in the directory where Factor should be installed.
25
+
26
+ 2. Run it like `./build.sh install`, or `.\build.cmd install` on Windows. <sub>This will clone Factor's `git` repository, build it, and download a Factor VM image from <http://factorcode.org>. This process will take between 2 and 20 minutes, depending on the speed of your internet connection and processor.</sub>
27
+
34
28
  3. You can now run the generated `factor` or `factor.exe` binary. Try `factor --help` for help. You can also access documentation from the command line, or by pressing <kbd>F1</kbd> in the GUI Listener, which will open the docs browser.
35
- 4. In the future, just `cd` into Factor's cloned repository and type `./build.sh update` or `.\build.cmd update`, respectively, to pull from git and rebuild in-place, and download a new VM image if the checksums differ.
36
29
 
37
- Your tree, from the working directory of the original build script, might look something like this:
30
+ 4. In the future, just `cd` into Factor's installation and type `./build.sh update`, or `.\build.cmd update` on Windows, to pull from git and rebuild in-place, and download a new VM image if one exists.
31
+
32
+ The file structure may now look like this:
38
33
 
39
34
  ```
40
35
  .
@@ -42,24 +37,17 @@ Your tree, from the working directory of the original build script, might look s
42
37
  └── factor
43
38
     ├── basis
44
39
     ├── boot.unix-x86.64.image
45
-    ├── boot.unix-x86.64.image.bak
46
40
     ├── build.cmd
47
41
     ├── build.sh
48
-    ├── checksums.txt
49
42
     ├── core
50
43
     ├── extra
51
44
     ├── factor
52
45
     ├── Factor.app
53
-    ├── factor.bak
54
46
     ├── factor.image
55
-    ├── factor.image.bak
56
-    ├── factor.image.fresh
57
47
     ├── GNUmakefile
58
-    ├── key-log.txt
59
48
     ├── libfactor.a
60
49
     ├── libfactor-ffi-test.so
61
50
     ├── LICENSE.txt
62
-    ├── logs
63
51
     ├── misc
64
52
     ├── Nmakefile
65
53
     ├── README.md
@@ -68,13 +56,13 @@ Your tree, from the working directory of the original build script, might look s
68
56
     └── work
69
57
  ```
70
58
 
71
- You no longer need the top level buildscript.
59
+ You no longer need the top level `build.sh`.
72
60
 
73
61
  ---
74
62
 
75
- ### (Actually) Build from source
63
+ ### Manually build from source
76
64
 
77
- Not recommended as the buildscripts are quite good at touchlessly setting things up, but this may be your only option. In most cases, a simple `make` should suffice.
65
+ Clone the [repository](https://github.com/factor/factor) and use `make` in that folder.
78
66
 
79
67
  If `make` fails with an error about a non-present target, try `make factor` or, if you can read a Makefile, find the make target for your platform in `GNUmakefile`.
80
68
 
@@ -82,12 +70,21 @@ If *that* fails, open an issue on [factor/factor](https://github.com/factor/fact
82
70
 
83
71
  ---
84
72
 
73
+ #### Stable (not recommended)
74
+
75
+ **Note that [the automated test framework](languages/factor/tests) for Factor exercises on Exercism requires at least a [nightly build](#nightly)**.
76
+
77
+ If you *don't* want automated testing or thousands of new features and bugfixes, download a Stable release binary for your platform from <http://factorcode.org>, and run the installer.
78
+
79
+ ---
80
+
85
81
  ## Making Exercism and Factor work together <a name="play-nice"> </a>
86
82
 
87
- Name clashes between Exercism and the Factor standard library, Exercism and Factor's mutual strictness about filenames, and Factor's reluctance to find vocabularies outside its source tree are all **factor**s making it kind of tricky for Exercism users to test their Factor code.
88
83
 
89
- A [wrapper vocabulary](https://github.com/catb0t/exercism.factor) has been written to streamline the Factor workflow in an Exercism context. This vocab allows users like you, and xfactor contributors alike, to use the `tools.test` framework to write tests in a familiar way, but automating and eliminating the manual configuration which was otherwise necessary.
84
+ Due to limitations like name clashes and filename disagreements, it's rather difficult to use `tools.test` on Exercism exercises out of the box.
85
+
86
+ Instead, there is a [wrapper vocabulary](https://github.com/catb0t/exercism.factor) for the Factor workflow in an Exercism context. Users and Exercism maintainers alike can write tests in a familiar way, with much less overhead.
90
87
 
91
- To test your Factor code in your `exercism/factor` folder, just download [exercism.factor](https://github.com/catb0t/exercism.factor/archive/master.zip) and unzip it somewhere Factor can find it. `resource:work/exercism` is a good choice, so `testing.factor` is `resource:work/exercism/testing/testing.factor`.
88
+ To test your Factor solutions in your `exercism/factor` folder, follow the directions in [the README](https://github.com/catb0t/exercism.factor#getting-started).
92
89
 
93
90
  For information on using `exercism.testing`, refer to the [testing documentation](exercism.io/languages/factor#test), or to `exercism.testing`'s documentation by running `"exercism.testing" help` in Factor.
@@ -1,6 +1,6 @@
1
- USING: formatting kernel ;
1
+ USING: formatting kernel sequences ;
2
2
  IN: hello-world
3
3
 
4
4
  : hello-name ( name -- string )
5
- dup "" = [ drop "World" ] when
5
+ dup empty? [ drop "World" ] when
6
6
  "Hello, %s!" sprintf ;
@@ -0,0 +1,9 @@
1
+ USING: formatting kernel math ;
2
+ IN: leap
3
+
4
+ : my-leap-year? ( year -- leap-year? )
5
+ dup odd?
6
+ [ drop f ]
7
+ [ dup [ 100 mod 0 > ] [ 400 mod zero? ] bi or
8
+ [ 4 mod zero? ] dip and
9
+ ] if ;
@@ -0,0 +1,32 @@
1
+ USING: io leap tools.test ;
2
+ IN: leap.tests
3
+
4
+ "Leap year:" print
5
+
6
+ "not very common" print
7
+ { f } [ 2015 my-leap-year? ] unit-test
8
+
9
+ "introduced every 4 years to adjust about a day" print
10
+ { t } [ 2016 my-leap-year? ] unit-test
11
+
12
+ "skipped every 100 years to remove an extra day" print
13
+ { f } [ 1900 my-leap-year? ] unit-test
14
+
15
+ "reintroduced every 400 years to adjust yet another day" print
16
+ { t } [ 2000 my-leap-year? ] unit-test
17
+
18
+
19
+
20
+ "Additional corner cases of leap years:" print
21
+
22
+ "not a leap year" print
23
+ { f } [ 1978 my-leap-year? ] unit-test
24
+
25
+ "a common leap year" print
26
+ { t } [ 1992 my-leap-year? ] unit-test
27
+
28
+ "is skipped every 100 years" print
29
+ { f } [ 2100 my-leap-year? ] unit-test
30
+
31
+ "reintroduced every 400 years" print
32
+ { f } [ 2100 my-leap-year? ] unit-test
@@ -21,10 +21,13 @@ var numberTests = []testCase{
21
21
  {"123456789", "", true},
22
22
  }
23
23
 
24
- func TestNumber(t *testing.T) {
24
+ func TestTestVersion(t *testing.T) {
25
25
  if testVersion != targetTestVersion {
26
- t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
26
+ t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
27
27
  }
28
+ }
29
+
30
+ func TestNumber(t *testing.T) {
28
31
  for _, test := range numberTests {
29
32
  actual, actualErr := Number(test.input)
30
33
  if !test.expectErr {
@@ -5,6 +5,8 @@ import (
5
5
  "strings"
6
6
  )
7
7
 
8
+ const testVersion = 1
9
+
8
10
  var vowel = regexp.MustCompile(`^([aeiou]|y[^aeiou]|xr)[a-z]*`)
9
11
  var cons = regexp.MustCompile(`^([^aeiou]?qu|[^aeiou]+)([a-z]*)`)
10
12
 
@@ -2,6 +2,8 @@ package igpay
2
2
 
3
3
  import "testing"
4
4
 
5
+ const targetTestVersion = 1
6
+
5
7
  var tests = []struct{ pl, in string }{
6
8
  {"appleay", "apple"},
7
9
  {"earay", "ear"},
@@ -20,6 +22,12 @@ var tests = []struct{ pl, in string }{
20
22
  {"xrayay", "xray"},
21
23
  }
22
24
 
25
+ func TestTestVersion(t *testing.T) {
26
+ if testVersion != targetTestVersion {
27
+ t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
28
+ }
29
+ }
30
+
23
31
  func TestPigLatin(t *testing.T) {
24
32
  for _, test := range tests {
25
33
  if pl := PigLatin(test.in); pl != test.pl {
@@ -308,6 +308,11 @@
308
308
  "slug": "list-ops",
309
309
  "difficulty": 1,
310
310
  "topics": []
311
+ },
312
+ {
313
+ "slug": "ocr-numbers",
314
+ "difficulty": 1,
315
+ "topics": []
311
316
  }
312
317
  ],
313
318
  "deprecated": [
@@ -116,4 +116,18 @@ public class AnagramTest {
116
116
  List<String> anagrams = detector.match(Arrays.asList("cashregister", "Carthorse", "radishes"));
117
117
  assertThat(anagrams, hasItem("Carthorse"));
118
118
  }
119
+
120
+ @Ignore
121
+ @Test
122
+ public void testWordIsNotItsOwnAnagram() {
123
+ Anagram detector = new Anagram("banana");
124
+ assertTrue(detector.match(Arrays.asList("Banana")).isEmpty());
125
+ }
126
+
127
+ @Ignore
128
+ @Test
129
+ public void testAnagramMustUseAllLettersExactlyOnce() {
130
+ Anagram detector = new Anagram("tapper");
131
+ assertTrue(detector.match(Arrays.asList("patter")).isEmpty());
132
+ }
119
133
  }
@@ -0,0 +1,17 @@
1
+ apply plugin: "java"
2
+ apply plugin: "eclipse"
3
+ apply plugin: "idea"
4
+
5
+ repositories {
6
+ mavenCentral()
7
+ }
8
+
9
+ dependencies {
10
+ testCompile "junit:junit:4.12"
11
+ }
12
+ test {
13
+ testLogging {
14
+ exceptionFormat = 'full'
15
+ events = ["passed", "failed", "skipped"]
16
+ }
17
+ }
@@ -0,0 +1,63 @@
1
+ import java.util.List;
2
+
3
+ import static java.util.Arrays.asList;
4
+ import static java.util.Arrays.stream;
5
+
6
+ enum Digit {
7
+
8
+ ZERO(asList(" _ ",
9
+ "| |",
10
+ "|_|")),
11
+
12
+ ONE(asList(" ",
13
+ " |",
14
+ " |")),
15
+
16
+ TWO(asList(" _ ",
17
+ " _|",
18
+ "|_ ")),
19
+
20
+ THREE(asList(" _ ",
21
+ " _|",
22
+ " _|")),
23
+
24
+ FOUR(asList(" ",
25
+ "|_|",
26
+ " |")),
27
+
28
+ FIVE(asList(" _ ",
29
+ "|_ ",
30
+ " _|")),
31
+
32
+ SIX(asList(" _ ",
33
+ "|_ ",
34
+ "|_|")),
35
+
36
+ SEVEN(asList(" _ ",
37
+ " |",
38
+ " |")),
39
+
40
+ EIGHT(asList(" _ ",
41
+ "|_|",
42
+ "|_|")),
43
+
44
+ NINE(asList(" _ ",
45
+ "|_|",
46
+ " _|"));
47
+
48
+ private final List<String> ssdRepresentation;
49
+
50
+ Digit(List<String> ssd) {
51
+ this.ssdRepresentation = ssd;
52
+ }
53
+
54
+ static String fromSsdConfiguration(final List<String> ssdConfiguration) {
55
+ return stream(values())
56
+ .filter(digit -> digit.ssdRepresentation.equals(ssdConfiguration))
57
+ .map(Digit::ordinal)
58
+ .map(Object::toString)
59
+ .findFirst()
60
+ .orElse("?");
61
+ }
62
+
63
+ }
@@ -0,0 +1,67 @@
1
+ import java.util.ArrayList;
2
+ import java.util.List;
3
+
4
+ /*
5
+ * This example solution uses the abbreviation "SSD", short for Seven-Segment Display, throughout.
6
+ *
7
+ * For more information, see https://en.wikipedia.org/wiki/Seven-segment_display.
8
+ */
9
+ final class OpticalCharacterReader {
10
+
11
+ private static final int ROWS_PER_LINE = 4;
12
+
13
+ private static final int COLS_PER_SSD = 3;
14
+
15
+ String parse(final List<String> input) {
16
+ validateInput(input);
17
+
18
+ final List<String> parsedLines = new ArrayList<>();
19
+
20
+ for (int nLine = 0; nLine < input.size() / ROWS_PER_LINE; nLine++) {
21
+ final int nFirstRowCurrentLine = nLine * ROWS_PER_LINE;
22
+ final int nFirstRowNextLine = nFirstRowCurrentLine + ROWS_PER_LINE;
23
+
24
+ final List<String> currentLine = input.subList(nFirstRowCurrentLine, nFirstRowNextLine);
25
+ parsedLines.add(parseLine(currentLine));
26
+ }
27
+
28
+ return String.join(",", parsedLines);
29
+ }
30
+
31
+ private String parseLine(final List<String> currentLine) {
32
+ final List<String> parsedDigits = new ArrayList<>();
33
+
34
+ for (int nSsd = 0; nSsd < currentLine.get(0).length() / COLS_PER_SSD; nSsd++) {
35
+ final int nFirstColCurrentSsd = nSsd * COLS_PER_SSD;
36
+ final int nFirstColNextSsd = nFirstColCurrentSsd + COLS_PER_SSD;
37
+
38
+ final List<String> currentSsdConfiguration = new ArrayList<>();
39
+
40
+ // Bottom row of each line is a spacer, so we ignore that row when constructing SSD configurations.
41
+ for (int nRow = 0; nRow < ROWS_PER_LINE - 1; nRow++) {
42
+ currentSsdConfiguration.add(currentLine.get(nRow).substring(nFirstColCurrentSsd, nFirstColNextSsd));
43
+ }
44
+
45
+ parsedDigits.add(Digit.fromSsdConfiguration(currentSsdConfiguration));
46
+ }
47
+
48
+ return String.join("", parsedDigits);
49
+ }
50
+
51
+ private void validateInput(final List<String> input) {
52
+ final int inputRowCount = input.size();
53
+
54
+ if (inputRowCount == 0 || inputRowCount % 4 != 0) {
55
+ throw new IllegalArgumentException(
56
+ "Number of input rows must be a positive multiple of " + ROWS_PER_LINE);
57
+ }
58
+
59
+ final int inputColumnCount = input.get(0).length();
60
+
61
+ if (inputColumnCount == 0 || inputColumnCount % 3 != 0) {
62
+ throw new IllegalArgumentException(
63
+ "Number of input columns must be a positive multiple of " + COLS_PER_SSD);
64
+ }
65
+ }
66
+
67
+ }