trackler 2.2.1.106 → 2.2.1.107

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/delphi/exercises/bowling/uBowlingExample.pas +31 -4
  4. data/tracks/delphi/exercises/bowling/uBowlingTests.pas +81 -5
  5. data/tracks/elm/config/exercise_readme.go.tmpl +29 -4
  6. data/tracks/elm/exercises/accumulate/README.md +0 -3
  7. data/tracks/elm/exercises/all-your-base/README.md +0 -1
  8. data/tracks/elm/exercises/allergies/README.md +0 -1
  9. data/tracks/elm/exercises/atbash-cipher/README.md +2 -1
  10. data/tracks/elm/exercises/etl/README.md +3 -1
  11. data/tracks/elm/exercises/grade-school/README.md +0 -1
  12. data/tracks/elm/exercises/grains/README.md +0 -1
  13. data/tracks/elm/exercises/leap/README.md +1 -1
  14. data/tracks/elm/exercises/list-ops/README.md +0 -1
  15. data/tracks/elm/exercises/nucleotide-count/README.md +8 -22
  16. data/tracks/elm/exercises/pangram/README.md +1 -1
  17. data/tracks/elm/exercises/pascals-triangle/README.md +1 -1
  18. data/tracks/elm/exercises/phone-number/README.md +4 -3
  19. data/tracks/elm/exercises/rna-transcription/README.md +2 -2
  20. data/tracks/elm/exercises/roman-numerals/README.md +1 -1
  21. data/tracks/elm/exercises/run-length-encoding/README.md +4 -4
  22. data/tracks/elm/exercises/scrabble-score/README.md +3 -1
  23. data/tracks/elm/exercises/space-age/README.md +1 -1
  24. data/tracks/elm/exercises/sublist/README.md +0 -1
  25. data/tracks/elm/exercises/sum-of-multiples/README.md +3 -6
  26. data/tracks/elm/exercises/triangle/README.md +9 -6
  27. data/tracks/elm/exercises/word-count/README.md +1 -2
  28. data/tracks/go/config.json +12 -0
  29. data/tracks/go/exercises/forth/.meta/gen.go +5 -3
  30. data/tracks/go/exercises/forth/cases_test.go +2 -2
  31. data/tracks/go/exercises/grains/.meta/gen.go +10 -8
  32. data/tracks/go/exercises/grains/cases_test.go +2 -2
  33. data/tracks/go/exercises/isogram/.meta/gen.go +5 -3
  34. data/tracks/go/exercises/isogram/cases_test.go +2 -2
  35. data/tracks/go/exercises/proverb/.meta/gen.go +51 -0
  36. data/tracks/go/exercises/proverb/README.md +41 -0
  37. data/tracks/go/exercises/proverb/cases_test.go +44 -0
  38. data/tracks/go/exercises/proverb/example.go +19 -0
  39. data/tracks/go/exercises/proverb/proverb.go +15 -0
  40. data/tracks/go/exercises/proverb/proverb_test.go +23 -0
  41. data/tracks/julia/exercises/isbn-verifier/example.jl +2 -0
  42. data/tracks/julia/exercises/isbn-verifier/runtests.jl +4 -4
  43. data/tracks/rust/exercises/two-bucket/README.md +1 -1
  44. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketPushTest.scala +17 -15
  45. data/tracks/scala/exercises/change/src/test/scala/ChangeTest.scala +2 -2
  46. data/tracks/scala/exercises/collatz-conjecture/src/test/scala/CollatzConjectureTest.scala +2 -2
  47. data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +1 -1
  48. data/tracks/scala/exercises/crypto-square/src/test/scala/CryptoSquareTest.scala +20 -41
  49. data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +58 -40
  50. data/tracks/scala/exercises/difference-of-squares/src/test/scala/DifferenceOfSquaresTest.scala +1 -1
  51. data/tracks/scala/testgen/src/main/scala/BracketPushTestGenerator.scala +1 -1
  52. data/tracks/scala/testgen/src/main/scala/ChangeTestGenerator.scala +3 -3
  53. data/tracks/scala/testgen/src/main/scala/CollatzConjectureTestGenerator.scala +3 -3
  54. data/tracks/scala/testgen/src/main/scala/ConnectTestGenerator.scala +6 -6
  55. data/tracks/scala/testgen/src/main/scala/CryptoSquareTestGenerator.scala +1 -1
  56. data/tracks/scala/testgen/src/main/scala/CustomSetTestGenerator.scala +32 -26
  57. data/tracks/scala/testgen/src/main/scala/DifferenceOfSquaresTestGenerator.scala +1 -1
  58. metadata +8 -3
  59. data/tracks/elm/docs/EXERCISE_README_INSERT.md +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d834493b144aa3cc972608752f2ad761e230722
