diff --git a/.eslintignore b/.eslintignore index dd2770ce..03223202 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,14 +1,3 @@ big-integer.js -exercises/custom-set -exercises/flatten-array exercises/grains/big-integer.js exercises/grains/big-integer.spec.js -exercises/linked-list -exercises/minesweeper -exercises/nth-prime -exercises/queen-attack -exercises/robot-simulator -exercises/saddle-points -exercises/secret-handshake -exercises/simple-cipher -exercises/simple-linked-list diff --git a/README.md b/README.md index 6001444c..4f5bffa2 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,3 @@ -# JavaScript [![Build Status](https://travis-ci.org/exercism/javascript.svg?branch=master)](https://travis-ci.org/exercism/javascript)[![Join the chat at https://gitter.im/exercism/xecmascript](https://badges.gitter.im/exercism/xecmascript.svg)](https://gitter.im/exercism/xecmascript?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -Exercism exercises in JavaScript - -## Installing - -To run the tests, you'll need NodeJS and Jasmine. For information about how to install these tools, see the [Javascript](http://exercism.io/languages/javascript/about) page. - -## Tasks - -The following commands assume that you are in the `javascript` directory: - -### Unit Tests: All Assignments - - make test - -### Unit Tests: Single Assignment - - make test-assignment ASSIGNMENT=wordy - -### Code Style - - npm run lint - -## Contributing Guide - -Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data) +# DEPRECATION NOTICE +This track is deprecated. Please see the https://github.com/exercism/javascript track. diff --git a/config.json b/config.json index 035b9e1b..e11dd1f6 100644 --- a/config.json +++ b/config.json @@ -1,1192 +1,1221 @@ { - "active": true, + "language": "JavaScript (Legacy)", + "active": false, + "blurb": "JavaScript is a scripting language, primarily used for creating dynamic websites and programming web servers. It's a very popular language, and supports a variety of programming paradigms.", + "test_pattern": ".*[.]spec[.]js$", "exercises": [ { + "slug": "hello-world", + "uuid": "4756cfc9-7509-4783-8be7-60e3376b8256", "core": true, + "unlocked_by": null, "difficulty": 1, - "slug": "hello-world", "topics": [ - "control-flow-(conditionals)", - "optional-values", + "control_flow_conditionals", + "optional_values", "strings", - "text-formatting" - ], - "uuid": "4756cfc9-7509-4783-8be7-60e3376b8256" + "text_formatting" + ] }, { + "slug": "two-fer", + "uuid": "5f3d1326-f0c5-44a6-b90a-6af3b7d455f1", "core": false, + "unlocked_by": "hello-world", "difficulty": 1, - "slug": "two-fer", "topics": [ - "strings", - "control-flow-(conditionals)" - ], - "unlocked_by": "hello-world", - "uuid": "5f3d1326-f0c5-44a6-b90a-6af3b7d455f1" + "control_flow_conditionals", + "strings" + ] }, { + "slug": "leap", + "uuid": "0c231a1c-55f7-47b6-8a54-ccae4ab0c65b", "core": true, + "unlocked_by": null, "difficulty": 1, - "slug": "leap", "topics": [ "booleans", "integers", "logic" - ], - "uuid": "0c231a1c-55f7-47b6-8a54-ccae4ab0c65b" + ] }, { + "slug": "reverse-string", + "uuid": "553a6be7-eecb-45dc-9cea-05126c525f1b", "core": false, + "unlocked_by": "leap", "difficulty": 2, - "slug": "reverse-string", "topics": [ - "loops", "for", + "loops", "strings" - ], - "unlocked_by": "leap", - "uuid": "553a6be7-eecb-45dc-9cea-05126c525f1b" + ] }, { + "slug": "rna-transcription", + "uuid": "d7f57ab9-2edb-44cb-a04e-c575c0f4be4c", "core": true, + "unlocked_by": null, "difficulty": 1, - "slug": "rna-transcription", "topics": [ "strings", "transforming" - ], - "uuid": "d7f57ab9-2edb-44cb-a04e-c575c0f4be4c" + ] }, { + "slug": "simple-cipher", + "uuid": "fff57c49-cde9-4a0c-b70b-2903cef212af", "core": true, + "unlocked_by": null, "difficulty": 1, - "slug": "simple-cipher", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "mathematics", "randomness", "strings", - "text-formatting", + "text_formatting", "transforming" - ], - "uuid": "fff57c49-cde9-4a0c-b70b-2903cef212af" + ] }, { + "slug": "pangram", + "uuid": "c57bf909-130f-46e6-97ca-aeed58df1a15", "core": true, + "unlocked_by": null, "difficulty": 2, - "slug": "pangram", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "lists", "maps", "searching", "strings" - ], - "uuid": "c57bf909-130f-46e6-97ca-aeed58df1a15" + ] }, { + "slug": "bob", + "uuid": "246be5d9-b361-4893-9707-f218ede2bed6", "core": true, + "unlocked_by": null, "difficulty": 2, - "slug": "bob", "topics": [ - "control-flow-(conditionals)", - "pattern-recognition", + "control_flow_conditionals", + "pattern_recognition", "polymorfism", - "regular-expressions", + "regular_expressions", "strings", "unicode" - ], - "uuid": "246be5d9-b361-4893-9707-f218ede2bed6" + ] }, { + "slug": "gigasecond", + "uuid": "49e4874b-d7e2-4305-a9bc-627fab4ada44", "core": true, + "unlocked_by": null, "difficulty": 2, - "slug": "gigasecond", "topics": [ "time" - ], - "uuid": "49e4874b-d7e2-4305-a9bc-627fab4ada44" + ] }, { + "slug": "space-age", + "uuid": "b668e11a-a8ce-4e94-ba68-3a1f0fa3f6c8", "core": true, + "unlocked_by": null, "difficulty": 3, - "slug": "space-age", "topics": [ "classes", - "floating-point-numbers", + "floating_point_numbers", "mathematics" - ], - "uuid": "b668e11a-a8ce-4e94-ba68-3a1f0fa3f6c8" + ] }, { + "slug": "binary", + "uuid": "c3035180-ff4c-4afe-8019-f8364158b74e", "core": true, + "unlocked_by": null, "difficulty": 4, - "slug": "binary", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics", - "regular-expressions", + "regular_expressions", "strings" - ], - "uuid": "c3035180-ff4c-4afe-8019-f8364158b74e" + ] }, { + "slug": "prime-factors", + "uuid": "73ecd6c2-e59b-4354-b305-64e28a60433f", "core": true, + "unlocked_by": null, "difficulty": 4, - "slug": "prime-factors", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics" - ], - "uuid": "73ecd6c2-e59b-4354-b305-64e28a60433f" + ] }, { + "slug": "matrix", + "uuid": "fbfe6032-c209-40bd-b485-8b2881638166", "core": true, + "unlocked_by": null, "difficulty": 4, - "slug": "matrix", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "data-structures", + "control_flow_conditionals", + "control_flow_loops", + "data_structures", "matrices", - "text-formatting" - ], - "uuid": "fbfe6032-c209-40bd-b485-8b2881638166" + "text_formatting" + ] }, { + "slug": "linked-list", + "uuid": "ecc41237-f629-458f-873e-2cc51ba1a385", "core": true, + "unlocked_by": null, "difficulty": 5, - "slug": "linked-list", "topics": [ "algorithms", "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "data-structures", + "control_flow_conditionals", + "control_flow_loops", + "data_structures", "lists", - "optional-values" - ], - "uuid": "ecc41237-f629-458f-873e-2cc51ba1a385" + "optional_values" + ] }, { + "slug": "pascals-triangle", + "uuid": "a96ab45d-10a0-42cf-a754-c2466037ceaf", "core": true, + "unlocked_by": null, "difficulty": 5, - "slug": "pascals-triangle", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "mathematics", "strings", - "text-formatting" - ], - "uuid": "a96ab45d-10a0-42cf-a754-c2466037ceaf" + "text_formatting" + ] }, { + "slug": "secret-handshake", + "uuid": "0a3a452c-f734-47eb-8e65-34c8ae710ef0", "core": true, + "unlocked_by": null, "difficulty": 6, - "slug": "secret-handshake", "topics": [ "algorithms", "arrays", - "bitwise-operations", - "control-flow-(conditionals)", - "control-flow-(loops)", + "bitwise_operations", + "control_flow_conditionals", + "control_flow_loops", "games" - ], - "uuid": "0a3a452c-f734-47eb-8e65-34c8ae710ef0" + ] }, { + "slug": "rotational-cipher", + "uuid": "7078b1a4-ef73-4c02-809d-b2de62e9af11", "core": false, + "unlocked_by": "secret-handshake", "difficulty": 6, - "slug": "rotational-cipher", "topics": [ "cryptography", "integers", "strings" - ], - "unlocked_by": "secret-handshake", - "uuid": "7078b1a4-ef73-4c02-809d-b2de62e9af11" + ] }, { + "slug": "grade-school", + "uuid": "029bc3ed-772d-439b-bd0a-1ba1196a79ec", "core": true, + "unlocked_by": null, "difficulty": 6, - "slug": "grade-school", "topics": [ "arrays", "maps", "sorting" - ], - "uuid": "029bc3ed-772d-439b-bd0a-1ba1196a79ec" + ] }, { + "slug": "robot-name", + "uuid": "3005340b-a8d6-46ac-9075-125f9adccc2a", "core": true, + "unlocked_by": null, "difficulty": 6, - "slug": "robot-name", "topics": [ - "control-flow-(conditionals)", - "exception-handling", + "control_flow_conditionals", + "exception_handling", "randomness", - "regular-expressions", + "regular_expressions", "sets" - ], - "uuid": "3005340b-a8d6-46ac-9075-125f9adccc2a" + ] }, { + "slug": "wordy", + "uuid": "bb54bf08-24ba-45e1-bdf7-08db161e5843", "core": true, + "unlocked_by": null, "difficulty": 7, - "slug": "wordy", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "parsing", - "pattern-recognition", - "regular-expressions", + "pattern_recognition", + "regular_expressions", "strings" - ], - "uuid": "bb54bf08-24ba-45e1-bdf7-08db161e5843" + ] }, { + "slug": "list-ops", + "uuid": "e70defe4-5944-4392-956c-63cb92e7fd9c", "core": true, + "unlocked_by": null, "difficulty": 8, - "slug": "list-ops", "topics": [ - "data-structures", + "data_structures", "lists", "recursion" - ], - "uuid": "e70defe4-5944-4392-956c-63cb92e7fd9c" + ] }, { + "slug": "rational-numbers", + "uuid": "2de5677e-5759-4a21-93c7-39a3d88242e8", "core": false, + "unlocked_by": "pascals-triangle", "difficulty": 5, - "slug": "rational-numbers", "topics": [ + "algorithms", "floating_point_numbers", - "mathematics", - "algorithms" - ], - "unlocked_by": "pascals-triangle", - "uuid": "2de5677e-5759-4a21-93c7-39a3d88242e8" + "mathematics" + ] }, { + "slug": "hamming", + "uuid": "3e1358c8-2bea-41f9-bc9e-8277f354a4e0", "core": false, + "unlocked_by": "rna-transcription", "difficulty": 2, - "slug": "hamming", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "equality", "strings" - ], - "unlocked_by": "rna-transcription", - "uuid": "3e1358c8-2bea-41f9-bc9e-8277f354a4e0" + ] }, { + "slug": "run-length-encoding", + "uuid": "d66c2b56-b465-4922-af35-ae78944c0aac", "core": false, + "unlocked_by": null, "difficulty": 2, - "slug": "run-length-encoding", "topics": [ - "control-flow-(conditionals)", - "exception-handling", + "control_flow_conditionals", + "exception_handling", "parsing", - "pattern-recognition", - "regular-expressions", + "pattern_recognition", + "regular_expressions", "strings", - "text-formatting" - ], - "unlocked_by": null, - "uuid": "d66c2b56-b465-4922-af35-ae78944c0aac" + "text_formatting" + ] }, { + "slug": "isogram", + "uuid": "35821375-5c94-4d4b-aa56-e3b079a45ca0", "core": false, + "unlocked_by": "pangram", "difficulty": 2, - "slug": "isogram", "topics": [ "filtering", "strings" - ], - "unlocked_by": "pangram", - "uuid": "35821375-5c94-4d4b-aa56-e3b079a45ca0" + ] }, { + "slug": "beer-song", + "uuid": "6f315fc3-095a-4387-aefb-cc5fee97110a", "core": false, + "unlocked_by": "bob", "difficulty": 5, - "slug": "beer-song", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "strings" - ], - "unlocked_by": "bob", - "uuid": "6f315fc3-095a-4387-aefb-cc5fee97110a" + ] }, { + "slug": "phone-number", + "uuid": "347f9f54-a0d9-469d-babf-b3edb34d9d70", "core": false, + "unlocked_by": "pangram", "difficulty": 3, - "slug": "phone-number", "topics": [ "parsing", "transforming" - ], - "unlocked_by": "pangram", - "uuid": "347f9f54-a0d9-469d-babf-b3edb34d9d70" + ] }, { + "slug": "anagram", + "uuid": "432ec2ce-c919-4142-aea2-389b67503252", "core": false, + "unlocked_by": "pangram", "difficulty": 1, - "slug": "anagram", "topics": [ "filtering", "strings" - ], - "unlocked_by": "pangram", - "uuid": "432ec2ce-c919-4142-aea2-389b67503252" + ] }, { + "slug": "food-chain", + "uuid": "a717745f-da00-4a5f-8bf3-6876e20cdf17", "core": false, + "unlocked_by": "bob", "difficulty": 4, - "slug": "food-chain", "topics": [ "algorithms", - "text-formatting" - ], - "unlocked_by": "bob", - "uuid": "a717745f-da00-4a5f-8bf3-6876e20cdf17" + "text_formatting" + ] }, { + "slug": "etl", + "uuid": "a2a19f61-62ba-447a-8f57-537c8baa2e7a", "core": false, + "unlocked_by": "rna-transcription", "difficulty": 2, - "slug": "etl", "topics": [ - "control-flow-(loops)", + "control_flow_loops", "integers", "maps", "transforming" - ], - "unlocked_by": "rna-transcription", - "uuid": "a2a19f61-62ba-447a-8f57-537c8baa2e7a" + ] }, { + "slug": "sublist", + "uuid": "4a83a72c-db0a-45b6-b77c-1949cb24fbae", "core": false, + "unlocked_by": "linked-list", "difficulty": 4, - "slug": "sublist", "topics": [ "arrays", "lists" - ], - "unlocked_by": "linked-list", - "uuid": "4a83a72c-db0a-45b6-b77c-1949cb24fbae" + ] }, { + "slug": "grains", + "uuid": "c5be6908-f45c-4278-ba99-3701024f4eda", "core": false, + "unlocked_by": "space-age", "difficulty": 5, - "slug": "grains", "topics": [ - "control-flow-(loops)", + "control_flow_loops", "integers", "mathematics" - ], - "unlocked_by": "space-age", - "uuid": "c5be6908-f45c-4278-ba99-3701024f4eda" + ] }, { + "slug": "triangle", + "uuid": "fde792fa-84e9-4b86-8ecb-8466ad92a99d", "core": false, + "unlocked_by": "leap", "difficulty": 3, - "slug": "triangle", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics" - ], - "unlocked_by": "leap", - "uuid": "fde792fa-84e9-4b86-8ecb-8466ad92a99d" + ] }, { + "slug": "clock", + "uuid": "1ff85150-6c51-4758-af02-4484cf35658e", "core": false, + "unlocked_by": "gigasecond", "difficulty": 5, - "slug": "clock", "topics": [ "dates", "globalization", "time" - ], - "unlocked_by": "gigasecond", - "uuid": "1ff85150-6c51-4758-af02-4484cf35658e" + ] }, { + "slug": "perfect-numbers", + "uuid": "51aa5429-b2db-43ad-83cf-84e2ead22cb6", "core": false, + "unlocked_by": "space-age", "difficulty": 3, - "slug": "perfect-numbers", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics" - ], - "unlocked_by": "space-age", - "uuid": "51aa5429-b2db-43ad-83cf-84e2ead22cb6" + ] }, { + "slug": "word-count", + "uuid": "9a4ea3da-ad43-4850-bdf3-2c578c5de838", "core": false, + "unlocked_by": "pangram", "difficulty": 1, - "slug": "word-count", "topics": [ - "control-flow-(loops)", + "control_flow_loops", "lists", - "regular-expressions", + "regular_expressions", "strings", "unicode" - ], - "unlocked_by": "pangram", - "uuid": "9a4ea3da-ad43-4850-bdf3-2c578c5de838" + ] }, { + "slug": "acronym", + "uuid": "0c1c4788-0372-42e7-81c1-b090bb7ebc8b", "core": false, + "unlocked_by": "pangram", "difficulty": 2, - "slug": "acronym", "topics": [ - "control-flow-(loops)", - "regular-expressions", + "control_flow_loops", + "regular_expressions", "strings", "transforming" - ], - "unlocked_by": "pangram", - "uuid": "0c1c4788-0372-42e7-81c1-b090bb7ebc8b" + ] }, { + "slug": "scrabble-score", + "uuid": "a6bd8126-3879-4593-8380-39ebfa87801b", "core": false, + "unlocked_by": "rna-transcription", "difficulty": 5, - "slug": "scrabble-score", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "maps", "strings" - ], - "unlocked_by": "rna-transcription", - "uuid": "a6bd8126-3879-4593-8380-39ebfa87801b" + ] }, { + "slug": "roman-numerals", + "uuid": "4226e3c6-99d4-406d-998a-bcf11845b211", "core": false, + "unlocked_by": null, "difficulty": 3, - "slug": "roman-numerals", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "mathematics", - "pattern-recognition", + "pattern_recognition", "transforming" - ], - "unlocked_by": null, - "uuid": "4226e3c6-99d4-406d-998a-bcf11845b211" + ] }, { + "slug": "circular-buffer", + "uuid": "f1943e87-182a-44f5-a885-3d68a0c0a0dc", "core": false, + "unlocked_by": "linked-list", "difficulty": 8, - "slug": "circular-buffer", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "data-structures", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "data_structures", + "exception_handling", "lists" - ], - "unlocked_by": "linked-list", - "uuid": "f1943e87-182a-44f5-a885-3d68a0c0a0dc" + ] }, { + "slug": "raindrops", + "uuid": "86b1acf1-9e2d-4b04-b8b0-e9ae6beb5f3d", "core": false, + "unlocked_by": "rna-transcription", "difficulty": 2, - "slug": "raindrops", "topics": [ - "control-flow-(conditionals)", + "control_flow_conditionals", "integers", "strings", "transforming" - ], - "unlocked_by": "rna-transcription", - "uuid": "86b1acf1-9e2d-4b04-b8b0-e9ae6beb5f3d" + ] }, { + "slug": "allergies", + "uuid": "23210e9e-81f6-4279-a776-00459c7ccd02", "core": false, + "unlocked_by": "rna-transcription", "difficulty": 6, - "slug": "allergies", "topics": [ "arrays", - "bitwise-operations", - "control-flow-(conditionals)", - "control-flow-(loops)" - ], - "unlocked_by": "rna-transcription", - "uuid": "23210e9e-81f6-4279-a776-00459c7ccd02" + "bitwise_operations", + "control_flow_conditionals", + "control_flow_loops" + ] }, { + "slug": "strain", + "uuid": "e61f3d54-55d2-4d32-9d2a-e7d6af3a3247", "core": false, + "unlocked_by": "list-ops", "difficulty": 4, - "slug": "strain", "topics": [ "algorithms", "arrays", "callbacks", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "filtering", "lists" - ], - "unlocked_by": "list-ops", - "uuid": "e61f3d54-55d2-4d32-9d2a-e7d6af3a3247" + ] }, { + "slug": "atbash-cipher", + "uuid": "99974454-0736-4cc0-b88f-ed5701397a97", "core": false, + "unlocked_by": "simple-cipher", "difficulty": 7, - "slug": "atbash-cipher", "topics": [ "algorithms", "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "regular-expressions", - "text-formatting" - ], - "unlocked_by": "simple-cipher", - "uuid": "99974454-0736-4cc0-b88f-ed5701397a97" + "control_flow_conditionals", + "control_flow_loops", + "regular_expressions", + "text_formatting" + ] }, { + "slug": "accumulate", + "uuid": "dc9b2598-9757-4b20-82f9-8049ad081ac9", "core": false, + "unlocked_by": "list-ops", "difficulty": 5, - "slug": "accumulate", "topics": [ "algorithms", "callbacks", - "control-flow-(loops)", + "control_flow_loops", "lists" - ], - "unlocked_by": "list-ops", - "uuid": "dc9b2598-9757-4b20-82f9-8049ad081ac9" + ] }, { + "slug": "crypto-square", + "uuid": "a98e3593-d5b4-4c2b-8569-ae3ae7e07dad", "core": false, + "unlocked_by": "simple-cipher", "difficulty": 9, - "slug": "crypto-square", "topics": [ "algorithms", "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "regular-expressions", + "control_flow_conditionals", + "control_flow_loops", + "regular_expressions", "sorting", - "text-formatting", + "text_formatting", "transforming" - ], - "unlocked_by": "atbash-cipher", - "uuid": "a98e3593-d5b4-4c2b-8569-ae3ae7e07dad" + ] }, { + "slug": "trinary", + "uuid": "f317721d-e1f5-4e68-9fdc-f9bc7b6b004d", "core": false, + "unlocked_by": "binary", "difficulty": 4, - "slug": "trinary", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics", - "regular-expressions", + "regular_expressions", "strings" - ], - "unlocked_by": "binary", - "uuid": "f317721d-e1f5-4e68-9fdc-f9bc7b6b004d" + ] }, { + "slug": "sieve", + "uuid": "4cad8ee8-40be-4d4d-8c14-45d8c6e29a32", "core": false, + "unlocked_by": "prime-factors", "difficulty": 5, - "slug": "sieve", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics", "recursion" - ], - "unlocked_by": "prime-factors", - "uuid": "4cad8ee8-40be-4d4d-8c14-45d8c6e29a32" + ] }, { + "slug": "octal", + "uuid": "9892d47d-97a0-4a2f-8284-6f84c86559e8", "core": false, + "unlocked_by": "binary", "difficulty": 4, - "slug": "octal", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics", - "regular-expressions", + "regular_expressions", "strings" - ], - "unlocked_by": "binary", - "uuid": "9892d47d-97a0-4a2f-8284-6f84c86559e8" + ] }, { + "slug": "luhn", + "uuid": "bb46e832-8c37-45ee-9ee7-5037015b965c", "core": false, + "unlocked_by": "space-age", "difficulty": 4, - "slug": "luhn", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics", "strings" - ], - "unlocked_by": "space-age", - "uuid": "bb46e832-8c37-45ee-9ee7-5037015b965c" + ] }, { + "slug": "pig-latin", + "uuid": "9a515ad0-34c7-4191-8784-5c4cd6385b38", "core": false, + "unlocked_by": "bob", "difficulty": 4, - "slug": "pig-latin", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "games", - "regular-expressions", + "regular_expressions", "strings", "transforming" - ], - "unlocked_by": "bob", - "uuid": "9a515ad0-34c7-4191-8784-5c4cd6385b38" + ] }, { + "slug": "pythagorean-triplet", + "uuid": "26a973dd-d72e-40fb-abeb-0ba306356ed6", "core": false, + "unlocked_by": "space-age", "difficulty": 5, - "slug": "pythagorean-triplet", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics" - ], - "unlocked_by": "space-age", - "uuid": "26a973dd-d72e-40fb-abeb-0ba306356ed6" + ] }, { + "slug": "series", + "uuid": "06afdb06-8d2a-4cb0-baf1-48ae997cf1f5", "core": false, + "unlocked_by": "pangram", "difficulty": 3, - "slug": "series", "topics": [ - "control-flow-(loops)", - "exception-handling", + "control_flow_loops", + "exception_handling", "strings", - "text-formatting" - ], - "unlocked_by": "pangram", - "uuid": "06afdb06-8d2a-4cb0-baf1-48ae997cf1f5" + "text_formatting" + ] }, { + "slug": "difference-of-squares", + "uuid": "07110dd5-b879-40b9-9485-685cb0963d8f", "core": false, + "unlocked_by": "space-age", "difficulty": 3, - "slug": "difference-of-squares", "topics": [ "algorithms", - "control-flow-(loops)", + "control_flow_loops", "integers", "mathematics" - ], - "unlocked_by": "space-age", - "uuid": "07110dd5-b879-40b9-9485-685cb0963d8f" + ] }, { + "slug": "proverb", + "uuid": "8786d591-077b-49bc-be8d-d014dc9dc308", "core": false, + "unlocked_by": "bob", "difficulty": 4, - "slug": "proverb", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "optional-values", + "control_flow_conditionals", + "control_flow_loops", + "optional_values", "strings", - "text-formatting" - ], - "unlocked_by": "bob", - "uuid": "8786d591-077b-49bc-be8d-d014dc9dc308" + "text_formatting" + ] }, { + "slug": "flatten-array", + "uuid": "32a0a5fa-c7de-470c-beff-118b448b3916", "core": false, + "unlocked_by": "list-ops", "difficulty": 1, - "slug": "flatten-array", "topics": [ "arrays", "recursion" - ], - "unlocked_by": "list-ops", - "uuid": "32a0a5fa-c7de-470c-beff-118b448b3916" + ] }, { + "slug": "hexadecimal", + "uuid": "33b8f4c0-3210-478a-9225-5c30ad6df870", "core": false, + "unlocked_by": "binary", "difficulty": 4, - "slug": "hexadecimal", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "mathematics", - "regular-expressions", + "regular_expressions", "strings" - ], - "unlocked_by": "binary", - "uuid": "33b8f4c0-3210-478a-9225-5c30ad6df870" + ] }, { + "slug": "largest-series-product", + "uuid": "44bd02a7-0e3a-4441-ab76-524e36d4661c", "core": false, + "unlocked_by": "pangram", "difficulty": 7, - "slug": "largest-series-product", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics", - "regular-expressions", + "regular_expressions", "strings" - ], - "unlocked_by": "pangram", - "uuid": "44bd02a7-0e3a-4441-ab76-524e36d4661c" + ] }, { + "slug": "kindergarten-garden", + "uuid": "2702ac90-0be2-43a2-91b6-7256a25fec87", "core": false, + "unlocked_by": "wordy", "difficulty": 7, - "slug": "kindergarten-garden", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "strings", - "text-formatting" - ], - "unlocked_by": "wordy", - "uuid": "2702ac90-0be2-43a2-91b6-7256a25fec87" + "text_formatting" + ] }, { + "slug": "binary-search", + "uuid": "5991c379-f033-4b46-9702-6b7fd03640e8", "core": false, + "unlocked_by": "linked-list", "difficulty": 7, - "slug": "binary-search", "topics": [ "algorithms", "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "recursion" - ], - "unlocked_by": "linked-list", - "uuid": "5991c379-f033-4b46-9702-6b7fd03640e8" + ] }, { + "slug": "binary-search-tree", + "uuid": "865806e0-950f-49a5-a6e5-26472b90ab85", "core": false, + "unlocked_by": "linked-list", "difficulty": 6, - "slug": "binary-search-tree", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "recursion" - ], - "unlocked_by": "binary-search", - "uuid": "865806e0-950f-49a5-a6e5-26472b90ab85" + ] }, { + "slug": "robot-simulator", + "uuid": "00002977-ea1e-45e2-b66e-09d793b5c1ad", "core": false, + "unlocked_by": "wordy", "difficulty": 5, - "slug": "robot-simulator", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "games", "parsing", "strings" - ], - "unlocked_by": "wordy", - "uuid": "00002977-ea1e-45e2-b66e-09d793b5c1ad" + ] }, { + "slug": "nth-prime", + "uuid": "8fa51380-ec2c-4806-8833-cf543579de17", "core": false, + "unlocked_by": "prime-factors", "difficulty": 5, - "slug": "nth-prime", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics" - ], - "unlocked_by": "prime-factors", - "uuid": "8fa51380-ec2c-4806-8833-cf543579de17" + ] }, { + "slug": "palindrome-products", + "uuid": "fde83f66-d927-48f8-a599-efb98927f0b1", "core": false, + "unlocked_by": "prime-factors", "difficulty": 7, - "slug": "palindrome-products", "topics": [ "algorithms", - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics" - ], - "unlocked_by": "prime-factors", - "uuid": "fde83f66-d927-48f8-a599-efb98927f0b1" + ] }, { + "slug": "say", + "uuid": "01d286f6-5f29-4d4b-a4de-e217a4833bfa", "core": false, + "unlocked_by": "bob", "difficulty": 6, - "slug": "say", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics", "strings", - "text-formatting" - ], - "unlocked_by": "bob", - "uuid": "01d286f6-5f29-4d4b-a4de-e217a4833bfa" + "text_formatting" + ] }, { + "slug": "custom-set", + "uuid": "d4ec15c4-2742-493b-97fe-9d5121f0b659", "core": false, + "unlocked_by": "linked-list", "difficulty": 6, - "slug": "custom-set", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "data-structures", + "control_flow_conditionals", + "control_flow_loops", + "data_structures", "equality", "lists", "recursion", "sets" - ], - "unlocked_by": "linked-list", - "uuid": "d4ec15c4-2742-493b-97fe-9d5121f0b659" + ] }, { + "slug": "sum-of-multiples", + "uuid": "f30463c4-9d8c-4238-a691-e594291b4425", "core": false, + "unlocked_by": "prime-factors", "difficulty": 5, - "slug": "sum-of-multiples", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "integers", "lists" - ], - "unlocked_by": "prime-factors", - "uuid": "f30463c4-9d8c-4238-a691-e594291b4425" + ] }, { + "slug": "queen-attack", + "uuid": "fefcfeba-59ec-4c63-a562-374201ee39a7", "core": false, + "unlocked_by": null, "difficulty": 8, - "slug": "queen-attack", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "equality", - "exception-handling", - "optional-values", + "exception_handling", + "optional_values", "parsing", - "text-formatting" - ], - "unlocked_by": null, - "uuid": "fefcfeba-59ec-4c63-a562-374201ee39a7" + "text_formatting" + ] }, { + "slug": "saddle-points", + "uuid": "98cbae4f-78b6-4745-b922-39e8db9a12bb", "core": false, + "unlocked_by": "matrix", "difficulty": 6, - "slug": "saddle-points", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "equality", - "exception-handling", + "exception_handling", "integers", "mathematics", "matrices", - "optional-values", + "optional_values", "parsing" - ], - "unlocked_by": "matrix", - "uuid": "98cbae4f-78b6-4745-b922-39e8db9a12bb" + ] }, { + "slug": "ocr-numbers", + "uuid": "759618b1-7ccc-46cd-889d-aea58ec88756", "core": false, + "unlocked_by": "matrix", "difficulty": 5, - "slug": "ocr-numbers", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "equality", - "exception-handling", + "exception_handling", "integers", "parsing", - "text-formatting" - ], - "unlocked_by": "matrix", - "uuid": "759618b1-7ccc-46cd-889d-aea58ec88756" + "text_formatting" + ] }, { + "slug": "meetup", + "uuid": "86b1b6ba-c1fe-492d-a7ec-c22c525b4da8", "core": false, + "unlocked_by": "gigasecond", "difficulty": 7, - "slug": "meetup", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", + "control_flow_conditionals", + "control_flow_loops", "dates", "equality", - "exception-handling", + "exception_handling", "time" - ], - "unlocked_by": "gigasecond", - "uuid": "86b1b6ba-c1fe-492d-a7ec-c22c525b4da8" + ] }, { + "slug": "bracket-push", + "uuid": "25099f87-5c3b-4a8a-b648-4639d1e9fa84", "core": false, + "unlocked_by": "pangram", "difficulty": 3, - "slug": "bracket-push", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "parsing", "strings" - ], - "unlocked_by": "pangram", - "uuid": "25099f87-5c3b-4a8a-b648-4639d1e9fa84" + ] }, { + "slug": "two-bucket", + "uuid": "4c857b17-33b0-47fa-b981-6b2fe4e394a1", "core": false, + "unlocked_by": "grade-school", "difficulty": 6, - "slug": "two-bucket", "topics": [ "algorithms", "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "games", "parsing" - ], - "unlocked_by": "grade-school", - "uuid": "4c857b17-33b0-47fa-b981-6b2fe4e394a1" + ] }, { + "slug": "bowling", + "uuid": "c168fe1f-f84e-46e6-91fc-7553d048a4e9", "core": false, + "unlocked_by": "grade-school", "difficulty": 8, - "slug": "bowling", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "games", "parsing", - "text-formatting" - ], - "unlocked_by": "grade-school", - "uuid": "c168fe1f-f84e-46e6-91fc-7553d048a4e9" + "text_formatting" + ] }, { + "slug": "diamond", + "uuid": "04a4ef78-5b61-454f-8c37-798875fb4956", "core": false, + "unlocked_by": "pascals-triangle", "difficulty": 5, - "slug": "diamond", "topics": [ "arrays", - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "games", "parsing", - "text-formatting" - ], - "unlocked_by": "pascals-triangle", - "uuid": "04a4ef78-5b61-454f-8c37-798875fb4956" + "text_formatting" + ] }, { + "slug": "all-your-base", + "uuid": "cdfcec62-f2f3-4408-ad2c-8b5e1e56e791", "core": false, + "unlocked_by": "binary", "difficulty": 5, - "slug": "all-your-base", "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "exception-handling", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling", "integers", "mathematics", "parsing" - ], - "unlocked_by": "binary", - "uuid": "cdfcec62-f2f3-4408-ad2c-8b5e1e56e791" + ] }, { + "slug": "minesweeper", + "uuid": "22fa5ab4-935b-44cc-b055-9803214ae5f3", "core": false, + "unlocked_by": null, "difficulty": 7, - "slug": "minesweeper", "topics": [ "algorithms", "arrays", "games" - ], - "unlocked_by": null, - "uuid": "22fa5ab4-935b-44cc-b055-9803214ae5f3" + ] }, { + "slug": "alphametics", + "uuid": "42a7fd83-4508-403c-8b5e-f0a3126fac8a", "core": false, + "unlocked_by": "grade-school", "difficulty": 7, - "slug": "alphametics", "topics": [ "algorithms", "games" - ], - "unlocked_by": "grade-school", - "uuid": "42a7fd83-4508-403c-8b5e-f0a3126fac8a" + ] }, { + "slug": "simple-linked-list", + "uuid": "c21ab6e8-b845-49d0-a2f6-1c89c7a07626", "core": false, + "unlocked_by": "linked-list", "difficulty": 8, - "slug": "simple-linked-list", "topics": [ "arrays", - "data-structures", + "data_structures", "lists" - ], - "unlocked_by": "linked-list", - "uuid": "c21ab6e8-b845-49d0-a2f6-1c89c7a07626" + ] }, { - "uuid": "833bd7c7-d3d8-45fd-a218-12dea646065d", "slug": "diffie-hellman", + "uuid": "833bd7c7-d3d8-45fd-a218-12dea646065d", "core": false, "unlocked_by": "simple-cipher", "difficulty": 3, "topics": [ - "Control-flow (conditionals)", - "Control-flow (loops)", - "Algorithms", - "Arrays", - "Exception handling" + "algorithms", + "arrays", + "control_flow_conditionals", + "control_flow_loops", + "exception_handling" ] }, { - "core" : false, - "difficulty" : 8, - "slug" : "change", - "topics": [ - "Algorithms", - "Mathematics", - "Performance", - "Searching" - ], + "slug": "change", + "uuid": "910fe904-7e3c-11e7-bb31-be2e44b06b34", + "core": false, "unlocked_by": "prime-factors", - "uuid" : "910fe904-7e3c-11e7-bb31-be2e44b06b34" + "difficulty": 8, + "topics": [ + "algorithms", + "mathematics", + "performance", + "searching" + ] }, { - "uuid": "3b779cb8-9544-4e0d-a306-e5478d741be7", "slug": "connect", + "uuid": "3b779cb8-9544-4e0d-a306-e5478d741be7", "core": false, "unlocked_by": "grade-school", "difficulty": 7, "topics": [ - "Control-flow (loops)", - "Control-flow (conditionals)", - "Games", - "Parsing", - "Arrays", - "Maps" + "arrays", + "control_flow_conditionals", + "control_flow_loops", + "games", + "maps", + "parsing" ] }, { - "core" : false, - "difficulty" : 1, - "slug" : "collatz-conjecture", - "topics": [ - "Control-flow (loops)", - "Control-flow (conditionals)", - "Recursion", - "Integers", - "Algorithms", - "Mathematics" - ], - "unlocked_by": "null", - "uuid" : "fd435dad-311a-4c40-9868-70863455831e" + "slug": "collatz-conjecture", + "uuid": "fd435dad-311a-4c40-9868-70863455831e", + "core": false, + "unlocked_by": null, + "difficulty": 1, + "topics": [ + "algorithms", + "control_flow_conditionals", + "control_flow_loops", + "integers", + "mathematics", + "recursion" + ] }, { - "deprecated": true, "slug": "nucleotide-count", - "uuid": "1b53340d-ea40-44ee-bf2e-42e516704e7c" + "uuid": "1b53340d-ea40-44ee-bf2e-42e516704e7c", + "core": false, + "unlocked_by": null, + "difficulty": 0, + "topics": null, + "deprecated": true }, { - "deprecated": true, "slug": "point-mutations", - "uuid": "e9a6b2ea-a67d-4b75-800d-7b46240094ec" + "uuid": "e9a6b2ea-a67d-4b75-800d-7b46240094ec", + "core": false, + "unlocked_by": null, + "difficulty": 0, + "topics": null, + "deprecated": true }, { - "uuid": "09e10522-9853-11e7-abc4-cec278b6b50a", "slug": "twelve-days", + "uuid": "09e10522-9853-11e7-abc4-cec278b6b50a", "core": false, "unlocked_by": "bob", "difficulty": 4, "topics": [ - "Control-flow (conditionals)", - "Control-flow (loops)", - "Strings", - "Pattern recognition" + "control_flow_conditionals", + "control_flow_loops", + "pattern_recognition", + "strings" ] }, { + "slug": "transpose", + "uuid": "7c024853-0540-473d-b2d9-cad84953c00f", "core": false, + "unlocked_by": "matrix", "difficulty": 1, - "slug": "transpose", "topics": [ - "loops", "arrays", "lists", + "loops", "matrices", "strings", "text_formatting" - ], - "unlocked_by": "matrix", - "uuid": "7c024853-0540-473d-b2d9-cad84953c00f" + ] }, { - "uuid": "52c775a4-7ddb-4cba-8a78-8544220bd1b6", "slug": "protein-translation", + "uuid": "52c775a4-7ddb-4cba-8a78-8544220bd1b6", "core": false, "unlocked_by": null, "difficulty": 1, "topics": [ - "control-flow-(conditionals)", - "control-flow-(loops)", - "strings", - "algorithms" + "algorithms", + "control_flow_conditionals", + "control_flow_loops", + "strings" ] }, { - "uuid": "f4a3d66a-04a8-3e80-6c9a-8a573ccb26fd9ed1d5c", "slug": "zipper", + "uuid": "f4a3d66a-04a8-3e80-6c9a-8a573ccb26fd9ed1d5c", "core": false, "unlocked_by": null, "difficulty": 8, @@ -1197,8 +1226,8 @@ ] }, { - "uuid": "8740af44-002c-4716-a759-a68ae4c68737", "slug": "isbn-verifier", + "uuid": "8740af44-002c-4716-a759-a68ae4c68737", "core": false, "unlocked_by": "bob", "difficulty": 4, @@ -1210,22 +1239,22 @@ ] }, { - "uuid": "b3dbc935-536e-4910-994d-4a519b511b6a", "slug": "forth", + "uuid": "b3dbc935-536e-4910-994d-4a519b511b6a", "core": false, - "unlocked_by": "saddle-points", + "unlocked_by": "matrix", "difficulty": 8, "topics": [ - "stacks", + "domain_specific_languages", "parsing", - "domain_specific_languages" + "stacks" ] }, { - "uuid": "f82e470d-0bcc-4eba-b9b0-8a0c50a6fd19", "slug": "variable-length-quantity", + "uuid": "f82e470d-0bcc-4eba-b9b0-8a0c50a6fd19", "core": false, - "unlocked_by": "two-bucket", + "unlocked_by": "grade-school", "difficulty": 5, "topics": [ "bitwise_operations", @@ -1233,19 +1262,27 @@ ] }, { - "uuid": "cb09212c-f2ae-4acf-9177-6c7f42594c1d", "slug": "rectangles", + "uuid": "cb09212c-f2ae-4acf-9177-6c7f42594c1d", "core": false, "unlocked_by": "grade-school", "difficulty": 6, "topics": [ "parsing", - "searching", - "pattern_recognition" + "pattern_recognition", + "searching" + ] + }, + { + "slug": "armstrong-numbers", + "uuid": "0e4b628c-870d-446b-a400-3cc72457f2bc", + "core": false, + "unlocked_by": null, + "difficulty": 2, + "topics": [ + "algorithms", + "mathematics" ] } - ], - "foregone": [], - "language": "JavaScript", - "test_pattern": ".*[.]spec[.]js$" + ] } diff --git a/config/maintainers.json b/config/maintainers.json index 59962c14..48b19c6a 100644 --- a/config/maintainers.json +++ b/config/maintainers.json @@ -1,85 +1,5 @@ { "docs_url": "https://github.com/exercism/docs/blob/master/maintaining-a-track/maintainer-configuration.md", "maintainers": [ - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "ireddick", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - }, - { - "alumnus": false, - "avatar_url": null, - "bio": "I'm a Web Developer with a passion for taking code that is hard to maintain and cleaning, refactoring, and bringing it back into a manageable state", - "github_username": "rchavarria", - "link_text": "Here is where I blog", - "link_url": "https://rchavarria.github.io/", - "name": "Rubén Chavarría", - "show_on_website": true - }, - { - "alumnus": false, - "avatar_url": null, - "bio": "Brazilian full-stack web developer. Mentor at Thinkful", - "github_username": "joelwallis", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": true - }, - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "drueck", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - }, - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "tejasbubane", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - }, - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "matthewmorgan", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - }, - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "mixolidia", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - }, - { - "alumnus": false, - "avatar_url": null, - "bio": null, - "github_username": "ZacharyRSmith", - "link_text": null, - "link_url": null, - "name": null, - "show_on_website": false - } ] } diff --git a/docs/LEARNING.md b/docs/LEARNING.md index 0e0322cb..462c8cb2 100644 --- a/docs/LEARNING.md +++ b/docs/LEARNING.md @@ -1,4 +1,4 @@ -* [Eloquent JavaScript: A Modern Introduction to Programming (2nd Ed.)](http://eloquentjavascript.net) +* [Eloquent JavaScript: A Modern Introduction to Programming](http://eloquentjavascript.net) * [JavaScript: The Good Parts](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742) * [Crockford on JavaScript](http://javascript.crockford.com/) * [idiomatic.js: Principles of Writing Consistent, Idiomatic JavaScript](https://github.com/rwaldron/idiomatic.js) diff --git a/exercises/armstrong-numbers/README.md b/exercises/armstrong-numbers/README.md new file mode 100644 index 00000000..f0714aa7 --- /dev/null +++ b/exercises/armstrong-numbers/README.md @@ -0,0 +1,46 @@ +# Armstrong Numbers + +An [Armstrong number](https://en.wikipedia.org/wiki/Narcissistic_number) is a number that is the sum of its own digits each raised to the power of the number of digits. + +For example: + +- 9 is an Armstrong number, because `9 = 9^1 = 9` +- 10 is *not* an Armstrong number, because `10 != 1^2 + 0^2 = 2` +- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153` +- 154 is *not* an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190` + +Write some code to determine whether a number is an Armstrong number. + +## Setup + +Go through the setup instructions for JavaScript to install the + necessary dependencies: + +http://exercism.io/languages/javascript/installation + +## Running the test suite + +The provided test suite uses [Jasmine](https://jasmine.github.io/). +You can install it by opening a terminal window and running the +following command: + +```sh +npm install -g jasmine +``` + +Run the test suite from the exercise directory with: + +```sh +jasmine armstrong-numbers.spec.js +``` + +In many test suites all but the first test have been marked "pending". +Once you get a test passing, activate the next one by changing `xit` to `it`. + +## Source + +Wikipedia [Narcissistic number](https://en.wikipedia.org/wiki/Narcissistic_number) + +## Submitting Incomplete Solutions + +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/exercises/armstrong-numbers/armstrong-numbers.spec.js b/exercises/armstrong-numbers/armstrong-numbers.spec.js new file mode 100644 index 00000000..9f250fac --- /dev/null +++ b/exercises/armstrong-numbers/armstrong-numbers.spec.js @@ -0,0 +1,43 @@ +var ArmstrongNumber = require('./armstrong-numbers'); + +describe('ArmstrongNumber', function () { + it('Single digit numbers are Armstrong numbers', function () { + var input = 5; + expect(ArmstrongNumber.validate(input)).toBe(true); + }); + + xit('There are no 2 digit Armstrong numbers', function () { + var input = 10; + expect(ArmstrongNumber.validate(input)).toBe(false); + }); + + xit('Three digit number that is an Armstrong number', function () { + var input = 153; + expect(ArmstrongNumber.validate(input)).toBe(true); + }); + + xit('Three digit number that is not an Armstrong number', function () { + var input = 100; + expect(ArmstrongNumber.validate(input)).toBe(false); + }); + + xit('Four digit number that is an Armstrong number', function () { + var input = 9474; + expect(ArmstrongNumber.validate(input)).toBe(true); + }); + + xit('Four digit number that is not an Armstrong number', function () { + var input = 9475; + expect(ArmstrongNumber.validate(input)).toBe(false); + }); + + xit('Seven digit number that is an Armstrong number', function () { + var input = 9926315; + expect(ArmstrongNumber.validate(input)).toBe(true); + }); + + xit('Seven digit number that is not an Armstrong number', function () { + var input = 9926314; + expect(ArmstrongNumber.validate(input)).toBe(false); + }); +}); diff --git a/exercises/armstrong-numbers/example.js b/exercises/armstrong-numbers/example.js new file mode 100644 index 00000000..c0652924 --- /dev/null +++ b/exercises/armstrong-numbers/example.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = { + validate: function (input) { + var digits = String(input).split(''); + var sum = digits.reduce(function (total, current) { + return total + Math.pow(current, digits.length); + }, 0); + return sum === input; + } +}; diff --git a/exercises/bob/bob.spec.js b/exercises/bob/bob.spec.js index d8555e65..fc017cd1 100644 --- a/exercises/bob/bob.spec.js +++ b/exercises/bob/bob.spec.js @@ -45,7 +45,7 @@ describe('Bob', function () { xit('forceful questions', function () { var result = bob.hey('WHAT THE HELL WERE YOU THINKING?'); - expect(result).toEqual('Whoa, chill out!'); + expect(result).toEqual("Calm down, I know what I'm doing!"); }); xit('shouting numbers', function () { diff --git a/exercises/bob/example.js b/exercises/bob/example.js index 7826975f..b7fa2913 100644 --- a/exercises/bob/example.js +++ b/exercises/bob/example.js @@ -18,6 +18,9 @@ function Bob() { if (isSilence(message)) { return 'Fine. Be that way!'; } else if (isShouting(message)) { + if (isAQuestion(message)) { + return "Calm down, I know what I'm doing!"; + } return 'Whoa, chill out!'; } else if (isAQuestion(message)) { return 'Sure.'; diff --git a/exercises/bowling/bowling.spec.js b/exercises/bowling/bowling.spec.js index a507da47..c78b2f9d 100644 --- a/exercises/bowling/bowling.spec.js +++ b/exercises/bowling/bowling.spec.js @@ -208,5 +208,21 @@ describe('Bowling', function () { expect(function () { bowling.score(); }).toThrow( new Error('Score cannot be taken until the end of the game')); }); + + xit('cannot roll after bonus roll for a spare', function () { + var rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 2]; + var bowling = new Bowling(); + previousRolls(bowling, rolls); + expect(function () { bowling.roll(2); }).toThrow( + new Error('Cannot roll after game is over')); + }); + + xit('cannot roll after bonus rolls for a strike', function () { + var rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 2]; + var bowling = new Bowling(); + previousRolls(bowling, rolls); + expect(function () { bowling.roll(2); }).toThrow( + new Error('Cannot roll after game is over')); + }); }); }); diff --git a/exercises/linked-list/example.js b/exercises/linked-list/example.js index 7c288bfa..672dff0c 100644 --- a/exercises/linked-list/example.js +++ b/exercises/linked-list/example.js @@ -10,7 +10,7 @@ function LinkedList() { this._front = null; } -LinkedList.prototype.push = function LinkedList_push(value) { +LinkedList.prototype.push = function (value) { if (this._front === null) { this._front = new Node(value); } else { @@ -21,18 +21,18 @@ LinkedList.prototype.push = function LinkedList_push(value) { } }; -LinkedList.prototype.unshift = function LinkedList_unshift(value) { +LinkedList.prototype.unshift = function (value) { this.push(value); this._front = this._front.prev; }; -LinkedList.prototype.pop = function LinkedList_pop() { - if (this._front === null) {return undefined;} +LinkedList.prototype.pop = function () { + if (this._front === null) {return null;} this._front = this._front.prev; return this.shift(); }; -LinkedList.prototype.shift = function LinkedList_shift() { +LinkedList.prototype.shift = function () { var value = this._front.value; var front = this._front.next; var back = this._front.prev; @@ -63,7 +63,7 @@ LinkedList.prototype.delete = function (match) { this._front.next = this._front.next.next; } else { this._front = this._front.next; - return this.delete(match); + this.delete(match); } }; diff --git a/exercises/minesweeper/example.js b/exercises/minesweeper/example.js index b5d76036..a366884e 100644 --- a/exercises/minesweeper/example.js +++ b/exercises/minesweeper/example.js @@ -21,25 +21,25 @@ Minesweeper.prototype.annotate = function (rows) { } var board = rows.map(function (row) { return row.split(''); }); var outBoard = []; - for (var x = 0; x < board.length; x++) { + board.forEach(function (memberX, x) { outBoard[x] = []; - for (var y = 0; y < board[x].length; y++) { - var spot = board[x][y]; + memberX.forEach(function (memberXY, y) { + var spot = memberXY; if (spot === '*') { outBoard[x][y] = spot; - continue; + } else { + var bombCount = this.distanceXdistanceYs.map(function (dxdy) { + if (typeof board[x + dxdy[0]] === 'undefined') { + return 0; + } + return board[x + dxdy[0]][y + dxdy[1]] === '*' ? 1 : 0; + }).reduce(function (total, num) { + return total + num; + }); + outBoard[x][y] = bombCount > 0 ? bombCount : ' '; } - var bombCount = this.distanceXdistanceYs.map(function (dxdy) { - if (board[x + dxdy[0]] === undefined) { - return 0; - } - return board[x + dxdy[0]][y + dxdy[1]] === '*' ? 1 : 0; - }).reduce(function (total, num) { - return total + num; - }); - outBoard[x][y] = bombCount > 0 ? bombCount : ' '; - } - } + }, this); + }, this); return outBoard.map(function (row) { return row.join(''); }); diff --git a/exercises/nth-prime/example.js b/exercises/nth-prime/example.js index f0d824dc..5deed40c 100644 --- a/exercises/nth-prime/example.js +++ b/exercises/nth-prime/example.js @@ -3,16 +3,21 @@ module.exports = { nth: function (nthPrime) { if (nthPrime === 0) { throw new Error('Prime is not possible'); } - this.generatePrimes(200000); + + // Using prime number theory to approximate the prime + // See https://en.wikipedia.org/wiki/Prime_number_theorem#Approximations_for_the_nth_prime_number + var upperBound = (nthPrime + 2) * Math.log((nthPrime + 2) * Math.log((nthPrime + 2))); + this.generatePrimes(upperBound); return this.realPrimes[nthPrime - 1]; }, generatePrimes: function (uptoNumber) { - var i, j, currentPrime, primeCount, possiblePrimes = []; - - if (this.realPrimes) { return this.realPrimes; } + var i; + var j; + var currentPrime; + var possiblePrimes = []; for (i = 2; i <= uptoNumber; i++) { - possiblePrimes.push({ number: i, prime: true}); + possiblePrimes.push({ number: i, prime: true }); } for (i = 2; i < Math.sqrt(possiblePrimes.length); i++) { @@ -24,8 +29,6 @@ module.exports = { } } - primeCount = 0; - this.realPrimes = []; for (i = 0; i < possiblePrimes.length; i++) { @@ -34,6 +37,7 @@ module.exports = { this.realPrimes.push(currentPrime.number); } } + return this.realPrimes; } }; diff --git a/exercises/nth-prime/nth-prime.spec.js b/exercises/nth-prime/nth-prime.spec.js index 727ce507..70a326d8 100644 --- a/exercises/nth-prime/nth-prime.spec.js +++ b/exercises/nth-prime/nth-prime.spec.js @@ -17,6 +17,14 @@ describe('Prime', function () { expect(prime.nth(10001)).toEqual(104743); }); + xit('massive prime', function () { + expect(prime.nth(20000)).toEqual(224737); + }); + + xit('extreme prime', function () { + expect(prime.nth(30000)).toEqual(350377); + }); + xit('weird case', function () { expect( function () { prime.nth(0); diff --git a/exercises/pangram/pangram.spec.js b/exercises/pangram/pangram.spec.js index 74197329..b2bae495 100644 --- a/exercises/pangram/pangram.spec.js +++ b/exercises/pangram/pangram.spec.js @@ -1,23 +1,28 @@ var Pangram = require('./pangram'); describe('Pangram()', function () { - it('empty sentence', function () { + it('sentence empty', function () { var pangram = new Pangram(''); expect(pangram.isPangram()).toBe(false); }); + xit('recognizes a perfect lower case pangram', function () { + var pangram = new Pangram('abcdefghijklmnopqrstuvwxyz'); + expect(pangram.isPangram()).toBe(true); + }); + xit('pangram with only lower case', function () { var pangram = new Pangram('the quick brown fox jumps over the lazy dog'); expect(pangram.isPangram()).toBe(true); }); - xit("missing character 'x'", function () { + xit("missing character 'x'", function () { var pangram = new Pangram('a quick movement of the enemy will jeopardize five gunboats'); expect(pangram.isPangram()).toBe(false); }); - xit("another missing character 'x'", function () { - var pangram = new Pangram('the quick brown fish jumps over the lazy dog'); + xit("another missing character, e.g. 'h'", function () { + var pangram = new Pangram('five boxing wizards jump quickly at it'); expect(pangram.isPangram()).toBe(false); }); @@ -27,22 +32,22 @@ describe('Pangram()', function () { }); xit('pangram with numbers', function () { - var pangram = new Pangram('the 1 quick brown fox jumps over the 2 lazy dogs'); + var pangram = new Pangram('the 1 quick brown fox jumps over the 2 lazy dog'); expect(pangram.isPangram()).toBe(true); }); - xit('missing letters replaced by numbers', function () { + xit('missing letters replaced by numbers', function () { var pangram = new Pangram('7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog'); expect(pangram.isPangram()).toBe(false); }); xit('pangram with mixed case and punctuation', function () { - var pangram = new Pangram('"Five quacking Zephyrs jolt my wax bed."'); + var pangram = new Pangram('\"Five quacking Zephyrs jolt my wax bed.\"'); expect(pangram.isPangram()).toBe(true); }); - xit('pangram with non-ascii characters', function () { - var pangram = new Pangram('Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'); - expect(pangram.isPangram()).toBe(true); + xit('upper and lower case versions of the same character should not be counted separately', function () { + var pangram = new Pangram('the quick brown fox jumps over with lazy FX'); + expect(pangram.isPangram()).toBe(false); }); }); diff --git a/exercises/queen-attack/example.js b/exercises/queen-attack/example.js index 50016f39..ebe07a5d 100644 --- a/exercises/queen-attack/example.js +++ b/exercises/queen-attack/example.js @@ -1,12 +1,11 @@ 'use strict'; -module.exports = function (options) { - if (options === undefined) { - options = { white: [0, 3], black: [7, 3] }; - } + +module.exports = function (passedInOptions) { + var options = passedInOptions || {white: [0, 3], black: [7, 3]}; if (options.white[0] === options.black[0] && options.white[1] === options.black[1]) { - throw 'Queens cannot share the same space'; + throw String('Queens cannot share the same space'); } this.white = options.white; @@ -61,3 +60,4 @@ module.exports = function (options) { return this.boardRepresentation(); }; }; + diff --git a/exercises/queen-attack/queen-attack.spec.js b/exercises/queen-attack/queen-attack.spec.js index e51205be..b2d4525f 100644 --- a/exercises/queen-attack/queen-attack.spec.js +++ b/exercises/queen-attack/queen-attack.spec.js @@ -18,6 +18,8 @@ describe('Queens', function () { try { var queens = new Queens(positioning); + expect(queens.white).toEqual([2, 4]); + expect(queens.black).toEqual([2, 4]); } catch (error) { expect(error).toEqual('Queens cannot share the same space'); } @@ -26,15 +28,15 @@ describe('Queens', function () { xit('toString representation', function () { var positioning = {white: [2, 4], black: [6, 6]}; var queens = new Queens(positioning); - var board = '_ _ _ _ _ _ _ _\n\ -_ _ _ _ _ _ _ _\n\ -_ _ _ _ W _ _ _\n\ -_ _ _ _ _ _ _ _\n\ -_ _ _ _ _ _ _ _\n\ -_ _ _ _ _ _ _ _\n\ -_ _ _ _ _ _ B _\n\ -_ _ _ _ _ _ _ _\n\ -'; + var board = '_ _ _ _ _ _ _ _\n' + +'_ _ _ _ _ _ _ _\n' + +'_ _ _ _ W _ _ _\n' + +'_ _ _ _ _ _ _ _\n' + +'_ _ _ _ _ _ _ _\n' + +'_ _ _ _ _ _ _ _\n' + +'_ _ _ _ _ _ B _\n' + +'_ _ _ _ _ _ _ _\n' +; expect(queens.toString()).toEqual(board); }); diff --git a/exercises/robot-simulator/example.js b/exercises/robot-simulator/example.js index 769134f5..96bb5c90 100644 --- a/exercises/robot-simulator/example.js +++ b/exercises/robot-simulator/example.js @@ -1,87 +1,85 @@ -var Robot = (function () { - 'use strict'; +'use strict'; - var VALID_DIRECTIONS = ['north', 'east', 'south', 'west']; - var INSTRUCTION_KEYS = { - A: 'advance', - L: 'turnLeft', - R: 'turnRight' - }; +var VALID_DIRECTIONS = ['north', 'east', 'south', 'west']; +var INSTRUCTION_KEYS = { + A: 'advance', + L: 'turnLeft', + R: 'turnRight' +}; - function Robot() { - this.coordinates = [0, 0]; - this.bearing = 'north'; - } - - Robot.prototype.at = function (x, y) { - this.coordinates = [x, y]; - }; +function Robot() { + this.coordinates = [0, 0]; + this.bearing = 'north'; +} - Robot.prototype.orient = function (direction) { - if (VALID_DIRECTIONS.indexOf(direction) === -1) { - throw new Error('Invalid Robot Bearing'); - } +Robot.prototype.at = function (x, y) { + this.coordinates = [x, y]; +}; - this.bearing = direction; - }; +Robot.prototype.orient = function (direction) { + if (VALID_DIRECTIONS.indexOf(direction) === -1) { + throw new Error('Invalid Robot Bearing'); + } - Robot.prototype.advance = function () { - switch (this.bearing) { - case 'north': - this.coordinates[1]++; - break; - case 'east': - this.coordinates[0]++; - break; - case 'south': - this.coordinates[1]--; - break; - case 'west': - this.coordinates[0]--; - break; - } - }; + this.bearing = direction; +}; - Robot.prototype.turnLeft = function () { - var directionPosition = VALID_DIRECTIONS.indexOf(this.bearing); +Robot.prototype.advance = function () { + switch (this.bearing) { + case 'north': + this.coordinates[1]++; + break; + case 'east': + this.coordinates[0]++; + break; + case 'south': + this.coordinates[1]--; + break; + case 'west': + this.coordinates[0]--; + break; + default: + break; + } +}; - if (directionPosition > 0) { - this.orient(VALID_DIRECTIONS[--directionPosition]); - } else { - this.orient(VALID_DIRECTIONS[VALID_DIRECTIONS.length - 1]); - } - }; +Robot.prototype.turnLeft = function () { + var directionPosition = VALID_DIRECTIONS.indexOf(this.bearing); - Robot.prototype.turnRight = function () { - var directionPosition = VALID_DIRECTIONS.indexOf(this.bearing); + if (directionPosition > 0) { + this.orient(VALID_DIRECTIONS[--directionPosition]); + } else { + this.orient(VALID_DIRECTIONS[VALID_DIRECTIONS.length - 1]); + } +}; - if (directionPosition < (VALID_DIRECTIONS.length - 1)) { - this.orient(VALID_DIRECTIONS[++directionPosition]); - } else { - this.orient(VALID_DIRECTIONS[0]); - } - }; +Robot.prototype.turnRight = function () { + var directionPosition = VALID_DIRECTIONS.indexOf(this.bearing); - Robot.prototype.instructions = function (instructionKeys) { - return instructionKeys.split('') - .map(function (key) { - return INSTRUCTION_KEYS[key]; - }); - }; + if (directionPosition < (VALID_DIRECTIONS.length - 1)) { + this.orient(VALID_DIRECTIONS[++directionPosition]); + } else { + this.orient(VALID_DIRECTIONS[0]); + } +}; - Robot.prototype.place = function (args) { - this.coordinates = [args.x, args.y]; - this.bearing = args.direction; - }; +Robot.prototype.instructions = function (instructionKeys) { + return instructionKeys.split('') + .map(function (key) { + return INSTRUCTION_KEYS[key]; + }); +}; - Robot.prototype.evaluate = function (instructionKeys) { - this.instructions(instructionKeys) - .forEach(function (instruction) { - this[instruction](); - }, this); - }; +Robot.prototype.place = function (args) { + this.coordinates = [args.x, args.y]; + this.bearing = args.direction; +}; - return Robot; -})(); +Robot.prototype.evaluate = function (instructionKeys) { + this.instructions(instructionKeys) + .forEach(function (instruction) { + this[instruction](); + }, this); +}; module.exports = Robot; diff --git a/exercises/saddle-points/example.js b/exercises/saddle-points/example.js index 81217e7c..ac1cde4f 100644 --- a/exercises/saddle-points/example.js +++ b/exercises/saddle-points/example.js @@ -1,78 +1,57 @@ 'use strict'; -function toInt(s) { - return parseInt(s, 10); -} - module.exports = function Matrix(matrix) { - this.rows = []; - this.columns = []; - - var rows = matrix.split('\n'); - var i, j, currentRow; - - for (i = 0; i < rows.length; i++) { - currentRow = rows[i].replace(/^\s+|\s+$/g, '').split(' ').map( toInt ); - this.rows.push(currentRow); - } - - for (i = 0; i < this.rows[0].length; i++) { - this.columns.push([]); - } + this.rows = matrix.split('\n').map(function (row) { + return row.split(' ').map(function (val) { return parseInt(val, 10); }); + }); - for (i = 0; i < this.rows.length; i++) { - for (j = 0; j < this.columns.length; j++) { - this.columns[j].push(this.rows[i][j]); - } - } + this.columns = this.rows[0].map(function () { + return []; + }).map(function (column, index) { + return this.rows.map(function (row) { return row[index]; }); + }, this); this.indexesOfMaxValues = function (array) { - var i, currentElement, maxValue, indexes = []; + var maxValue = array.reduce(function (acc, curr) { + return Math.max(acc, curr); + }); - for (i = 0; i < array.length; i++) { - currentElement = array[i]; - if (maxValue === undefined || currentElement > maxValue) { - maxValue = currentElement; - indexes = [i]; - } else if (currentElement === maxValue) { - indexes.push(i); - } - } - - return indexes; + return this.indexsOf(array, maxValue); }; this.indexesOfMinValues = function (array) { - var i, currentElement, minValue, indexes = []; + var minValue = array.reduce(function (acc, curr) { + return Math.min(acc, curr); + }); - for (i = 0; i < array.length; i++) { - currentElement = array[i]; - if (minValue === undefined || currentElement < minValue) { - minValue = currentElement; - indexes = [i]; - } else if (currentElement === minValue) { - indexes.push(i); - } - } + return this.indexsOf(array, minValue); + }; - return indexes; + this.indexsOf = function (array, value) { + return array.map(function (val, index) { + return val === value ? index : null; + }).filter(function (val) { + return val !== null; + }); }; this.calculateSaddlePoints = function (rows, columns) { - var i, j, maxIndexes, minIndexes, currentMaxIndex, saddlePoints = []; + var maxIndexes; + var minIndexes; + var saddlePoints = []; - for (i = 0; i < rows.length; i++) { - maxIndexes = this.indexesOfMaxValues(rows[i]); + rows.forEach(function (row, i) { + maxIndexes = this.indexesOfMaxValues(row); - for (j = 0; j < maxIndexes.length; j++) { - currentMaxIndex = maxIndexes[j]; + maxIndexes.forEach(function (currentMaxIndex) { minIndexes = this.indexesOfMinValues(columns[currentMaxIndex]); if (minIndexes.indexOf(i) >= 0) { saddlePoints.push([i, currentMaxIndex]); } - } - } + }, this); + }, this); + return saddlePoints; }; diff --git a/exercises/secret-handshake/example.js b/exercises/secret-handshake/example.js index 651a8d78..873ccc97 100644 --- a/exercises/secret-handshake/example.js +++ b/exercises/secret-handshake/example.js @@ -12,8 +12,7 @@ function SecretHandshake(handshake) { return this.shakeWith; }; - this.calculateHandshake = function (handshake) { - /* jshint bitwise:false */ + this.calculateHandshake = function () { var shakeWith = []; for (var i = 0; i < handshakeCommands.length; i++) { diff --git a/exercises/secret-handshake/secret-handshake.spec.js b/exercises/secret-handshake/secret-handshake.spec.js index 6c29444a..bf5fc41d 100644 --- a/exercises/secret-handshake/secret-handshake.spec.js +++ b/exercises/secret-handshake/secret-handshake.spec.js @@ -38,7 +38,8 @@ describe('Secret Handshake', function () { xit('text is an invalid secret handshake', function () { expect( function () { - var handshake = new SecretHandshake('piggies'); + /* eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/ + var ignoredHandshake = new SecretHandshake('piggies'); }).toThrow(new Error('Handshake must be a number')); }); }); diff --git a/exercises/simple-cipher/example.js b/exercises/simple-cipher/example.js index b8cc5151..6f0177fb 100644 --- a/exercises/simple-cipher/example.js +++ b/exercises/simple-cipher/example.js @@ -3,8 +3,8 @@ var ALPHABET = 'abcdefghijklmnopqrstuvwxyz'; function randomKey() { - var i, result = ''; - for ( i = 0; i < 100; i++ ) { + var result; + for ( var i = 0; i < 100; i++ ) { result += ALPHABET[randomUpTo(ALPHABET.length)]; } return result; @@ -17,15 +17,13 @@ function randomUpTo(n) { module.exports = function (userDefinedKey) { var key; - function addEncodedCharacter(character, index, array) { - /* jshint validthis:true */ + function addEncodedCharacter(character, index) { var i = ALPHABET.indexOf(character) + ALPHABET.indexOf(key[index % key.length]); if (i >= ALPHABET.length) { i -= ALPHABET.length; } this.push(ALPHABET[i]); } - function addDecodedCharacter(character, index, array) { - /* jshint validthis:true */ + function addDecodedCharacter(character, index) { var i = ALPHABET.indexOf(character) - ALPHABET.indexOf(key[index % key.length]); if (i < 0) { i += ALPHABET.length; } this.push(ALPHABET[i]); diff --git a/exercises/simple-cipher/simple-cipher.spec.js b/exercises/simple-cipher/simple-cipher.spec.js index f3fb2b39..c59c16cf 100644 --- a/exercises/simple-cipher/simple-cipher.spec.js +++ b/exercises/simple-cipher/simple-cipher.spec.js @@ -1,5 +1,15 @@ var Cipher = require('./simple-cipher'); +describe('Random key generation', function () { + xit('generates keys at random', function () { + // Strictly speaking, this is difficult to test with 100% certainty. + // But, if you have a generator that generates 100-character-long + // strings of lowercase letters at random, the odds of two consecutively + // generated keys being identical are astronomically low. + expect(new Cipher().key).not.toEqual(new Cipher().key); + }); +}); + describe('Random key cipher', function () { var cipher = new Cipher(); @@ -7,6 +17,10 @@ describe('Random key cipher', function () { expect(cipher.key).toMatch(/^[a-z]+$/); }); + xit('has a key that is at least 100 characters long', function () { + expect(cipher.key.length).toBeGreaterThanOrEqual(100); + }); + // Here we take advantage of the fact that plaintext of "aaa..." // outputs the key. This is a critical problem with shift ciphers, some // characters will always output the key verbatim. @@ -24,26 +38,30 @@ describe('Random key cipher', function () { }); }); +/* eslint-disable no-new */ + describe('Incorrect key cipher', function () { xit('throws an error with an all caps key', function () { - expect( function () { + expect(function () { new Cipher('ABCDEF'); }).toThrow(new Error('Bad key')); }); xit('throws an error with a numeric key', function () { - expect( function () { + expect(function () { new Cipher('12345'); }).toThrow(new Error('Bad key')); }); xit('throws an error with an empty key', function () { - expect( function () { + expect(function () { new Cipher(''); }).toThrow(new Error('Bad key')); }); }); +/* eslint-enable no-new */ + describe('Substitution cipher', function () { var key = 'abcdefghij'; var cipher = new Cipher(key); diff --git a/exercises/simple-linked-list/example.js b/exercises/simple-linked-list/example.js index 6e1f0d05..e8fca85f 100644 --- a/exercises/simple-linked-list/example.js +++ b/exercises/simple-linked-list/example.js @@ -3,11 +3,11 @@ function Element(value, next) { throw new Error('Element is a constructor.'); } - if (value === undefined) { + if (typeof value === 'undefined') { throw new Error('Value required.'); } - if (next !== undefined && !(next instanceof Element)) { + if (typeof next !== 'undefined' && !(next instanceof Element)) { throw new Error('A Element instance as next value is required.'); } @@ -18,7 +18,7 @@ function Element(value, next) { function List() {} List.prototype.push = function (value) { - if (value === undefined) { + if (typeof value === 'undefined') { throw new Error('Argument required.'); } @@ -40,7 +40,7 @@ List.prototype.push = function (value) { }; List.prototype.unshift = function (value) { - if (value === undefined) { + if (typeof value === 'undefined') { throw new Error('Argument required.'); } @@ -65,17 +65,20 @@ List.prototype.pop = function () { return; } - var penultEl, lastEl = this.head; + var penultEl; + var lastEl = this.head; while (lastEl.next) { penultEl = lastEl; lastEl = lastEl.next; } + /* eslint-disable no-undefined */ if (!penultEl) { this.head = undefined; } else { penultEl.next = undefined; } + /* eslint-enable no-undefined */ }; List.prototype.reverse = function () { @@ -83,7 +86,8 @@ List.prototype.reverse = function () { return; } - var current, previous; + var current; + var previous; while (this.head) { current = this.head; this.shift(); diff --git a/exercises/simple-linked-list/simple-linked-list.spec.js b/exercises/simple-linked-list/simple-linked-list.spec.js index 1254743b..75460d35 100644 --- a/exercises/simple-linked-list/simple-linked-list.spec.js +++ b/exercises/simple-linked-list/simple-linked-list.spec.js @@ -16,9 +16,11 @@ describe('simple-linked-list', function () { var el = new Element(1); expect(el).toBeDefined(); + /* eslint-disable new-cap */ expect(function () { - var el = Element(1); + el = Element(1); }).toThrow(); + /* eslint-enable new-cap */ }); xit('requires an argument', function () { @@ -26,7 +28,7 @@ describe('simple-linked-list', function () { expect(el).toBeDefined(); expect(function () { - var el = new Element(); + el = new Element(); }).toThrow(); }); @@ -47,9 +49,9 @@ describe('simple-linked-list', function () { expect(elTwo.next).toBe(elOne); }); + /* eslint-disable no-unused-vars */ xit('requires an instance of Element as next element', function () { expect(function () { - var el = new Element(1, true); var el = new Element(1, false); }).toThrow(); expect(function () { @@ -62,6 +64,7 @@ describe('simple-linked-list', function () { var el = new Element(1, {}); }).toThrow(); }); + /* eslint-enable no-unused-vars */ describe('List', function () { xit('is a constructor', function () { diff --git a/package-lock.json b/package-lock.json index c3c1fed5..94eab4b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -728,12 +728,6 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", @@ -1091,20 +1085,19 @@ } }, "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.1.0.tgz", + "integrity": "sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo=", "dev": true, "requires": { - "exit": "0.1.2", "glob": "7.1.2", - "jasmine-core": "2.8.0" + "jasmine-core": "3.1.0" } }, "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.1.0.tgz", + "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=", "dev": true }, "js-tokens": { diff --git a/package.json b/package.json index 8ab06dbf..001c8229 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "eslint-plugin-import": "^2.8.0", "eslint-plugin-jasmine": "^2.9.1", "eslint-plugin-react": "^7.3.0", - "jasmine": "^2.8.0" + "jasmine": "^3.1.0" }, "scripts": { "lint": "eslint .",