trackler 2.0.3.2 → 2.0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +10 -0
- data/tracks/c/exercises/robot-simulator/makefile +16 -0
- data/tracks/c/exercises/robot-simulator/src/example.c +74 -0
- data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +41 -0
- data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +165 -0
- data/tracks/c/exercises/robot-simulator/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/robot-simulator/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/robot-simulator/test/vendor/unity_internals.h +701 -0
- data/tracks/ecmascript/exercises/rna-transcription/example.js +9 -2
- data/tracks/ecmascript/exercises/rna-transcription/rna-transcription.spec.js +18 -0
- data/tracks/go/exercises/hello-world/example.go +4 -2
- data/tracks/go/exercises/hello-world/hello_test.go +4 -4
- data/tracks/go/exercises/hello-world/hello_world.go +6 -6
- data/tracks/groovy/config.json +5 -0
- data/tracks/groovy/exercises/phone-number/Example.groovy +20 -0
- data/tracks/groovy/exercises/phone-number/PhoneNumberSpec.groovy +75 -0
- data/tracks/haskell/exercises/difference-of-squares/test/Tests.hs +2 -0
- data/tracks/java/config.json +13 -1
- data/tracks/java/exercises/all-your-base/build.gradle +17 -0
- data/tracks/java/exercises/all-your-base/src/example/java/BaseConverter.java +80 -0
- data/tracks/java/exercises/all-your-base/src/main/java/BaseConverter.java +5 -0
- data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +256 -0
- data/tracks/java/exercises/binary-search/build.gradle +17 -0
- data/tracks/java/exercises/binary-search/src/example/java/BinarySearch.java +40 -0
- data/tracks/java/exercises/binary-search/src/main/java/.keep +0 -0
- data/tracks/java/exercises/binary-search/src/main/java/BinarySearch.java +4 -0
- data/tracks/java/exercises/binary-search/src/test/java/.keep +0 -0
- data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +136 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/lua/config.json +16 -0
- data/tracks/lua/exercises/say/example.lua +92 -0
- data/tracks/lua/exercises/say/say_spec.lua +105 -0
- data/tracks/lua/exercises/secret-handshake/example.lua +17 -0
- data/tracks/lua/exercises/secret-handshake/secret-handshake_spec.lua +38 -0
- data/tracks/ocaml/config.json +10 -1
- data/tracks/ocaml/exercises/bracket-push/.merlin +3 -0
- data/tracks/ocaml/exercises/bracket-push/Makefile +11 -0
- data/tracks/ocaml/exercises/bracket-push/bracket_push.mli +3 -0
- data/tracks/ocaml/exercises/bracket-push/example.ml +40 -0
- data/tracks/ocaml/exercises/bracket-push/test.ml +38 -0
- data/tracks/ocaml/exercises/leap/test.ml +7 -7
- data/tracks/ocaml/tools/test-generator/Makefile +2 -2
- data/tracks/ocaml/tools/test-generator/interfaces/codegen.mli +2 -2
- data/tracks/ocaml/tools/test-generator/interfaces/{test_generator.mli → controller.mli} +0 -0
- data/tracks/ocaml/tools/test-generator/interfaces/parser.mli +7 -1
- data/tracks/ocaml/tools/test-generator/interfaces/special_cases.mli +2 -2
- data/tracks/ocaml/tools/test-generator/interfaces/utils.mli +4 -0
- data/tracks/ocaml/tools/test-generator/src/codegen.ml +9 -5
- data/tracks/ocaml/tools/test-generator/src/{test_generator.ml → controller.ml} +24 -15
- data/tracks/ocaml/tools/test-generator/src/model.ml +6 -0
- data/tracks/ocaml/tools/test-generator/src/parser.ml +34 -7
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +11 -4
- data/tracks/ocaml/tools/test-generator/src/template.ml +49 -6
- data/tracks/ocaml/tools/test-generator/src/test_gen.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/utils.ml +6 -0
- data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/bracket-push/template.ml +16 -0
- data/tracks/ocaml/tools/test-generator/templates/difference-of-squares/template.ml +19 -0
- data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/hello-world/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/say/template.ml +3 -3
- data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +2 -2
- data/tracks/ocaml/tools/test-generator/test/all_tests.ml +3 -1
- data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +7 -7
- data/tracks/ocaml/tools/test-generator/test/difference_of_squares.json +67 -0
- data/tracks/ocaml/tools/test-generator/test/hello_world.json +23 -0
- data/tracks/ocaml/tools/test-generator/test/parser_test.ml +30 -12
- data/tracks/ocaml/tools/test-generator/test/sample-suite-template.txt +16 -0
- data/tracks/ocaml/tools/test-generator/test/sample_template.txt +2 -2
- data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/template_test.ml +40 -6
- data/tracks/perl6/.travis.yml +3 -0
- data/tracks/perl6/docs/RESOURCES.md +1 -1
- data/tracks/perl6/exercises/accumulate/accumulate.t +3 -7
- data/tracks/perl6/exercises/anagram/anagram.t +3 -7
- data/tracks/perl6/exercises/binary/binary.t +3 -7
- data/tracks/perl6/exercises/bob/bob.t +4 -8
- data/tracks/perl6/exercises/grains/grains.t +3 -7
- data/tracks/perl6/exercises/leap/leap.t +3 -7
- data/tracks/perl6/exercises/rna-transcription/rna_transcription.t +4 -8
- data/tracks/perl6/exercises/robot-name/robot.t +4 -8
- data/tracks/perl6/exercises/scrabble-score/scrabble_score.t +3 -7
- data/tracks/perl6/exercises/word-count/word_count.t +3 -8
- data/tracks/r/config.json +10 -0
- data/tracks/r/docs/ABOUT.md +14 -0
- data/tracks/r/exercises/difference-of-squares/difference-of-squares.R +5 -0
- data/tracks/r/exercises/difference-of-squares/example.R +6 -0
- data/tracks/r/exercises/difference-of-squares/test_difference-of-squares.R +23 -0
- data/tracks/r/exercises/hamming/example.R +8 -0
- data/tracks/r/exercises/hamming/hamming.R +4 -0
- data/tracks/r/exercises/hamming/test_hamming.R +87 -0
- data/tracks/ruby/exercises/binary/.version +1 -1
- data/tracks/ruby/exercises/binary/binary_test.rb +17 -19
- data/tracks/ruby/exercises/binary/example.rb +13 -13
- data/tracks/ruby/exercises/isogram/.version +1 -1
- data/tracks/ruby/exercises/isogram/example.rb +1 -1
- data/tracks/ruby/exercises/isogram/isogram_test.rb +16 -30
- data/tracks/ruby/lib/binary_cases.rb +2 -3
- data/tracks/ruby/lib/isogram_cases.rb +1 -5
- data/tracks/scala/exercises/phone-number/HINTS.md +9 -0
- metadata +45 -4
@@ -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,40 @@
|
|
1
|
+
|
2
|
+
import java.util.List;
|
3
|
+
|
4
|
+
public class BinarySearch<T extends Comparable<T>> {
|
5
|
+
|
6
|
+
private List<T> array;
|
7
|
+
private int arraySize;
|
8
|
+
|
9
|
+
public BinarySearch(List<T> array) {
|
10
|
+
this.array = array;
|
11
|
+
this.arraySize = array.size();
|
12
|
+
}
|
13
|
+
|
14
|
+
public int indexOf(T value) {
|
15
|
+
return search(value);
|
16
|
+
}
|
17
|
+
|
18
|
+
public List<T> getArray() {
|
19
|
+
return array;
|
20
|
+
}
|
21
|
+
|
22
|
+
private int search(T value) {
|
23
|
+
int left = 0;
|
24
|
+
int right = this.arraySize - 1;
|
25
|
+
int middle;
|
26
|
+
T element;
|
27
|
+
while (left <= right) {
|
28
|
+
middle = (int) Math.floor(0.5 * (left + right));
|
29
|
+
element = this.array.get(middle);
|
30
|
+
if (value.compareTo(element) > 0) {
|
31
|
+
left = middle + 1;
|
32
|
+
} else if (value.compareTo(element) < 0) {
|
33
|
+
right = middle - 1;
|
34
|
+
} else {
|
35
|
+
return middle;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return -1;
|
39
|
+
}
|
40
|
+
}
|
File without changes
|
File without changes
|
@@ -0,0 +1,136 @@
|
|
1
|
+
|
2
|
+
import java.util.ArrayList;
|
3
|
+
import java.util.Arrays;
|
4
|
+
import java.util.Collections;
|
5
|
+
import java.util.List;
|
6
|
+
import static org.junit.Assert.assertEquals;
|
7
|
+
import org.junit.Ignore;
|
8
|
+
import org.junit.Test;
|
9
|
+
|
10
|
+
public class BinarySearchTest {
|
11
|
+
|
12
|
+
public static final List<Integer> EMPTY_LIST
|
13
|
+
= Collections.unmodifiableList(new ArrayList<Integer>(0));
|
14
|
+
|
15
|
+
public static final List<Integer> LIST_OF_UNIT_LENGTH
|
16
|
+
= Collections.unmodifiableList(
|
17
|
+
Arrays.asList(6)
|
18
|
+
);
|
19
|
+
|
20
|
+
private static final List<Integer> SORTED_LIST
|
21
|
+
= Collections.unmodifiableList(
|
22
|
+
Arrays.asList(1, 3, 4, 6, 8, 9, 11)
|
23
|
+
);
|
24
|
+
|
25
|
+
public static final List<Integer> SORTED_LIST_OF_ODD_LENGTH
|
26
|
+
= Collections.unmodifiableList(
|
27
|
+
Arrays.asList(1, 3, 5, 8, 13, 21, 34, 55,
|
28
|
+
89, 144, 233, 377, 634)
|
29
|
+
);
|
30
|
+
|
31
|
+
public static final List<Integer> SORTED_LIST_OF_EVEN_LENGTH
|
32
|
+
= Collections.unmodifiableList(
|
33
|
+
Arrays.asList(1, 3, 5, 8, 13, 21, 34, 55,
|
34
|
+
89, 144, 233, 377)
|
35
|
+
);
|
36
|
+
|
37
|
+
@Test
|
38
|
+
public void findsAValueInAnArrayWithOneElement() {
|
39
|
+
BinarySearch<Integer> sut = new BinarySearch<>(LIST_OF_UNIT_LENGTH);
|
40
|
+
final int value = 6;
|
41
|
+
final int actual = sut.indexOf(value);
|
42
|
+
final int expected = 0;
|
43
|
+
assertEquals(expected, actual);
|
44
|
+
}
|
45
|
+
|
46
|
+
@Ignore
|
47
|
+
@Test
|
48
|
+
public void findsAValueInTheMiddleOfAnArray() {
|
49
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
50
|
+
final int value = 6;
|
51
|
+
final int actual = sut.indexOf(value);
|
52
|
+
final int expected = 3;
|
53
|
+
assertEquals(expected, actual);
|
54
|
+
}
|
55
|
+
|
56
|
+
@Ignore
|
57
|
+
@Test
|
58
|
+
public void findsAValueAtTheBeginningOfAnArray() {
|
59
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
60
|
+
final int value = 1;
|
61
|
+
final int actual = sut.indexOf(value);
|
62
|
+
final int expected = 0;
|
63
|
+
assertEquals(expected, actual);
|
64
|
+
}
|
65
|
+
|
66
|
+
@Ignore
|
67
|
+
@Test
|
68
|
+
public void findsAValueAtTheEndOfAnArray() {
|
69
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
70
|
+
final int value = 11;
|
71
|
+
final int actual = sut.indexOf(value);
|
72
|
+
final int expected = 6;
|
73
|
+
assertEquals(expected, actual);
|
74
|
+
}
|
75
|
+
|
76
|
+
@Ignore
|
77
|
+
@Test
|
78
|
+
public void findsAValueInAnArrayOfOddLength() {
|
79
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST_OF_ODD_LENGTH);
|
80
|
+
final int value = 144;
|
81
|
+
final int actual = sut.indexOf(value);
|
82
|
+
final int expected = 9;
|
83
|
+
assertEquals(expected, actual);
|
84
|
+
}
|
85
|
+
|
86
|
+
@Ignore
|
87
|
+
@Test
|
88
|
+
public void findsAValueInAnArrayOfEvenLength() {
|
89
|
+
BinarySearch<Integer> sut
|
90
|
+
= new BinarySearch<>(SORTED_LIST_OF_EVEN_LENGTH);
|
91
|
+
final int value = 21;
|
92
|
+
final int actual = sut.indexOf(value);
|
93
|
+
final int expected = 5;
|
94
|
+
assertEquals(expected, actual);
|
95
|
+
}
|
96
|
+
|
97
|
+
@Ignore
|
98
|
+
@Test
|
99
|
+
public void identifiesThatAValueIsNotIncludedInTheArray() {
|
100
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
101
|
+
final int value = 7;
|
102
|
+
final int actual = sut.indexOf(value);
|
103
|
+
final int expected = -1;
|
104
|
+
assertEquals(expected, actual);
|
105
|
+
}
|
106
|
+
|
107
|
+
@Ignore
|
108
|
+
@Test
|
109
|
+
public void aValueSmallerThanTheArraysSmallestValueIsNotIncluded() {
|
110
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
111
|
+
final int value = 0;
|
112
|
+
final int actual = sut.indexOf(value);
|
113
|
+
final int expected = -1;
|
114
|
+
assertEquals(expected, actual);
|
115
|
+
}
|
116
|
+
|
117
|
+
@Ignore
|
118
|
+
@Test
|
119
|
+
public void aValueLargerThanTheArraysSmallestValueIsNotIncluded() {
|
120
|
+
BinarySearch<Integer> sut = new BinarySearch<>(SORTED_LIST);
|
121
|
+
final int value = 13;
|
122
|
+
final int actual = sut.indexOf(value);
|
123
|
+
final int expected = -1;
|
124
|
+
assertEquals(expected, actual);
|
125
|
+
}
|
126
|
+
|
127
|
+
@Ignore
|
128
|
+
@Test
|
129
|
+
public void nothingIsIncludedInAnEmptyArray() {
|
130
|
+
BinarySearch<Integer> sut = new BinarySearch<>(EMPTY_LIST);
|
131
|
+
final int value = 1;
|
132
|
+
final int actual = sut.indexOf(value);
|
133
|
+
final int expected = -1;
|
134
|
+
assertEquals(expected, actual);
|
135
|
+
}
|
136
|
+
}
|
data/tracks/lua/config.json
CHANGED
@@ -558,6 +558,14 @@
|
|
558
558
|
"control-flow (if-else statements)",
|
559
559
|
"control-flow (loops)"
|
560
560
|
]
|
561
|
+
}, {
|
562
|
+
"slug": "say",
|
563
|
+
"difficulty": 7,
|
564
|
+
"topics": [
|
565
|
+
"strings",
|
566
|
+
"text formatting",
|
567
|
+
"control-flow (loops)"
|
568
|
+
]
|
561
569
|
}, {
|
562
570
|
"slug": "pov",
|
563
571
|
"difficulty": 9,
|
@@ -575,6 +583,14 @@
|
|
575
583
|
"control-flow (if-else statements)",
|
576
584
|
"control-flow (loops)"
|
577
585
|
]
|
586
|
+
}, {
|
587
|
+
"slug": "secret-handshake",
|
588
|
+
"difficulty": 3,
|
589
|
+
"topics": [
|
590
|
+
"control-flow (if-else statements)",
|
591
|
+
"arrays",
|
592
|
+
"bitwise operations"
|
593
|
+
]
|
578
594
|
}],
|
579
595
|
"deprecated": [
|
580
596
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
local ones = {
|
2
|
+
[1] = 'one',
|
3
|
+
[2] = 'two',
|
4
|
+
[3] = 'three',
|
5
|
+
[4] = 'four',
|
6
|
+
[5] = 'five',
|
7
|
+
[6] = 'six',
|
8
|
+
[7] = 'seven',
|
9
|
+
[8] = 'eight',
|
10
|
+
[9] = 'nine'
|
11
|
+
}
|
12
|
+
|
13
|
+
local teens = {
|
14
|
+
[10] = 'ten',
|
15
|
+
[11] = 'eleven',
|
16
|
+
[12] = 'twelve',
|
17
|
+
[13] = 'thirteen',
|
18
|
+
[14] = 'fourteen',
|
19
|
+
[15] = 'fifteen',
|
20
|
+
[16] = 'sixteen',
|
21
|
+
[17] = 'seventeen',
|
22
|
+
[18] = 'eighteen',
|
23
|
+
[19] = 'nineteen',
|
24
|
+
}
|
25
|
+
|
26
|
+
local tens = {
|
27
|
+
[2] = 'twenty',
|
28
|
+
[3] = 'thirty',
|
29
|
+
[4] = 'forty',
|
30
|
+
[5] = 'fifty',
|
31
|
+
[6] = 'sixty',
|
32
|
+
[7] = 'seventy',
|
33
|
+
[8] = 'eighty',
|
34
|
+
[9] = 'ninety'
|
35
|
+
}
|
36
|
+
|
37
|
+
local group_name = {
|
38
|
+
'thousand',
|
39
|
+
'million',
|
40
|
+
'billion'
|
41
|
+
}
|
42
|
+
|
43
|
+
local function say_group(n)
|
44
|
+
local said = ''
|
45
|
+
|
46
|
+
if n // 100 > 0 then
|
47
|
+
said = said .. ones[n // 100] .. ' hundred'
|
48
|
+
n = n - (n // 100) * 100
|
49
|
+
if n > 0 then said = said .. ' ' end
|
50
|
+
end
|
51
|
+
|
52
|
+
if tens[n // 10] then
|
53
|
+
said = said .. tens[n // 10]
|
54
|
+
n = n - (n // 10) * 10
|
55
|
+
if n > 0 then said = said .. '-' end
|
56
|
+
end
|
57
|
+
|
58
|
+
if teens[n] then
|
59
|
+
said = said .. teens[n]
|
60
|
+
elseif ones[n] then
|
61
|
+
said = said .. ones[n]
|
62
|
+
end
|
63
|
+
|
64
|
+
return said
|
65
|
+
end
|
66
|
+
|
67
|
+
return function(n)
|
68
|
+
if n < 0 or n > 999999999999 then return -1 end
|
69
|
+
|
70
|
+
local blahs = {}
|
71
|
+
local group_index = 0
|
72
|
+
|
73
|
+
while n > 0 do
|
74
|
+
local group = say_group(n % 1000)
|
75
|
+
|
76
|
+
if group ~= '' then
|
77
|
+
if group_name[group_index] then
|
78
|
+
group = group .. ' ' .. group_name[group_index]
|
79
|
+
end
|
80
|
+
table.insert(blahs, 1, group)
|
81
|
+
end
|
82
|
+
|
83
|
+
n = n // 1000
|
84
|
+
group_index = group_index + 1
|
85
|
+
end
|
86
|
+
|
87
|
+
if #blahs == 0 then
|
88
|
+
return 'zero'
|
89
|
+
else
|
90
|
+
return table.concat(blahs, ' ')
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
-- Workaround for the fact busted has a built-in called 'say'
|
2
|
+
local say = loadfile 'say.lua'()
|
3
|
+
|
4
|
+
describe('say', function()
|
5
|
+
it('should say 0', function()
|
6
|
+
assert.are.equal('zero', say(0))
|
7
|
+
end)
|
8
|
+
|
9
|
+
it('should say 1', function()
|
10
|
+
assert.are.equal('one', say(1))
|
11
|
+
end)
|
12
|
+
|
13
|
+
it('should say 14', function()
|
14
|
+
assert.are.equal('fourteen', say(14))
|
15
|
+
end)
|
16
|
+
|
17
|
+
it('should say 20', function()
|
18
|
+
assert.are.equal('twenty', say(20))
|
19
|
+
end)
|
20
|
+
|
21
|
+
it('should say 22', function()
|
22
|
+
assert.are.equal('twenty-two', say(22))
|
23
|
+
end)
|
24
|
+
|
25
|
+
it('should say 100', function()
|
26
|
+
assert.are.equal('one hundred', say(100))
|
27
|
+
end)
|
28
|
+
|
29
|
+
it('should say 123', function()
|
30
|
+
assert.are.equal('one hundred twenty-three', say(123))
|
31
|
+
end)
|
32
|
+
|
33
|
+
it('should say 1,000', function()
|
34
|
+
assert.are.equal('one thousand', say(1000))
|
35
|
+
end)
|
36
|
+
|
37
|
+
it('should say 1,234', function()
|
38
|
+
assert.are.equal('one thousand two hundred thirty-four', say(1234))
|
39
|
+
end)
|
40
|
+
|
41
|
+
it('should say 1,000,000', function()
|
42
|
+
assert.are.equal('one million', say(1000000))
|
43
|
+
end)
|
44
|
+
|
45
|
+
it('should say 1,002,345', function()
|
46
|
+
assert.are.equal('one million two thousand three hundred forty-five', say(1002345))
|
47
|
+
end)
|
48
|
+
|
49
|
+
it('should say 1,000,000,000', function()
|
50
|
+
assert.are.equal('one billion', say(1000000000))
|
51
|
+
end)
|
52
|
+
|
53
|
+
it('should say very large numbers', function()
|
54
|
+
assert.are.equal(
|
55
|
+
'nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three',
|
56
|
+
say(987654321123)
|
57
|
+
)
|
58
|
+
end)
|
59
|
+
|
60
|
+
it('should say all ones', function()
|
61
|
+
assert.are.equal('one', say(1))
|
62
|
+
assert.are.equal('two', say(2))
|
63
|
+
assert.are.equal('three', say(3))
|
64
|
+
assert.are.equal('four', say(4))
|
65
|
+
assert.are.equal('five', say(5))
|
66
|
+
assert.are.equal('six', say(6))
|
67
|
+
assert.are.equal('seven', say(7))
|
68
|
+
assert.are.equal('eight', say(8))
|
69
|
+
assert.are.equal('nine', say(9))
|
70
|
+
end)
|
71
|
+
|
72
|
+
it('should say all teens', function()
|
73
|
+
assert.are.equal('ten', say(10))
|
74
|
+
assert.are.equal('eleven', say(11))
|
75
|
+
assert.are.equal('twelve', say(12))
|
76
|
+
assert.are.equal('thirteen', say(13))
|
77
|
+
assert.are.equal('fourteen', say(14))
|
78
|
+
assert.are.equal('fifteen', say(15))
|
79
|
+
assert.are.equal('sixteen', say(16))
|
80
|
+
assert.are.equal('seventeen', say(17))
|
81
|
+
assert.are.equal('eighteen', say(18))
|
82
|
+
assert.are.equal('nineteen', say(19))
|
83
|
+
end)
|
84
|
+
|
85
|
+
it('should say all tens', function()
|
86
|
+
assert.are.equal('twenty', say(20))
|
87
|
+
assert.are.equal('thirty', say(30))
|
88
|
+
assert.are.equal('forty', say(40))
|
89
|
+
assert.are.equal('fifty', say(50))
|
90
|
+
assert.are.equal('sixty', say(60))
|
91
|
+
assert.are.equal('seventy', say(70))
|
92
|
+
assert.are.equal('eighty', say(80))
|
93
|
+
assert.are.equal('ninety', say(90))
|
94
|
+
end)
|
95
|
+
|
96
|
+
it('should not say negative numbers', function()
|
97
|
+
assert.are.equal(-1, say(-1))
|
98
|
+
assert.are.equal(-1, say(-5))
|
99
|
+
end)
|
100
|
+
|
101
|
+
it('should not say numbers above 999,999,999,999', function()
|
102
|
+
assert.are.equal(-1, say(1000000000000))
|
103
|
+
assert.are.equal(-1, say(1000000000005))
|
104
|
+
end)
|
105
|
+
end)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
local function reverse(t)
|
2
|
+
local reversed = {}
|
3
|
+
for i = #t, 1, -1 do
|
4
|
+
table.insert(reversed, t[i])
|
5
|
+
end
|
6
|
+
return reversed
|
7
|
+
end
|
8
|
+
|
9
|
+
return function(n)
|
10
|
+
local handshake = {}
|
11
|
+
if n & 1 > 0 then table.insert(handshake, 'wink') end
|
12
|
+
if n & 2 > 0 then table.insert(handshake, 'double blink') end
|
13
|
+
if n & 4 > 0 then table.insert(handshake, 'close your eyes') end
|
14
|
+
if n & 8 > 0 then table.insert(handshake, 'jump') end
|
15
|
+
if n & 16 > 0 then handshake = reverse(handshake) end
|
16
|
+
return handshake
|
17
|
+
end
|