4
- data.tar.gz: c32fd3c60a8a9a33fd3b4e88c73263330f502885
3
+ metadata.gz: f11bde21663899b9a570b97621e391aa62e5f379
4
+ data.tar.gz: 8480dc1e43e611925e76989d561e0e19ea28cefb
5
5
  SHA512:
6
- metadata.gz: b74d350bd3e7cdf94a468c5e461d46d063af7152bbca12a260801b94be01bc9db3c9c4603e834e6a9f5a814b4990644f6d4c183403863d4dd30440c4582f3555
7
- data.tar.gz: 20d1b9a4b558de8ec50fff78c345a8d341af8eebfc9fc55bc41fea7ba159154e3bb27c338ca7ed8173a11f526d5fd0eb4ec023b9178756dd22c910b5f1cc20d2
6
+ metadata.gz: e6c6211c8f2f91615e89d35a0cf2b3fb6d993d35baa4106ed91f2c419827bb68768b7e4330879e20497ea9f5da663d6ee7b1832080bd35098a401d97b8d176b0
7
+ data.tar.gz: 8474814afc978a6120f745e9857a2b3b294074b6926cecf6e10917df0af891ac7d9517837dfbcf229560cb031ff9d7afe89751fa85e667b51dd5c78e9221e1cb
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.106"
2
+ VERSION = "2.2.1.107"
3
3
  end
@@ -5,7 +5,7 @@ interface
5
5
  type
6
6
  IBowlingGame = interface(IInvokable)
7
7
  ['{D4A292B6-BC15-48ED-AE04-2D34759017CB}']
8
- procedure Roll(aPins: integer);
8
+ function Roll(aPins: integer): Boolean;
9
9
  function Score: integer;
10
10
  end;
11
11
 
@@ -28,10 +28,11 @@ type
28
28
  function SpareBonus(aFrameIndex: integer): integer;
29
29
  function SumOfPinsInFrame(aFrameIndex: integer): integer;
30
30
  function CorrectNumberOfRolls(aFrameIndex: integer): boolean;
31
+ function ValidInput(aPin: integer): Boolean;
31
32
  public
32
33
  constructor create;
33
34
  function Score: integer;
34
- procedure Roll(aPins: integer);
35
+ function Roll(aPins: integer): Boolean;
35
36
  end;
36
37
 
37
38
  function NewBowlingGame: IBowlingGame;
@@ -44,8 +45,11 @@ begin
44
45
  fRolls := TList<integer>.Create;
45
46
  end;
46
47
 
47
- procedure TBowlingGame.Roll(aPins: Integer);
48
+ function TBowlingGame.Roll(aPins: Integer): Boolean;
48
49
  begin
50
+ if not ValidInput(aPins) then
51
+ exit(false);
52
+
49
53
  fRolls.Add(aPins);
50
54
  end;
51
55
 
@@ -59,6 +63,8 @@ begin
59
63
  lScore := 0;
60
64
  lFrameIndex := 0;
61
65
  try
66
+ if (fRolls.Count < 12) or (fRolls.Count > 21) then
67
+ raise EArgumentException.Create('Not a proper game');
62
68
  for i := 1 to fNumberOfFrames do
63
69
  begin
64
70
  if fRolls.Count <= lFrameIndex then
