trackler 2.2.1.76 → 2.2.1.77
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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/beer-song/canonical-data.json +33 -17
- data/problem-specifications/exercises/binary-search/canonical-data.json +41 -21
- data/problem-specifications/exercises/book-store/canonical-data.json +58 -30
- data/problem-specifications/exercises/two-fer/metadata.yml +1 -1
- data/tracks/bash/config.json +35 -13
- data/tracks/bash/exercises/acronym/README.md +27 -0
- data/tracks/bash/exercises/acronym/acronym.sh +18 -0
- data/tracks/bash/exercises/acronym/acronym_tests.sh +43 -0
- data/tracks/bash/exercises/acronym/example.sh +18 -0
- data/tracks/bash/exercises/armstrong-numbers/README.md +20 -0
- data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +58 -0
- data/tracks/bash/exercises/armstrong-numbers/example.sh +19 -0
- data/tracks/clojure/config.json +8 -0
- data/tracks/clojure/exercises/two-fer/README.md +19 -0
- data/tracks/clojure/exercises/two-fer/project.clj +4 -0
- data/tracks/clojure/exercises/two-fer/src/example.clj +5 -0
- data/tracks/clojure/exercises/two-fer/src/two_fer.clj +5 -0
- data/tracks/clojure/exercises/two-fer/test/two_fer_test.clj +12 -0
- data/tracks/common-lisp/docs/INSTALLATION.md +26 -0
- data/tracks/go/exercises/kindergarten-garden/kindergarten_garden_test.go +1 -1
- data/tracks/go/exercises/reverse-string/reverse_string_test.go +8 -0
- data/tracks/java/config.json +34 -11
- data/tracks/java/exercises/armstrong-numbers/.meta/src/reference/java/ArmstrongNumbers.java +20 -0
- data/tracks/java/exercises/armstrong-numbers/.meta/version +1 -0
- data/tracks/java/exercises/armstrong-numbers/README.md +30 -0
- data/tracks/java/exercises/armstrong-numbers/build.gradle +18 -0
- data/tracks/java/exercises/armstrong-numbers/src/main/java/ArmstrongNumbers.java +9 -0
- data/tracks/java/exercises/armstrong-numbers/src/test/java/ArmstrongNumbersTest.java +80 -0
- data/tracks/java/exercises/proverb/.meta/src/reference/java/Proverb.java +19 -0
- data/tracks/java/exercises/proverb/README.md +29 -0
- data/tracks/java/exercises/proverb/build.gradle +18 -0
- data/tracks/java/exercises/proverb/src/main/java/Proverb.java +11 -0
- data/tracks/java/exercises/proverb/src/test/java/ProverbTest.java +80 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/perl6/config.json +1 -1
- data/tracks/python/exercises/alphametics/example.py +168 -90
- data/tracks/swift/config.json +16 -0
- data/tracks/swift/exercises/list-ops/Package.swift +5 -0
- data/tracks/swift/exercises/list-ops/README.md +16 -0
- data/tracks/swift/exercises/list-ops/Sources/ListOps.swift +1 -0
- data/tracks/swift/exercises/list-ops/Sources/ListOpsExample.swift +81 -0
- data/tracks/swift/exercises/list-ops/Tests/LinuxMain.swift +6 -0
- data/tracks/swift/exercises/list-ops/Tests/ListOpsTests/ListOpsTests.swift +110 -0
- metadata +31 -2
data/tracks/swift/config.json
CHANGED
@@ -184,6 +184,22 @@
|
|
184
184
|
"unlocked_by": null,
|
185
185
|
"uuid": "066d2666-deeb-4d99-8314-36d72fbf9afd"
|
186
186
|
},
|
187
|
+
{
|
188
|
+
"uuid": "cf91efe6-0c6f-4c6f-b3da-e828dff03ad9",
|
189
|
+
"slug": "list-ops",
|
190
|
+
"core": false,
|
191
|
+
"unlocked_by": null,
|
192
|
+
"difficulty": 2,
|
193
|
+
"topics": [
|
194
|
+
"variables",
|
195
|
+
"lists",
|
196
|
+
"loops",
|
197
|
+
"filtering",
|
198
|
+
"searching",
|
199
|
+
"conditionals",
|
200
|
+
"functional_programming"
|
201
|
+
]
|
202
|
+
},
|
187
203
|
{
|
188
204
|
"core": false,
|
189
205
|
"difficulty": 3,
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# List Ops
|
2
|
+
|
3
|
+
Implement basic list operations.
|
4
|
+
|
5
|
+
In functional languages list operations like `length`, `map`, and
|
6
|
+
`reduce` are very common. Implement a series of basic list operations,
|
7
|
+
without using existing functions.
|
8
|
+
|
9
|
+
## Setup
|
10
|
+
|
11
|
+
Go through the project setup instructions for Xcode using Swift:
|
12
|
+
|
13
|
+
http://exercism.io/languages/swift
|
14
|
+
|
15
|
+
## Submitting Incomplete Solutions
|
16
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1 @@
|
|
1
|
+
//Solution goes in Sources
|
@@ -0,0 +1,81 @@
|
|
1
|
+
struct ListOps {
|
2
|
+
|
3
|
+
static func append<T: Equatable>(_ array1: [T], _ array2: [T]) -> [T] {
|
4
|
+
var result = array1
|
5
|
+
for value in array2 {
|
6
|
+
result.append(value)
|
7
|
+
}
|
8
|
+
|
9
|
+
return result
|
10
|
+
}
|
11
|
+
|
12
|
+
static func concat<T: Equatable>(_ arrays: [T]...) -> [T] {
|
13
|
+
var result = [T]()
|
14
|
+
|
15
|
+
for array in arrays {
|
16
|
+
result = append(result, array)
|
17
|
+
}
|
18
|
+
|
19
|
+
return result
|
20
|
+
}
|
21
|
+
|
22
|
+
static func filter<T: Equatable>(_ array: [T], predicate: (T) -> Bool) -> [T] {
|
23
|
+
var filtered = [T]()
|
24
|
+
for value in array {
|
25
|
+
if predicate(value) {
|
26
|
+
filtered.append(value)
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
return filtered
|
31
|
+
}
|
32
|
+
|
33
|
+
static func length<T>(_ array: [T]) -> Int {
|
34
|
+
var length = 0
|
35
|
+
|
36
|
+
for _ in array {
|
37
|
+
length += 1
|
38
|
+
}
|
39
|
+
|
40
|
+
return length
|
41
|
+
}
|
42
|
+
|
43
|
+
static func map<T: Equatable>(_ array: [T], transform: (T) -> T) -> [T] {
|
44
|
+
var result = [T]()
|
45
|
+
|
46
|
+
for value in array {
|
47
|
+
result.append(transform(value))
|
48
|
+
}
|
49
|
+
|
50
|
+
return result
|
51
|
+
}
|
52
|
+
|
53
|
+
static func foldLeft<T: Equatable>(_ array: [T], accumulated: T, combine: (T, T) -> T) -> T {
|
54
|
+
if length(array) == 0 {
|
55
|
+
return accumulated
|
56
|
+
} else {
|
57
|
+
return foldLeft(Array(array.dropFirst()), accumulated: combine(accumulated, array[0]), combine: combine)
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
static func foldRight<T: Equatable>(_ array: [T], accumulated: T, combine: (T, T) -> T) -> T {
|
62
|
+
if length(array) == 0 {
|
63
|
+
return accumulated
|
64
|
+
} else {
|
65
|
+
return combine(array[0], foldRight(Array(array.dropFirst()), accumulated: accumulated, combine: combine))
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
static func reverse<T: Equatable>(_ array: [T]) -> [T] {
|
70
|
+
var result = [T]()
|
71
|
+
var index = length(array) - 1
|
72
|
+
|
73
|
+
while index >= 0 {
|
74
|
+
result.append(array[index])
|
75
|
+
index -= 1
|
76
|
+
}
|
77
|
+
|
78
|
+
return result
|
79
|
+
}
|
80
|
+
|
81
|
+
}
|
@@ -0,0 +1,110 @@
|
|
1
|
+
import XCTest
|
2
|
+
@testable import ListOps
|
3
|
+
|
4
|
+
class ListOpsTests: XCTestCase {
|
5
|
+
|
6
|
+
func testAppendEmptyLists() {
|
7
|
+
XCTAssertEqual(ListOps.append([Int](), []), [])
|
8
|
+
}
|
9
|
+
|
10
|
+
func testAppendEmptyListToList() {
|
11
|
+
XCTAssertEqual(ListOps.append([], [1, 2, 3, 4]), [1, 2, 3, 4])
|
12
|
+
}
|
13
|
+
|
14
|
+
func testAppendNonemptyLists() {
|
15
|
+
XCTAssertEqual(ListOps.append([1, 2], [2, 3, 4, 5]), [1, 2, 2, 3, 4, 5])
|
16
|
+
}
|
17
|
+
|
18
|
+
func testConcatEmptyList() {
|
19
|
+
XCTAssertEqual(ListOps.concat([Int]()), [])
|
20
|
+
}
|
21
|
+
|
22
|
+
func testConcatListOfLists() {
|
23
|
+
XCTAssertEqual(ListOps.concat([1, 2], [3], [], [4, 5, 6]), [1, 2, 3, 4, 5, 6])
|
24
|
+
}
|
25
|
+
|
26
|
+
func testFilterEmptyList() {
|
27
|
+
XCTAssertEqual(ListOps.filter([]) { $0 % 2 == 1 }, [])
|
28
|
+
}
|
29
|
+
|
30
|
+
func testFilterNonemptyList() {
|
31
|
+
XCTAssertEqual(ListOps.filter([1, 2, 3, 4, 5]) { $0 % 2 == 1 }, [1, 3, 5])
|
32
|
+
}
|
33
|
+
|
34
|
+
func testLengthEmptyList() {
|
35
|
+
XCTAssertEqual(ListOps.length([]), 0)
|
36
|
+
}
|
37
|
+
|
38
|
+
func testLengthNonemptyList() {
|
39
|
+
XCTAssertEqual(ListOps.length([1, 2, 3, 4]), 4)
|
40
|
+
}
|
41
|
+
|
42
|
+
func testMapEmptyList() {
|
43
|
+
XCTAssertEqual(ListOps.map([]) { $0 + 1 }, [])
|
44
|
+
}
|
45
|
+
|
46
|
+
func testMapNonemptyList() {
|
47
|
+
XCTAssertEqual(ListOps.map([1, 3, 5, 7]) { $0 + 1 }, [2, 4, 6, 8])
|
48
|
+
}
|
49
|
+
|
50
|
+
func testFoldLeftEmptyList() {
|
51
|
+
XCTAssertEqual(ListOps.foldLeft([], accumulated: 2, combine: +), 2)
|
52
|
+
}
|
53
|
+
|
54
|
+
func testFoldLeftNonemptyListAddition() {
|
55
|
+
XCTAssertEqual(ListOps.foldLeft([1, 2, 3, 4], accumulated: 5, combine: +), 15)
|
56
|
+
}
|
57
|
+
|
58
|
+
func testFoldLeftNonemptyListDivision() {
|
59
|
+
XCTAssertEqual(ListOps.foldLeft([2, 5], accumulated: 5, combine: /), 0)
|
60
|
+
}
|
61
|
+
|
62
|
+
func testFoldRightEmptyList() {
|
63
|
+
XCTAssertEqual(ListOps.foldRight([], accumulated: 2, combine: *), 2)
|
64
|
+
}
|
65
|
+
|
66
|
+
func testFoldRightNonemptyListAddition() {
|
67
|
+
XCTAssertEqual(ListOps.foldRight([1, 2, 3, 4], accumulated: 5, combine: +), 15)
|
68
|
+
}
|
69
|
+
|
70
|
+
func testFoldRightNonemptyListDivision() {
|
71
|
+
XCTAssertEqual(ListOps.foldRight([2, 5], accumulated: 5, combine: /), 2)
|
72
|
+
}
|
73
|
+
|
74
|
+
func testFoldRightAddString() {
|
75
|
+
XCTAssertEqual(ListOps.foldRight(["e", "x", "e", "r", "c", "i", "s", "m"], accumulated: "!", combine: +), "exercism!")
|
76
|
+
}
|
77
|
+
|
78
|
+
func testReverseEmptyList() {
|
79
|
+
XCTAssertEqual(ListOps.reverse([Int]()), [])
|
80
|
+
}
|
81
|
+
|
82
|
+
func testReverseNonemptyList() {
|
83
|
+
XCTAssertEqual(ListOps.reverse([1, 3, 5, 7]), [7, 5, 3, 1])
|
84
|
+
}
|
85
|
+
|
86
|
+
static var allTests: [(String, (ListOpsTests) -> () throws -> Void)] {
|
87
|
+
return [
|
88
|
+
("testAppendEmptyLists", testAppendEmptyLists),
|
89
|
+
("testAppendEmptyListToList", testAppendEmptyListToList),
|
90
|
+
("testAppendNonemptyLists", testAppendNonemptyLists),
|
91
|
+
("testConcatEmptyList", testConcatEmptyList),
|
92
|
+
("testConcatListOfLists", testConcatListOfLists),
|
93
|
+
("testFilterEmptyList", testFilterEmptyList),
|
94
|
+
("testFilterNonemptyList", testFilterNonemptyList),
|
95
|
+
("testLengthEmptyList", testLengthEmptyList),
|
96
|
+
("testLengthNonemptyList", testLengthNonemptyList),
|
97
|
+
("testMapEmptyList", testMapEmptyList),
|
98
|
+
("testMapNonemptyList", testMapNonemptyList),
|
99
|
+
("testFoldLeftEmptyList", testFoldLeftEmptyList),
|
100
|
+
("testFoldLeftNonemptyListAddition", testFoldLeftNonemptyListAddition),
|
101
|
+
("testFoldLeftNonemptyListDivision", testFoldLeftNonemptyListDivision),
|
102
|
+
("testFoldRightEmptyList", testFoldRightEmptyList),
|
103
|
+
("testFoldRightNonemptyListAddition", testFoldRightNonemptyListAddition),
|
104
|
+
("testFoldRightNonemptyListDivision", testFoldRightNonemptyListDivision),
|
105
|
+
("testFoldRightAddString", testFoldRightAddString),
|
106
|
+
("testReverseEmptyList", testReverseEmptyList),
|
107
|
+
("testReverseNonemptyList", testReverseNonemptyList),
|
108
|
+
]
|
109
|
+
}
|
110
|
+
}
|
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.2.1.
|
4
|
+
version: 2.2.1.77
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -600,9 +600,16 @@ files:
|
|
600
600
|
- tracks/bash/docs/RESOURCES.md
|
601
601
|
- tracks/bash/docs/SNIPPET.txt
|
602
602
|
- tracks/bash/docs/TESTS.md
|
603
|
+
- tracks/bash/exercises/acronym/README.md
|
604
|
+
- tracks/bash/exercises/acronym/acronym.sh
|
605
|
+
- tracks/bash/exercises/acronym/acronym_tests.sh
|
606
|
+
- tracks/bash/exercises/acronym/example.sh
|
603
607
|
- tracks/bash/exercises/anagram/README.md
|
604
608
|
- tracks/bash/exercises/anagram/anagram_tests.sh
|
605
609
|
- tracks/bash/exercises/anagram/example.sh
|
610
|
+
- tracks/bash/exercises/armstrong-numbers/README.md
|
611
|
+
- tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh
|
612
|
+
- tracks/bash/exercises/armstrong-numbers/example.sh
|
606
613
|
- tracks/bash/exercises/atbash-cipher/README.md
|
607
614
|
- tracks/bash/exercises/atbash-cipher/atbash_cipher_tests.sh
|
608
615
|
- tracks/bash/exercises/atbash-cipher/example.sh
|
@@ -1664,6 +1671,11 @@ files:
|
|
1664
1671
|
- tracks/clojure/exercises/trinary/project.clj
|
1665
1672
|
- tracks/clojure/exercises/trinary/src/example.clj
|
1666
1673
|
- tracks/clojure/exercises/trinary/test/trinary_test.clj
|
1674
|
+
- tracks/clojure/exercises/two-fer/README.md
|
1675
|
+
- tracks/clojure/exercises/two-fer/project.clj
|
1676
|
+
- tracks/clojure/exercises/two-fer/src/example.clj
|
1677
|
+
- tracks/clojure/exercises/two-fer/src/two_fer.clj
|
1678
|
+
- tracks/clojure/exercises/two-fer/test/two_fer_test.clj
|
1667
1679
|
- tracks/clojure/exercises/word-count/README.md
|
1668
1680
|
- tracks/clojure/exercises/word-count/project.clj
|
1669
1681
|
- tracks/clojure/exercises/word-count/src/example.clj
|
@@ -7109,6 +7121,12 @@ files:
|
|
7109
7121
|
- tracks/java/exercises/anagram/build.gradle
|
7110
7122
|
- tracks/java/exercises/anagram/src/main/java/.keep
|
7111
7123
|
- tracks/java/exercises/anagram/src/test/java/AnagramTest.java
|
7124
|
+
- tracks/java/exercises/armstrong-numbers/.meta/src/reference/java/ArmstrongNumbers.java
|
7125
|
+
- tracks/java/exercises/armstrong-numbers/.meta/version
|
7126
|
+
- tracks/java/exercises/armstrong-numbers/README.md
|
7127
|
+
- tracks/java/exercises/armstrong-numbers/build.gradle
|
7128
|
+
- tracks/java/exercises/armstrong-numbers/src/main/java/ArmstrongNumbers.java
|
7129
|
+
- tracks/java/exercises/armstrong-numbers/src/test/java/ArmstrongNumbersTest.java
|
7112
7130
|
- tracks/java/exercises/atbash-cipher/.meta/src/reference/java/Atbash.java
|
7113
7131
|
- tracks/java/exercises/atbash-cipher/README.md
|
7114
7132
|
- tracks/java/exercises/atbash-cipher/build.gradle
|
@@ -7427,6 +7445,11 @@ files:
|
|
7427
7445
|
- tracks/java/exercises/protein-translation/build.gradle
|
7428
7446
|
- tracks/java/exercises/protein-translation/src/main/java/ProteinTranslator.java
|
7429
7447
|
- tracks/java/exercises/protein-translation/src/test/java/ProteinTranslatorTest.java
|
7448
|
+
- tracks/java/exercises/proverb/.meta/src/reference/java/Proverb.java
|
7449
|
+
- tracks/java/exercises/proverb/README.md
|
7450
|
+
- tracks/java/exercises/proverb/build.gradle
|
7451
|
+
- tracks/java/exercises/proverb/src/main/java/Proverb.java
|
7452
|
+
- tracks/java/exercises/proverb/src/test/java/ProverbTest.java
|
7430
7453
|
- tracks/java/exercises/pythagorean-triplet/.meta/src/reference/java/PythagoreanTriplet.java
|
7431
7454
|
- tracks/java/exercises/pythagorean-triplet/README.md
|
7432
7455
|
- tracks/java/exercises/pythagorean-triplet/build.gradle
|
@@ -13538,6 +13561,12 @@ files:
|
|
13538
13561
|
- tracks/swift/exercises/linked-list/Sources/LinkedListExample.swift
|
13539
13562
|
- tracks/swift/exercises/linked-list/Tests/LinkedListTests/LinkedListTests.swift
|
13540
13563
|
- tracks/swift/exercises/linked-list/Tests/LinuxMain.swift
|
13564
|
+
- tracks/swift/exercises/list-ops/Package.swift
|
13565
|
+
- tracks/swift/exercises/list-ops/README.md
|
13566
|
+
- tracks/swift/exercises/list-ops/Sources/ListOps.swift
|
13567
|
+
- tracks/swift/exercises/list-ops/Sources/ListOpsExample.swift
|
13568
|
+
- tracks/swift/exercises/list-ops/Tests/LinuxMain.swift
|
13569
|
+
- tracks/swift/exercises/list-ops/Tests/ListOpsTests/ListOpsTests.swift
|
13541
13570
|
- tracks/swift/exercises/luhn/.gitignore
|
13542
13571
|
- tracks/swift/exercises/luhn/Package.swift
|
13543
13572
|
- tracks/swift/exercises/luhn/README.md
|