trackler 2.0.8.30 → 2.0.8.31
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/common/exercises/wordy/description.md +1 -1
- data/lib/trackler/version.rb +1 -1
- data/tracks/ocaml/exercises/etl/test.ml +26 -24
- data/tracks/ocaml/tools/test-generator/templates/etl/template.ml +19 -0
- data/tracks/swift/.swiftlint.yml +2 -1
- data/tracks/swift/.travis.yml +2 -1
- data/tracks/swift/Dangerfile +6 -3
- data/tracks/swift/Package.swift +1 -1
- data/tracks/swift/exercises/accumulate/Tests/AccumulateTests/AccumulateTests.swift +1 -1
- data/tracks/swift/exercises/acronym/Sources/AcronymExample.swift +3 -3
- data/tracks/swift/exercises/bob/Sources/BobExample.swift +2 -2
- data/tracks/swift/exercises/crypto-square/Sources/CryptoSquareExample.swift +1 -1
- data/tracks/swift/exercises/custom-set/Sources/CustomSetExample.swift +5 -5
- data/tracks/swift/exercises/dominoes/Sources/DominoesExample.swift +6 -6
- data/tracks/swift/exercises/flatten-array/Sources/FlattenArrayExample.swift +1 -1
- data/tracks/swift/exercises/gigasecond/Sources/GigasecondExample.swift +5 -5
- data/tracks/swift/exercises/grains/Sources/GrainsExample.swift +1 -1
- data/tracks/swift/exercises/luhn/Sources/LuhnExample.swift +4 -4
- data/tracks/swift/exercises/meetup/Sources/MeetupExample.swift +8 -8
- data/tracks/swift/exercises/ocr-numbers/Sources/OcrNumbersExample.swift +1 -1
- data/tracks/swift/exercises/octal/Sources/OctalExample.swift +1 -1
- data/tracks/swift/exercises/perfect-numbers/Sources/PerfectNumbersExample.swift +1 -1
- data/tracks/swift/exercises/pig-latin/Sources/PigLatinExample.swift +3 -3
- data/tracks/swift/exercises/poker/Sources/PokerExample.swift +10 -10
- data/tracks/swift/exercises/pythagorean-triplet/Sources/PythagoreanTripletExample.swift +3 -3
- data/tracks/swift/exercises/pythagorean-triplet/Tests/PythagoreanTripletTests/PythagoreanTripletTests.swift +3 -3
- data/tracks/swift/exercises/secret-handshake/Sources/SecretHandshakeExample.swift +2 -2
- data/tracks/swift/exercises/series/Sources/SeriesExample.swift +1 -1
- data/tracks/swift/exercises/sieve/Sources/SieveExample.swift +4 -4
- data/tracks/swift/exercises/strain/Tests/StrainTests/StrainTests.swift +11 -11
- data/tracks/swift/exercises/tournament/Sources/TournamentExample.swift +2 -2
- data/tracks/swift/exercises/word-count/Sources/WordCountExample.swift +1 -1
- data/tracks/swift/exercises/wordy/Sources/WordyExample.swift +5 -5
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ec9e8cd131aab975f2949305731a5eceef951290
|
|
4
|
+
data.tar.gz: f2825b0807a002fb5f28b2f0a42dc4159ed59353
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b14e3d7c62d9f65bd83e693a9d866c473d386a1e06a118d54ea1a840eebeabe0c26c570046afcb91836c07fcd7dfecf7c63a247f6fa6f6b7e81d058d03c257e2
|
|
7
|
+
data.tar.gz: 572d3829ff054e6e3526f16b338c2fba8782fd73effcdcf302ccb5d0ceaed948162bd2699300fc740db5a2d5b5731fb8a6594285b2b461e8b3d90f999b63604f
|
data/lib/trackler/version.rb
CHANGED
|
@@ -2,34 +2,36 @@ open Core.Std
|
|
|
2
2
|
open OUnit2
|
|
3
3
|
open Etl
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
let ae exp got _test_ctxt =
|
|
7
6
|
let sexpr_of l = List.sexp_of_t (Tuple2.sexp_of_t Char.sexp_of_t Int.sexp_of_t) l in
|
|
8
7
|
let printer l = Sexp.to_string (sexpr_of l) in
|
|
9
8
|
assert_equal exp got ~printer
|
|
10
9
|
|
|
11
|
-
let tests =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
10
|
+
let tests = [
|
|
11
|
+
"a single letter" >::
|
|
12
|
+
ae [('a', 1)]
|
|
13
|
+
(transform [(1, ['A'])]);
|
|
14
|
+
"single score with multiple letters" >::
|
|
15
|
+
ae [('a', 1); ('e', 1); ('i', 1); ('o', 1); ('u', 1)]
|
|
16
|
+
(transform [(1, ['A'; 'E'; 'I'; 'O'; 'U'])]);
|
|
17
|
+
"multiple scores with multiple letters" >::
|
|
18
|
+
ae [('a', 1); ('d', 2); ('e', 1); ('g', 2)]
|
|
19
|
+
(transform [(1, ['A'; 'E']); (2, ['D'; 'G'])]);
|
|
20
|
+
"multiple scores with differing numbers of letters" >::
|
|
21
|
+
ae [('a', 1); ('b', 3); ('c', 3); ('d', 2); ('e', 1);
|
|
22
|
+
('f', 4); ('g', 2); ('h', 4); ('i', 1); ('j', 8);
|
|
23
|
+
('k', 5); ('l', 1); ('m', 3); ('n', 1); ('o', 1);
|
|
24
|
+
('p', 3); ('q', 10); ('r', 1); ('s', 1); ('t', 1);
|
|
25
|
+
('u', 1); ('v', 4); ('w', 4); ('x', 8); ('y', 4);
|
|
26
|
+
('z', 10)]
|
|
27
|
+
(transform [(1, ['A'; 'E'; 'I'; 'O'; 'U'; 'L'; 'N'; 'R'; 'S'; 'T']);
|
|
28
|
+
(2, ['D'; 'G']);
|
|
29
|
+
(3, ['B'; 'C'; 'M'; 'P']);
|
|
30
|
+
(4, ['F'; 'H'; 'V'; 'W'; 'Y']);
|
|
31
|
+
(5, ['K']);
|
|
32
|
+
(8, ['J'; 'X']);
|
|
33
|
+
(10, ['Q'; 'Z'])]);
|
|
34
|
+
]
|
|
33
35
|
|
|
34
36
|
let () =
|
|
35
|
-
run_test_tt_main ("etl tests" >::: tests)
|
|
37
|
+
run_test_tt_main ("etl tests" >::: tests)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
open Core.Std
|
|
2
|
+
open OUnit2
|
|
3
|
+
open Etl
|
|
4
|
+
|
|
5
|
+
let ae exp got _test_ctxt =
|
|
6
|
+
let sexpr_of l = List.sexp_of_t (Tuple2.sexp_of_t Char.sexp_of_t Int.sexp_of_t) l in
|
|
7
|
+
let printer l = Sexp.to_string (sexpr_of l) in
|
|
8
|
+
assert_equal exp got ~printer
|
|
9
|
+
|
|
10
|
+
let tests = [
|
|
11
|
+
(* TEST
|
|
12
|
+
"$description" >::
|
|
13
|
+
ae $expected
|
|
14
|
+
(transform $input);
|
|
15
|
+
END TEST *)
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
let () =
|
|
19
|
+
run_test_tt_main ("etl tests" >::: tests)
|
data/tracks/swift/.swiftlint.yml
CHANGED
data/tracks/swift/.travis.yml
CHANGED
|
@@ -8,8 +8,9 @@ before_install:
|
|
|
8
8
|
matrix:
|
|
9
9
|
include:
|
|
10
10
|
- script:
|
|
11
|
-
- swiftlint lint --quiet >> lintreport.json
|
|
11
|
+
- swiftlint lint --quiet >> lintreport.json || true # Dont crash on errors
|
|
12
12
|
- ls
|
|
13
|
+
- python -m json.tool lintreport.json
|
|
13
14
|
- ./xswift-test-spm
|
|
14
15
|
env: JOB=SPM
|
|
15
16
|
os: osx
|
data/tracks/swift/Dangerfile
CHANGED
|
@@ -33,11 +33,14 @@ json.each do |object|
|
|
|
33
33
|
shortFile.sub! "/Users/travis/build/exercism/xswift/", ''
|
|
34
34
|
shortFile = shortFile.to_s || ''
|
|
35
35
|
msg = object["reason"].to_s || ''
|
|
36
|
+
severity = object["severity"].to_s || ''
|
|
37
|
+
isError = severity == "Error"
|
|
36
38
|
line = object["line"] || 1
|
|
37
39
|
#only warn for files that were edited in this PR.
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
if isError
|
|
41
|
+
fail(msg, file: "/" + shortFile, line: line) if isError
|
|
42
|
+
elsif git.modified_files.include? shortFile
|
|
43
|
+
warn(msg, file: "/" + shortFile, line: line) unless isError
|
|
41
44
|
else
|
|
42
45
|
message(msg, file: shortFile, line: line)
|
|
43
46
|
end
|
data/tracks/swift/Package.swift
CHANGED
|
@@ -9,7 +9,7 @@ if
|
|
|
9
9
|
let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) ,
|
|
10
10
|
let jsonDict = json as? [String: Any],
|
|
11
11
|
let exercisesDict = jsonDict["exercises"] as? [[String:Any]],
|
|
12
|
-
let exercises = exercisesDict.map({$0["slug"]}) as? [String],
|
|
12
|
+
let exercises = exercisesDict.map({ $0["slug"] }) as? [String],
|
|
13
13
|
let deprecated = jsonDict["deprecated"] as? [String] {
|
|
14
14
|
|
|
15
15
|
allProblems += exercises
|
|
@@ -46,7 +46,7 @@ struct Acronym {
|
|
|
46
46
|
var accumulate = ""
|
|
47
47
|
var lastIndexAdded = 0
|
|
48
48
|
|
|
49
|
-
for (index, each) in inString.characters.map({String($0)}).enumerated() {
|
|
49
|
+
for (index, each) in inString.characters.map({ String($0) }).enumerated() {
|
|
50
50
|
if splitCamelcaseAt(each, withString: &previousLetter) {
|
|
51
51
|
accumulate += inString.substringWithRangeInt(lastIndexAdded, end: index)+" " // inserts a space
|
|
52
52
|
lastIndexAdded = index
|
|
@@ -67,10 +67,10 @@ struct Acronym {
|
|
|
67
67
|
|
|
68
68
|
func splitStringToArray(_ inString: String) -> [String] {
|
|
69
69
|
|
|
70
|
-
return inString.characters.split(whereSeparator: { splitAt($0) }).map {String($0)}
|
|
70
|
+
return inString.characters.split(whereSeparator: { splitAt($0) }).map { String($0) }
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
return splitStringToArray(insertSpaceAtCamelcase(inString)).map({$0.uppercased().substringWithRangeInt(0, end: 1)}).joined(separator: "")
|
|
73
|
+
return splitStringToArray(insertSpaceAtCamelcase(inString)).map({ $0.uppercased().substringWithRangeInt(0, end: 1) }).joined(separator: "")
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
}
|
|
@@ -41,8 +41,8 @@ private extension String {
|
|
|
41
41
|
private func containsLetters(_ input: String) -> Bool {
|
|
42
42
|
let abc = "abcdefghijklmnopqrstuvwxyz"
|
|
43
43
|
var contains = false
|
|
44
|
-
let inputStringCollection = input.characters.map({String($0)})
|
|
45
|
-
let abcStringCollection = abc.characters.map({String($0)})
|
|
44
|
+
let inputStringCollection = input.characters.map({ String($0) })
|
|
45
|
+
let abcStringCollection = abc.characters.map({ String($0) })
|
|
46
46
|
|
|
47
47
|
for each in inputStringCollection {
|
|
48
48
|
abcStringCollection.forEach({
|
|
@@ -35,7 +35,7 @@ struct Crypto {
|
|
|
35
35
|
let tempRoot = tempDouble.squareRoot()
|
|
36
36
|
let tempCeil = ceil(tempRoot)
|
|
37
37
|
let tempFloor = floor(tempRoot)
|
|
38
|
-
if floorNoCeling { return Int(tempFloor)} else {
|
|
38
|
+
if floorNoCeling { return Int(tempFloor) } else {
|
|
39
39
|
return Int(tempCeil)}
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
func == <T> (lh: CustomSet<T>, rh: CustomSet<T>) -> Bool {
|
|
2
|
-
return lh.contents.keys.sorted {$0.hashValue < $1.hashValue} == rh.contents.keys.sorted {$0.hashValue < $1.hashValue}
|
|
2
|
+
return lh.contents.keys.sorted { $0.hashValue < $1.hashValue } == rh.contents.keys.sorted { $0.hashValue < $1.hashValue }
|
|
3
3
|
|
|
4
4
|
}
|
|
5
5
|
struct CustomSet<T:Hashable>:Equatable {
|
|
@@ -8,9 +8,9 @@ struct CustomSet<T:Hashable>:Equatable {
|
|
|
8
8
|
|
|
9
9
|
fileprivate var contents = [Element: Bool]()
|
|
10
10
|
|
|
11
|
-
var size: Int {return contents.count}
|
|
11
|
+
var size: Int { return contents.count }
|
|
12
12
|
|
|
13
|
-
var toSortedArray: [Element] {return Array(contents.keys.sorted {$0.hashValue < $1.hashValue})}
|
|
13
|
+
var toSortedArray: [Element] { return Array(contents.keys.sorted { $0.hashValue < $1.hashValue }) }
|
|
14
14
|
|
|
15
15
|
init<S: Sequence>(_ sequence: S) where S.Iterator.Element == Element {
|
|
16
16
|
self.contents = [:]
|
|
@@ -34,7 +34,7 @@ struct CustomSet<T:Hashable>:Equatable {
|
|
|
34
34
|
func intersection(_ item: CustomSet) -> CustomSet {
|
|
35
35
|
var temp = [Element: Bool]()
|
|
36
36
|
for each in Array(item.contents.keys) {
|
|
37
|
-
guard let _ = contents[each] else {continue}
|
|
37
|
+
guard let _ = contents[each] else { continue }
|
|
38
38
|
temp[each] = true
|
|
39
39
|
}
|
|
40
40
|
return CustomSet(temp.keys)
|
|
@@ -56,7 +56,7 @@ struct CustomSet<T:Hashable>:Equatable {
|
|
|
56
56
|
}
|
|
57
57
|
func isSupersetOf (_ item: CustomSet) -> Bool {
|
|
58
58
|
|
|
59
|
-
return item.contents.count == item.contents.filter {self.contents.keys.contains($0.0)}.count
|
|
59
|
+
return item.contents.count == item.contents.filter { self.contents.keys.contains($0.0) }.count
|
|
60
60
|
|
|
61
61
|
}
|
|
62
62
|
func isDisjoint(_ item: CustomSet) -> Bool {
|
|
@@ -4,12 +4,12 @@ struct Dominoes {
|
|
|
4
4
|
let doubles: [Bone]
|
|
5
5
|
|
|
6
6
|
var chained: Bool {
|
|
7
|
-
if singles.isEmpty && doubles.count == 1 {return true }
|
|
7
|
+
if singles.isEmpty && doubles.count == 1 { return true }
|
|
8
8
|
let (success, result) = chainning(swapDuplicate(singles))
|
|
9
9
|
if doubles.isEmpty {
|
|
10
10
|
return success
|
|
11
11
|
} else if success == true {
|
|
12
|
-
return doubles.count == doubles.filter({each in return result.contains(where: {e in return e.value.head == each.value.head})}).count
|
|
12
|
+
return doubles.count == doubles.filter({ each in return result.contains(where: { e in return e.value.head == each.value.head }) }).count
|
|
13
13
|
} else {
|
|
14
14
|
return false
|
|
15
15
|
}
|
|
@@ -31,7 +31,7 @@ struct Dominoes {
|
|
|
31
31
|
private func chainning(_ input: [Bone]) -> (Bool, [Bone]) {
|
|
32
32
|
var matched = input
|
|
33
33
|
|
|
34
|
-
guard !matched.isEmpty else {return (false, [])}
|
|
34
|
+
guard !matched.isEmpty else { return (false, []) }
|
|
35
35
|
|
|
36
36
|
let total = matched.count - 1
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ struct Dominoes {
|
|
|
40
40
|
matched[index].connect(matched[innerIndex])
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
return (matched.filter({$0.connected >= 2}).count == matched.count) ?
|
|
43
|
+
return (matched.filter({ $0.connected >= 2 }).count == matched.count) ?
|
|
44
44
|
(true, matched) : (false, [])
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -74,8 +74,8 @@ class Bone: CustomStringConvertible, Equatable {
|
|
|
74
74
|
@discardableResult
|
|
75
75
|
func connect(_ input: Bone) -> Bool {
|
|
76
76
|
|
|
77
|
-
guard self !== input else {return false}
|
|
78
|
-
guard self !== input.connectedTo else {return false}
|
|
77
|
+
guard self !== input else { return false }
|
|
78
|
+
guard self !== input.connectedTo else { return false }
|
|
79
79
|
|
|
80
80
|
var toReturn = false
|
|
81
81
|
|
|
@@ -37,13 +37,13 @@ private extension tm {
|
|
|
37
37
|
}
|
|
38
38
|
if addZero {
|
|
39
39
|
return "0\(input)"
|
|
40
|
-
} else {return String(input)}
|
|
40
|
+
} else { return String(input) }
|
|
41
41
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
var description: String {
|
|
45
45
|
|
|
46
|
-
let date = [year, month, day, time.hour, time.mins, time.secs].map {addLeadingZero($0)}
|
|
46
|
+
let date = [year, month, day, time.hour, time.mins, time.secs].map { addLeadingZero($0) }
|
|
47
47
|
|
|
48
48
|
return date[0] + "-" + date[1] + "-" + date[2] + "T" + date[3] + ":" + date[4] + ":" + date[5]
|
|
49
49
|
}
|
|
@@ -72,10 +72,10 @@ struct Gigasecond: Equatable, CustomStringConvertible {
|
|
|
72
72
|
}
|
|
73
73
|
private func parse(_ input: String) -> tm? {
|
|
74
74
|
|
|
75
|
-
let dateTime = input.characters.split(separator: "T").map {String($0)}
|
|
75
|
+
let dateTime = input.characters.split(separator: "T").map { String($0) }
|
|
76
76
|
if dateTime.count > 1 {
|
|
77
|
-
let date = dateTime[0].characters.split(separator: "-").map {String($0)}
|
|
78
|
-
let time = dateTime[1].characters.split(separator: ":").map {String($0)}
|
|
77
|
+
let date = dateTime[0].characters.split(separator: "-").map { String($0) }
|
|
78
|
+
let time = dateTime[1].characters.split(separator: ":").map { String($0) }
|
|
79
79
|
if date.count == 3 && time.count == date.count {
|
|
80
80
|
|
|
81
81
|
let year = Int32(date[0]) ?? 0
|
|
@@ -3,9 +3,9 @@ import Foundation
|
|
|
3
3
|
struct Luhn {
|
|
4
4
|
|
|
5
5
|
var number: Int64 = 0
|
|
6
|
-
var addends: [Int] { return addendsFunc(number)}
|
|
7
|
-
var checksum: Int {return addends.reduce(0, +) }
|
|
8
|
-
var isValid: Bool { return checksum % 10 == 0}
|
|
6
|
+
var addends: [Int] { return addendsFunc(number) }
|
|
7
|
+
var checksum: Int { return addends.reduce(0, +) }
|
|
8
|
+
var isValid: Bool { return checksum % 10 == 0 }
|
|
9
9
|
|
|
10
10
|
init(_ num: Int64) {
|
|
11
11
|
self.number = num
|
|
@@ -54,7 +54,7 @@ struct Luhn {
|
|
|
54
54
|
|
|
55
55
|
let tempString = "\(num)"
|
|
56
56
|
|
|
57
|
-
return oddIndexInt64Minus9(Array(tempString.characters).map {char2Int($0)})
|
|
57
|
+
return oddIndexInt64Minus9(Array(tempString.characters).map { char2Int($0) })
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
}
|
|
@@ -67,7 +67,7 @@ extension Date:CustomStringConvertible {
|
|
|
67
67
|
|
|
68
68
|
var description: String {
|
|
69
69
|
|
|
70
|
-
let date = [year, month, day, hour, mins, secs].map {addLeadingZero($0)}
|
|
70
|
+
let date = [year, month, day, hour, mins, secs].map { addLeadingZero($0) }
|
|
71
71
|
|
|
72
72
|
let dateOnly = date[0] + "-" + date[1] + "-" + date[2]
|
|
73
73
|
let dateTime = dateOnly + "T" + date[3] + ":" + date[4] + ":" + date[5]
|
|
@@ -97,8 +97,8 @@ extension Date {
|
|
|
97
97
|
var minute = Int32()
|
|
98
98
|
var second = Int32()
|
|
99
99
|
|
|
100
|
-
let dateTime = input.characters.split(separator: "T").map {String($0)}
|
|
101
|
-
let date = dateTime[0].characters.split(separator: "-").map {String($0)}
|
|
100
|
+
let dateTime = input.characters.split(separator: "T").map { String($0) }
|
|
101
|
+
let date = dateTime[0].characters.split(separator: "-").map { String($0) }
|
|
102
102
|
if date.count == 3 {
|
|
103
103
|
year = Int32(date[0]) ?? 0
|
|
104
104
|
month = Int32(date[1]) ?? 0
|
|
@@ -106,7 +106,7 @@ extension Date {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
if dateTime.count == 2 {
|
|
109
|
-
let time = dateTime[1].characters.split(separator: ":").map {String($0)}
|
|
109
|
+
let time = dateTime[1].characters.split(separator: ":").map { String($0) }
|
|
110
110
|
if time.count == 3 {
|
|
111
111
|
hour = Int32(time[0]) ?? 0
|
|
112
112
|
minute = Int32(time[1]) ?? 0
|
|
@@ -134,7 +134,7 @@ struct Meetup {
|
|
|
134
134
|
|
|
135
135
|
let starDay = dateStart.weekday
|
|
136
136
|
var month = Array(dateStart.day ... dateEnd.day)
|
|
137
|
-
month = month.map {(($0 + 5 + starDay) % 7) + 1
|
|
137
|
+
month = month.map { (($0 + 5 + starDay) % 7) + 1 }
|
|
138
138
|
|
|
139
139
|
for (index, eachDay) in month.enumerated() {
|
|
140
140
|
dateMonthWeekDays.append([Int32(index + 1), eachDay])
|
|
@@ -144,11 +144,11 @@ struct Meetup {
|
|
|
144
144
|
|
|
145
145
|
if which == "teenth" {
|
|
146
146
|
let teenthRange = Array(dateMonthWeekDays[13...19])
|
|
147
|
-
let teenth = teenthRange.filter({$0[1] == Int32(dayOfTheWeek) })[0][0]
|
|
147
|
+
let teenth = teenthRange.filter({ $0[1] == Int32(dayOfTheWeek) })[0][0]
|
|
148
148
|
return Date(from: "\(dateStart.year)-\(dateStart.month)-\(teenth)") ?? Date()
|
|
149
149
|
|
|
150
150
|
}
|
|
151
|
-
let count = dateMonthWeekDays.filter({$0[1] == Int32(dayOfTheWeek) }).count
|
|
151
|
+
let count = dateMonthWeekDays.filter({ $0[1] == Int32(dayOfTheWeek) }).count
|
|
152
152
|
var dayIndex: Int = 0
|
|
153
153
|
switch dateInput {
|
|
154
154
|
case "1st": dayIndex = 0
|
|
@@ -160,7 +160,7 @@ struct Meetup {
|
|
|
160
160
|
default: dayIndex = -1
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
let first2last = dateMonthWeekDays.filter({$0[1] == Int32(dayOfTheWeek) })[dayIndex][0]
|
|
163
|
+
let first2last = dateMonthWeekDays.filter({ $0[1] == Int32(dayOfTheWeek) })[dayIndex][0]
|
|
164
164
|
|
|
165
165
|
return Date(from:"\(dateStart.year)-\(dateStart.month)-\(first2last)") ?? Date()
|
|
166
166
|
}
|
|
@@ -77,7 +77,7 @@ struct OCR {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
func patternForGrouping(_ grouping: [String]) -> String {
|
|
80
|
-
guard let number = patterns.index(where: {$0 == grouping}) else {
|
|
80
|
+
guard let number = patterns.index(where: { $0 == grouping }) else {
|
|
81
81
|
return "?"
|
|
82
82
|
}
|
|
83
83
|
return "\(number)"
|
|
@@ -24,7 +24,7 @@ struct Octal {
|
|
|
24
24
|
var tempInt: Int = 0
|
|
25
25
|
for (inx, each) in orderedInput.enumerated() {
|
|
26
26
|
let tempCharInt = Int("\(each)") ?? 0
|
|
27
|
-
if tempCharInt > 7 {return 0}
|
|
27
|
+
if tempCharInt > 7 { return 0 }
|
|
28
28
|
let tempOctPower = Int(pow(Double(8), Double(inx)))
|
|
29
29
|
tempInt += tempOctPower * tempCharInt
|
|
30
30
|
}
|
|
@@ -16,13 +16,13 @@ private extension String {
|
|
|
16
16
|
struct PigLatin {
|
|
17
17
|
|
|
18
18
|
static func translate (_ word: String) -> String {
|
|
19
|
-
return word.components(separatedBy: " ").map {self.translateWord($0)}.joined(separator: " ")
|
|
19
|
+
return word.components(separatedBy: " ").map { self.translateWord($0) }.joined(separator: " ")
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
static func translateWord(_ word: String) -> String {
|
|
23
23
|
|
|
24
24
|
func wordStartsWithPrefixes(_ word: String, prefixes: [String]) -> Bool {
|
|
25
|
-
return 0 < prefixes.filter {word.hasPrefix($0)}.count
|
|
25
|
+
return 0 < prefixes.filter { word.hasPrefix($0) }.count
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
func wordStartsWithVowelLike(_ word: String) -> Bool {
|
|
@@ -34,7 +34,7 @@ struct PigLatin {
|
|
|
34
34
|
return word.substring(from: index).hasPrefix("qu")
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
if wordStartsWithVowelLike(word) {return word + "ay"}
|
|
37
|
+
if wordStartsWithVowelLike(word) { return word + "ay" }
|
|
38
38
|
if wordStartsWithPrefixes(word, prefixes: ["thr", "sch"]) {
|
|
39
39
|
return (word.substringFromIndexInt(3) + word.substringWithRangeInt(0..<3) + "ay") }
|
|
40
40
|
|
|
@@ -27,7 +27,7 @@ struct Poker {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
guard let topHand = (pokerHandsParsed.sorted(by: >)).first,
|
|
30
|
-
let indexTop = pokerHandsParsed.index(of: topHand) else {return nil}
|
|
30
|
+
let indexTop = pokerHandsParsed.index(of: topHand) else { return nil }
|
|
31
31
|
|
|
32
32
|
return hands[indexTop]
|
|
33
33
|
|
|
@@ -60,7 +60,7 @@ enum HandRank {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
static func parsePairs(_ inputHand: PokerHand) -> [(rank: Rank, count: Int)] {
|
|
63
|
-
let ranks = inputHand.hand.map({$0.rank})
|
|
63
|
+
let ranks = inputHand.hand.map({ $0.rank })
|
|
64
64
|
let rankSet = Set(ranks)
|
|
65
65
|
var toReturn = [Rank: Int]()
|
|
66
66
|
for each in ranks {
|
|
@@ -68,7 +68,7 @@ enum HandRank {
|
|
|
68
68
|
toReturn[each] = (toReturn[each] ?? 0) + 1
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
let result = toReturn.map({key, value in return (rank:key, count:value)}).sorted(by: {
|
|
71
|
+
let result = toReturn.map({ key, value in return (rank:key, count:value) }).sorted(by: {
|
|
72
72
|
(one, two) in
|
|
73
73
|
return one.count == two.count ? one.rank > two.rank : one.count > two.count
|
|
74
74
|
})
|
|
@@ -76,22 +76,22 @@ enum HandRank {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
static func isFlush(_ inputHand: PokerHand) -> (bool: Bool, suit: Suit) {
|
|
79
|
-
let suits = inputHand.hand.map({$0.suit})
|
|
79
|
+
let suits = inputHand.hand.map({ $0.suit })
|
|
80
80
|
let first = suits[0]
|
|
81
81
|
for each in suits {
|
|
82
|
-
guard first == each else { return (false, .None)}
|
|
82
|
+
guard first == each else { return (false, .None) }
|
|
83
83
|
}
|
|
84
84
|
return (true, first)
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
static func isStraight(_ inputHand: PokerHand) -> (bool: Bool, highest: Rank) {
|
|
88
|
-
let sorted = inputHand.hand.sorted(by: {$0.rank < $1.rank})
|
|
88
|
+
let sorted = inputHand.hand.sorted(by: { $0.rank < $1.rank })
|
|
89
89
|
let first = sorted[0].rank.rawValue
|
|
90
90
|
for (index, each) in sorted.enumerated() {
|
|
91
91
|
if each.rank.rawValue != index + first {
|
|
92
92
|
// checks for Ace as the lowest card
|
|
93
|
-
guard let aceIndex = inputHand.hand.index(where: {$0.rank.rawValue == 14})else {return (false, .ace)}
|
|
94
|
-
var replacedAced = inputHand.hand.map({$0.rank.rawValue})
|
|
93
|
+
guard let aceIndex = inputHand.hand.index(where: { $0.rank.rawValue == 14 })else { return (false, .ace) }
|
|
94
|
+
var replacedAced = inputHand.hand.map({ $0.rank.rawValue })
|
|
95
95
|
replacedAced[aceIndex] = 1 // swaps ace value to lowest
|
|
96
96
|
replacedAced.sort()
|
|
97
97
|
let firstVal = replacedAced[0]
|
|
@@ -255,11 +255,11 @@ struct PokerHand {
|
|
|
255
255
|
var handParsed: [PlayingCard] = []
|
|
256
256
|
|
|
257
257
|
for each in stringHand.split(" ") {
|
|
258
|
-
guard let card = PlayingCard(each) else {return nil}
|
|
258
|
+
guard let card = PlayingCard(each) else { return nil }
|
|
259
259
|
handParsed.append(card)
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
if handParsed.count == 5 {self.hand = handParsed } else {return nil}
|
|
262
|
+
if handParsed.count == 5 { self.hand = handParsed } else { return nil }
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
265
|
extension PokerHand : Equatable, Comparable {}
|
|
@@ -14,11 +14,11 @@ struct Triplet {
|
|
|
14
14
|
self.c = c
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
var sum: Int {return a + b + c }
|
|
17
|
+
var sum: Int { return a + b + c }
|
|
18
18
|
|
|
19
|
-
var product: Int {return a * b * c }
|
|
19
|
+
var product: Int { return a * b * c }
|
|
20
20
|
|
|
21
|
-
var isPythagorean: Bool {return pow(Double(a), 2) + pow(Double(b), 2) == pow(Double(c), 2)}
|
|
21
|
+
var isPythagorean: Bool { return pow(Double(a), 2) + pow(Double(b), 2) == pow(Double(c), 2) }
|
|
22
22
|
|
|
23
23
|
static func Where(_ minFactor: Int = 1, maxFactor: Int, sum: Int = 0) -> [Triplet] {
|
|
24
24
|
|
|
@@ -20,19 +20,19 @@ class PythagoreanTripletTests: XCTestCase {
|
|
|
20
20
|
|
|
21
21
|
func testTripletsUpTo10() {
|
|
22
22
|
let triplets = Triplet.Where(maxFactor: 10)
|
|
23
|
-
let products = triplets.map {$0.product}.sorted(by: <)
|
|
23
|
+
let products = triplets.map { $0.product }.sorted(by: <)
|
|
24
24
|
XCTAssertEqual([60, 480], products)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
func testTripletsFrom11UpTo20() {
|
|
28
28
|
let triplets = Triplet.Where(11, maxFactor: 20)
|
|
29
|
-
let products = triplets.map {$0.product}.sorted(by: <)
|
|
29
|
+
let products = triplets.map { $0.product }.sorted(by: <)
|
|
30
30
|
XCTAssertEqual([3840], products)
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
func testTripletsWhereSumX() {
|
|
34
34
|
let triplets = Triplet.Where( maxFactor: 100, sum: 180)
|
|
35
|
-
let products = triplets.map {$0.product}.sorted(by: <)
|
|
35
|
+
let products = triplets.map { $0.product }.sorted(by: <)
|
|
36
36
|
XCTAssertEqual([118_080, 168_480, 202_500], products)
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -7,9 +7,9 @@ struct SecretHandshake {
|
|
|
7
7
|
self.commandValue = commandValue
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
var shouldReverse: Bool {return (commandValue & 16) != 0}
|
|
10
|
+
var shouldReverse: Bool { return (commandValue & 16) != 0 }
|
|
11
11
|
|
|
12
|
-
var commands: [String] {return commandsFunc()}
|
|
12
|
+
var commands: [String] { return commandsFunc() }
|
|
13
13
|
|
|
14
14
|
private func commandsFunc() -> [String] {
|
|
15
15
|
var commands = [String]()
|
|
@@ -7,7 +7,7 @@ struct Series {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
func slices(_ chunkSize: Int) -> [[Int]] {
|
|
10
|
-
var numberStringArray = Array(numberString.characters).map {Int("\($0)") ?? 0}
|
|
10
|
+
var numberStringArray = Array(numberString.characters).map { Int("\($0)") ?? 0 }
|
|
11
11
|
let count = numberStringArray.count
|
|
12
12
|
var start = 0
|
|
13
13
|
var end = chunkSize
|
|
@@ -4,13 +4,13 @@ struct Sieve {
|
|
|
4
4
|
self.value = num
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
var primes: [Int] {return primesFunc(self.value ) }
|
|
7
|
+
var primes: [Int] { return primesFunc(self.value ) }
|
|
8
8
|
|
|
9
9
|
func primesFunc(_ limit: Int) -> [Int] {
|
|
10
10
|
|
|
11
|
-
if limit < 2 { return []} else {
|
|
11
|
+
if limit < 2 { return [] } else {
|
|
12
12
|
let tempArray = Array(2...limit)
|
|
13
|
-
return tempArray.filter {Sieve.onlyDivisorSelf($0)}
|
|
13
|
+
return tempArray.filter { Sieve.onlyDivisorSelf($0) }
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -26,7 +26,7 @@ struct Sieve {
|
|
|
26
26
|
}
|
|
27
27
|
divisor += 1
|
|
28
28
|
}
|
|
29
|
-
if primes.count == 1 {return true} else {return false}
|
|
29
|
+
if primes.count == 1 { return true } else { return false }
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
}
|
|
@@ -11,15 +11,15 @@ private extension XCTest {
|
|
|
11
11
|
class StrainTests: XCTestCase {
|
|
12
12
|
func testEmptyKeep() {
|
|
13
13
|
|
|
14
|
-
XCTAssertTrue ([].keep {each -> Bool in each < 10}.isEmpty)
|
|
14
|
+
XCTAssertTrue ([].keep { each -> Bool in each < 10 }.isEmpty)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
func testKeepEverything() {
|
|
18
|
-
XCTAssertEqual([1, 2, 3], [1, 2, 3].keep {each -> Bool in each < 10})
|
|
18
|
+
XCTAssertEqual([1, 2, 3], [1, 2, 3].keep { each -> Bool in each < 10 })
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
func testKeepFirstAndLast() {
|
|
22
|
-
XCTAssertEqual([1, 3], [1, 2, 3].keep { each -> Bool in (each % 2 != 0)})
|
|
22
|
+
XCTAssertEqual([1, 3], [1, 2, 3].keep { each -> Bool in (each % 2 != 0) })
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
func testKeepNeitherFirstNorLast() {
|
|
@@ -28,7 +28,7 @@ class StrainTests: XCTestCase {
|
|
|
28
28
|
|
|
29
29
|
func testKeepStrings() {
|
|
30
30
|
let words = ["apple", "zebra", "banana", "zombies", "cherimoya", "zealot"]
|
|
31
|
-
let result = words.keep {each -> Bool in (each as String).hasPrefix("z")}
|
|
31
|
+
let result = words.keep { each -> Bool in (each as String).hasPrefix("z") }
|
|
32
32
|
XCTAssertEqual(["zebra", "zombies", "zealot"], result)
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -42,29 +42,29 @@ class StrainTests: XCTestCase {
|
|
|
42
42
|
[2, 2, 1],
|
|
43
43
|
[1, 2, 5]
|
|
44
44
|
]
|
|
45
|
-
let result = rows.keep { each -> Bool in (each as [Int]).contains(5)}
|
|
45
|
+
let result = rows.keep { each -> Bool in (each as [Int]).contains(5) }
|
|
46
46
|
XCTAssertEqualMultiArray([[5, 5, 5], [5, 1, 2], [1, 5, 2], [1, 2, 5]], result)
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
func testEmptyDiscard() {
|
|
50
|
-
XCTAssertEqual([], [].discard {each -> Bool in each < 10})
|
|
50
|
+
XCTAssertEqual([], [].discard { each -> Bool in each < 10 })
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
func testDiscardNothing() {
|
|
54
|
-
XCTAssertEqual([1, 2, 3], [1, 2, 3].discard {each -> Bool in each > 10})
|
|
54
|
+
XCTAssertEqual([1, 2, 3], [1, 2, 3].discard { each -> Bool in each > 10 })
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
func testDiscardFirstAndLast() {
|
|
58
|
-
XCTAssertEqual([2], [1, 2, 3].discard {each -> Bool in (each % 2 != 0)})
|
|
58
|
+
XCTAssertEqual([2], [1, 2, 3].discard { each -> Bool in (each % 2 != 0) })
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
func testDiscardNeitherFirstNorLast() {
|
|
62
|
-
XCTAssertEqual([1, 3, 5], [1, 2, 3, 4, 5].discard { each -> Bool in (each % 2 == 0)})
|
|
62
|
+
XCTAssertEqual([1, 3, 5], [1, 2, 3, 4, 5].discard { each -> Bool in (each % 2 == 0) })
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
func testDiscardStrings() {
|
|
66
66
|
let words = ["apple", "zebra", "banana", "zombies", "cherimoya", "zealot"]
|
|
67
|
-
let result = words.discard {each -> Bool in (each as String).hasPrefix("z") }
|
|
67
|
+
let result = words.discard { each -> Bool in (each as String).hasPrefix("z") }
|
|
68
68
|
XCTAssertEqual(["apple", "banana", "cherimoya"], result)
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -78,7 +78,7 @@ class StrainTests: XCTestCase {
|
|
|
78
78
|
[2, 2, 1],
|
|
79
79
|
[1, 2, 5]
|
|
80
80
|
]
|
|
81
|
-
let result = rows.discard { each -> Bool in (each as [Int]).contains(5)}
|
|
81
|
+
let result = rows.discard { each -> Bool in (each as [Int]).contains(5) }
|
|
82
82
|
XCTAssertEqualMultiArray([[1, 2, 3], [2, 1, 2], [2, 2, 1]], result)
|
|
83
83
|
}
|
|
84
84
|
|
|
@@ -122,7 +122,7 @@ struct Tournament {
|
|
|
122
122
|
let tempVal = teams[each]!
|
|
123
123
|
sortByValue.append((each, tempVal.score, tempVal.played))
|
|
124
124
|
}
|
|
125
|
-
sortByValue.sort { $0.score == $1.score ? $0.mp > $1.mp : $0.score > $1.score
|
|
125
|
+
sortByValue.sort { $0.score == $1.score ? $0.mp > $1.mp : $0.score > $1.score }
|
|
126
126
|
var sortedKeys = [String]()
|
|
127
127
|
for each in sortByValue {
|
|
128
128
|
sortedKeys.append(each.0)
|
|
@@ -161,7 +161,7 @@ struct Tournament {
|
|
|
161
161
|
var outcome: Outcome = Outcome.err
|
|
162
162
|
|
|
163
163
|
// alternative to .componentsSeparatedByString
|
|
164
|
-
let textArrayLines = inStream.characters.split {$0 == "\n"}.map { String($0) }
|
|
164
|
+
let textArrayLines = inStream.characters.split { $0 == "\n" }.map { String($0) }
|
|
165
165
|
|
|
166
166
|
for line in textArrayLines {
|
|
167
167
|
let parts = line.trimWhiteSpace().components(separatedBy: ";")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
struct WordCount {
|
|
2
2
|
|
|
3
3
|
func splitStringToArray(_ inString: String) -> [String] {
|
|
4
|
-
return inString.characters.split(whereSeparator: { splitAt($0) }).map {String($0)}
|
|
4
|
+
return inString.characters.split(whereSeparator: { splitAt($0) }).map { String($0) }
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
func splitAt(_ characterToCompare: Character, charToSplitAt: String = " !&$%^&,:") -> Bool {
|
|
@@ -53,10 +53,10 @@ struct WordProblem {
|
|
|
53
53
|
"divided by": "/"]
|
|
54
54
|
|
|
55
55
|
private let funcs =
|
|
56
|
-
["+": {(a: Int, b: Int) -> Int in return a + b},
|
|
57
|
-
"-": {(a: Int, b: Int) -> Int in return a - b},
|
|
58
|
-
"*": {(a: Int, b: Int) -> Int in return a * b},
|
|
59
|
-
"/": {(a: Int, b: Int) -> Int in return a / b}]
|
|
56
|
+
["+": { (a: Int, b: Int) -> Int in return a + b },
|
|
57
|
+
"-": { (a: Int, b: Int) -> Int in return a - b },
|
|
58
|
+
"*": { (a: Int, b: Int) -> Int in return a * b },
|
|
59
|
+
"/": { (a: Int, b: Int) -> Int in return a / b }]
|
|
60
60
|
func answer() throws -> Int {
|
|
61
61
|
guard let toReturn = calculate(textIn) else {
|
|
62
62
|
throw CalculateError.error
|
|
@@ -111,7 +111,7 @@ struct WordProblem {
|
|
|
111
111
|
|
|
112
112
|
var newTextIn = Array(textInp.characters)
|
|
113
113
|
newTextIn = newTextIn.filter(checkCharInSet)
|
|
114
|
-
let newTextInString: [String] = newTextIn.map {String($0)}
|
|
114
|
+
let newTextInString: [String] = newTextIn.map { String($0) }
|
|
115
115
|
return newTextInString.joined(separator: "").trimWhiteSpace()
|
|
116
116
|
|
|
117
117
|
}
|
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.8.
|
|
4
|
+
version: 2.0.8.31
|
|
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-03-
|
|
11
|
+
date: 2017-03-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rubyzip
|
|
@@ -5935,6 +5935,7 @@ files:
|
|
|
5935
5935
|
- tracks/ocaml/tools/test-generator/templates/connect/template.ml
|
|
5936
5936
|
- tracks/ocaml/tools/test-generator/templates/difference-of-squares/template.ml
|
|
5937
5937
|
- tracks/ocaml/tools/test-generator/templates/dominoes/template.ml
|
|
5938
|
+
- tracks/ocaml/tools/test-generator/templates/etl/template.ml
|
|
5938
5939
|
- tracks/ocaml/tools/test-generator/templates/hamming/template.ml
|
|
5939
5940
|
- tracks/ocaml/tools/test-generator/templates/hello-world/template.ml
|
|
5940
5941
|
- tracks/ocaml/tools/test-generator/templates/leap/template.ml
|