@@ -70,7 +76,7 @@ begin
70
76
  raise EArgumentException.Create('Not a proper game');
71
77
 
72
78
  lStrikeBonus := StrikeBonus(lFrameIndex);
73
- if (lStrikeBonus > fMaximumFrameScore) and not IsStrike(lFrameIndex + 1) then
79
+ if (lStrikeBonus > fMaximumFrameScore) and not IsStrike(lFrameIndex + 1) or (lStrikeBonus > 20) then
74
80
  raise EArgumentException.Create('Not a proper game');
75
81
 
76
82
  lScore := lScore + 10 + lStrikeBonus;
@@ -126,6 +132,27 @@ begin
126
132
  result := fRolls[aFrameIndex] + fRolls[aFrameIndex + 1];
127
133
  end;
128
134
 
135
+ function TBowlingGame.ValidInput(aPin: integer): Boolean;
136
+ begin
137
+ result := true;
138
+ if (fRolls.Count >= 21) or (aPin < 0) or (aPin > 10) or
139
+ ((fRolls.Count + 1) mod 2 = 0) and (fRolls[fRolls.Count - 1] <> 10) and ((fRolls[fRolls.Count - 1] + aPin) > 10) then
140
+ exit(false);
141
+
142
+ if (fRolls.Count = 20) then
143
+ begin
144
+ if (fRolls[18] <> 10) and (fRolls[18] + fRolls[19] <> 10) then
145
+ exit(false);
146
+
147
+ if (aPin = 10) and ((fRolls[18] <> 10) or (fRolls[19] <> 10) or (fRolls[19] + aPin > 10) and (fRolls[19] + aPin <> 20)) and
148
+ (fRolls[18] + fRolls[19] <> 10) then
149
+ exit(false);
150
+
151
+ if (aPin <> 10) and (fRolls[19] + aPin > 10) and (fRolls[19] <> 10) then
152
+ exit(false);
153
+ end;
154
+ end;
155
+
129
156
  function TBowlingGame.CorrectNumberOfRolls(aFrameIndex: Integer): boolean;
130
157
  begin
131
158
  result := aFrameIndex = fRolls.Count;
@@ -5,6 +5,9 @@ uses
5
5
  DUnitX.TestFramework,
6
6
  uBowling;
7
7
 
8
+ const
9
+ CanonicalVersion = '1.2.0';
10
+
8
11
  type
9
12
 
10
13
  [TestFixture]
@@ -13,7 +16,7 @@ type
13
16
  class function RollMany(pins: array of integer; game: IBowlingGame): IBowlingGame; static;
14
17
  public
15
18
  [Test]
16
- // [Ignore('Comment the "[Ignore]" statement to run the test')]
19
+ // [Ignore('Comment the "[Ignore]" statement to run the test')]
17
20
  procedure Should_be_able_to_score_a_game_with_all_zeros;
18
21
 
19
22
  [Test]
@@ -80,10 +83,26 @@ type
80
83
  [Ignore]
81
84
  procedure Two_rolls_in_a_frame_cannot_score_more_than_10_points;
82
85
 
86
+ [Test]
87
+ [Ignore]
88
+ procedure Bonus_roll_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
89
+
83
90
  [Test]
84
91
  [Ignore]
85
92
  procedure Two_bonus_rolls_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
86
93
 
94
+ [Test]
95
+ [Ignore]
96
+ procedure Two_bonus_rolls_after_a_strike_in_the_last_frame_can_score_more_than_10_points_if_one_is_a_strike;
97
+
98
+ [Test]
99
+ [Ignore]
100
+ procedure The_second_bonus_rolls_after_a_strike_in_the_last_frame_cannot_be_a_strike_if_the_first_one_is_not_a_strike;
101
+
102
+ [Test]
103
+ [Ignore]
104
+ procedure Second_bonus_roll_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
105
+
87
106
  [Test]
88
107
  [Ignore]
89
108
  procedure An_unstarted_game_cannot_be_scored;
@@ -94,7 +113,7 @@ type
94
113
 
95
114
  [Test]
96
115
  [Ignore]
97
- procedure A_game_with_more_than_ten_frames_cannot_be_scored;
116
+ procedure Cannot_roll_if_game_already_has_ten_frames;
98
117
 
99
118
  [Test]
100
119
  [Ignore]
@@ -107,11 +126,26 @@ type
107
126
  [Test]
108
127
  [Ignore]
109
128
  procedure Bonus_roll_for_a_spare_in_the_last_frame_must_be_rolled_before_score_can_be_calculated;
129
+
130
+ [Test]
131
+ [Ignore]
132
+ procedure Cannot_roll_after_bonus_roll_for_spare;
133
+
134
+ [Test]
135
+ [Ignore]
136
+ procedure Cannot_roll_after_bonus_rolls_for_strike;
110
137
  end;
111
138
 
112
139
  implementation
113
140
  uses System.SysUtils;
114
141
 
142
+ procedure BowlingTests.Second_bonus_roll_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
143
+ var game: IBowlingGame;
144
+ begin
145
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10], NewBowlingGame);
146
+ Assert.IsFalse(game.Roll(11));
147
+ end;
148
+
115
149
  procedure BowlingTests.Should_be_able_to_score_a_game_with_all_zeros;
116
150
  var game: IBowlingGame;
117
151
  begin
@@ -231,6 +265,13 @@ begin
231
265
  Assert.AreEqual(-1, game.Score);
232
266
  end;
233
267
 
268
+ procedure BowlingTests.The_second_bonus_rolls_after_a_strike_in_the_last_frame_cannot_be_a_strike_if_the_first_one_is_not_a_strike;
269
+ var game: IBowlingGame;
270
+ begin
271
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 6], NewBowlingGame);
272
+ Assert.IsFalse(game.Roll(10));
273
+ end;
274
+
234
275
  procedure BowlingTests.Two_bonus_rolls_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
235
276
  var game: IBowlingGame;
236
277
  begin
@@ -238,6 +279,13 @@ begin
238
279
  Assert.AreEqual(-1, game.Score);
239
280
  end;
240
281
 
282
+ procedure BowlingTests.Two_bonus_rolls_after_a_strike_in_the_last_frame_can_score_more_than_10_points_if_one_is_a_strike;
283
+ var game: IBowlingGame;
284
+ begin
285
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 6], NewBowlingGame);
286
+ Assert.AreEqual(26, game.Score);
287
+ end;
288
+
241
289
  procedure BowlingTests.An_unstarted_game_cannot_be_scored;
242
290
  var game: IBowlingGame;
243
291
  begin
@@ -252,11 +300,25 @@ begin
252
300
  Assert.AreEqual(-1, game.Score);
253
301
  end;
254
302
 
255
- procedure BowlingTests.A_game_with_more_than_ten_frames_cannot_be_scored;
303
+ procedure BowlingTests.Cannot_roll_after_bonus_rolls_for_strike;
256
304
  var game: IBowlingGame;
257
305
  begin
258
- game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], NewBowlingGame);
259
- Assert.AreEqual(-1, game.Score);
306
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 2], NewBowlingGame);
307
+ Assert.IsFalse(game.Roll(2));
308
+ end;
309
+
310
+ procedure BowlingTests.Cannot_roll_after_bonus_roll_for_spare;
311
+ var game: IBowlingGame;
312
+ begin
313
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 2], NewBowlingGame);
314
+ Assert.IsFalse(game.Roll(2));
315
+ end;
316
+
317
+ procedure BowlingTests.Cannot_roll_if_game_already_has_ten_frames;
318
+ var game: IBowlingGame;
319
+ begin
320
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], NewBowlingGame);
321
+ Assert.IsFalse(game.Roll(0));
260
322
  end;
261
323
 
262
324
  procedure BowlingTests.Bonus_rolls_for_a_strike_in_the_last_frame_must_be_rolled_before_score_can_be_calculated;
@@ -273,6 +335,20 @@ begin
273
335
  Assert.AreEqual(-1, game.Score);
274
336
  end;
275
337
 
338
+ procedure BowlingTests.Bonus_roll_after_a_strike_in_the_last_frame_cannot_score_more_than_10_points;
339
+ var game: IBowlingGame;
340
+ begin
341
+ game := RollMany([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10], NewBowlingGame);
342
+ Assert.IsFalse(game.Roll(11));
343
+ (*{
344
+ var sut = new BowlingGame();
345
+ var previousRolls = new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10};
346
+ DoRoll(previousRolls, sut);
347
+ Assert.Throws<ArgumentException>(() => sut.Roll(11));
348
+ } (**)
349
+
350
+ end;
351
+
276
352
  procedure BowlingTests.Bonus_roll_for_a_spare_in_the_last_frame_must_be_rolled_before_score_can_be_calculated;
277
353
  var game: IBowlingGame;
278
354
  begin
@@ -4,10 +4,35 @@
4
4
  {{- with .Hints }}
5
5
  {{ . }}
6
6
  {{ end }}
7
- {{- with .TrackInsert }}
8
- {{ . }}
9
- {{ end }}
10
- {{- with .Spec.Credits -}}
7
+ ## Elm Installation
8
+
9
+ Refer to the [Exercism help page](http://exercism.io/languages/elm) for Elm
10
+ installation and learning resources.
11
+
12
+ ## Writing the Code
13
+
14
+ The first time you start an exercise, you'll need to ensure you have the
15
+ appropriate dependencies installed.
16
+
17
+ ```bash
18
+ $ npm install
19
+ ```
20
+
21
+ Execute the tests with:
22
+
23
+ ```bash
24
+ $ npm test
25
+ ```
26
+
27
+ Automatically run tests again when you save changes:
28
+
29
+ ```bash
30
+ $ npm run watch
31
+ ```
32
+
33
+ As you work your way through the test suite, be sure to remove the `skip <|`
34
+ calls from each test until you get them all passing!
35
+ {{ with .Spec.Credits }}
11
36
  ## Source
12
37
 
13
38
  {{ . }}
@@ -25,9 +25,6 @@ Keep your hands off that collect/map/fmap/whatchamacallit functionality
25
25
  provided by your standard library!
26
26
  Solve this one yourself using other basic tools instead.
27
27
 
28
- Lisp specific: it's perfectly fine to use `MAPCAR` or the equivalent,
29
- as this is idiomatic Lisp, not a library function.
30
-
31
28
  ## Elm Installation
32
29
 
33
30
  Refer to the [Exercism help page](http://exercism.io/languages/elm) for Elm
@@ -60,6 +60,5 @@ $ npm run watch
60
60
  As you work your way through the test suite, be sure to remove the `skip <|`
61
61
  calls from each test until you get them all passing!
62
62
 
63
-
64
63
  ## Submitting Incomplete Solutions
65
64
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -29,7 +29,6 @@ allergens that score 256, 512, 1024, etc.). Your program should
29
29
  ignore those components of the score. For example, if the allergy
30
30
  score is 257, your program should only report the eggs (1) allergy.
31
31
 
32
-
33
32
  ## Elm Installation
34
33
 
35
34
  Refer to the [Exercism help page](http://exercism.io/languages/elm) for Elm
@@ -9,7 +9,7 @@ letter, the second with the second-last, and so on.
9
9
 
10
10
  An Atbash cipher for the Latin alphabet would be as follows:
11
11
 
12
- ```plain
12
+ ```text
13
13
  Plain: abcdefghijklmnopqrstuvwxyz
14
14
  Cipher: zyxwvutsrqponmlkjihgfedcba
15
15
  ```
@@ -23,6 +23,7 @@ being 5 letters, and punctuation is excluded. This is to make it harder to guess
23
23
  things based on word boundaries.
24
24
 
25
25
  ## Examples
26
+
26
27
  - Encoding `test` gives `gvhg`
27
28
  - Decoding `gvhg` gives `test`
28
29
  - Decoding `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt` gives `thequickbrownfoxjumpsoverthelazydog`
@@ -1,8 +1,9 @@
1
- # Etl
1
+ # ETL
2
2
 
3
3
  We are going to do the `Transform` step of an Extract-Transform-Load.
4
4
 
5
5
  ### ETL
6
+
6
7
  Extract-Transform-Load (ETL) is a fancy way of saying, "We have some crufty, legacy data over in this system, and now we need it in this shiny new system over here, so
7
8
  we're going to migrate this."
8
9
 
@@ -11,6 +12,7 @@ once." That's then typically followed by much forehead slapping and
11
12
  moaning about how stupid we could possibly be.)
12
13
 
13
14
  ### The goal
15
+
14
16
  We're going to extract some scrabble scores from a legacy system.
15
17
 
16
18
  The old system stored a list of letters per score:
@@ -21,7 +21,6 @@ In the end, you should be able to:
21
21
  Note that all our students only have one name. (It's a small town, what
22
22
  do you want?)
23
23
 
24
-
25
24
  ## For bonus points
26
25
 
27
26
  Did you get the tests passing and the code clean? If you want to, these
@@ -15,7 +15,6 @@ Write code that shows:
15
15
  - how many grains were on each square, and
16
16
  - the total number of grains
17
17
 
18
-
19
18
  ## For bonus points
20
19
 
21
20
  Did you get the tests passing and the code clean? If you want to, these
@@ -4,7 +4,7 @@ Given a year, report if it is a leap year.
4
4
 
5
5
  The tricky thing here is that a leap year in the Gregorian calendar occurs:
6
6
 
7
- ```plain
7
+ ```text
8
8
  on every year that is evenly divisible by 4
9
9
  except every year that is evenly divisible by 100
10
10
  unless the year is also evenly divisible by 400
@@ -35,6 +35,5 @@ $ npm run watch
35
35
  As you work your way through the test suite, be sure to remove the `skip <|`
36
36
  calls from each test until you get them all passing!
37
37
 
38
-
39
38
  ## Submitting Incomplete Solutions
40
39
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -1,30 +1,16 @@
1
1
  # Nucleotide Count
2
2
 
3
- Given a DNA string, compute how many times each nucleotide occurs in the string.
3
+ Given a single stranded DNA string, compute how many times each nucleotide occurs in the string.
4
4
 
5
- DNA is represented by an alphabet of the following symbols: 'A', 'C',
6
- 'G', and 'T'.
7
-
8
- Each symbol represents a nucleotide, which is a fancy name for the
9
- particular molecules that happen to make up a large part of DNA.
10
-
11
- Shortest intro to biochemistry EVAR:
5
+ The genetic language of every living thing on the planet is DNA.
6
+ DNA is a large molecule that is built from an extremely long sequence of individual elements called nucleotides.
7
+ 4 types exist in DNA and these differ only slightly and can be represented as the following symbols: 'A' for adenine, 'C' for cytosine, 'G' for guanine, and 'T' thymine.
12
8
 
9
+ Here is an analogy:
13
10
  - twigs are to birds nests as
14
- - nucleotides are to DNA and RNA as
15
- - amino acids are to proteins as
16
- - sugar is to starch as
17
- - oh crap lipids
18
-
19
- I'm not going to talk about lipids because they're crazy complex.
20
-
21
- So back to nucleotides.
22
-
23
- DNA contains four types of them: adenine (`A`), cytosine (`C`), guanine
24
- (`G`), and thymine (`T`).
25
-
26
- RNA contains a slightly different set of nucleotides, but we don't care
27
- about that for now.
11
+ - nucleotides are to DNA as
12
+ - legos are to lego houses as
13
+ - words are to sentences as...
28
14
 
29
15
  ## Elm Installation
30
16
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Determine if a sentence is a pangram. A pangram (Greek: παν γράμμα, pan gramma,
4
4
  "every letter") is a sentence using every letter of the alphabet at least once.
5
- The best known English pangram is:
5
+ The best known English pangram is:
6
6
  > The quick brown fox jumps over the lazy dog.
7
7
 
8
8
  The alphabet used consists of ASCII letters `a` to `z`, inclusive, and is case