diff --git a/challenges/advanced-bonfires.json b/challenges/advanced-bonfires.json
index db81a04400..8ff025e2fe 100644
--- a/challenges/advanced-bonfires.json
+++ b/challenges/advanced-bonfires.json
@@ -1,6 +1,7 @@
{
"name": "Advanced Algorithm Scripting",
"order": 15,
+ "time": "50h",
"challenges": [
{
"id": "aff0395860f5d3034dc0bfc9",
@@ -39,7 +40,9 @@
"assert(telephoneCheck(\"27576227382\") === false, 'message: telephoneCheck(\"27576227382\")
should return false.');",
"assert(telephoneCheck(\"(275)76227382\") === false, 'message: telephoneCheck(\"(275)76227382\")
should return false.');",
"assert(telephoneCheck(\"2(757)6227382\") === false, 'message: telephoneCheck(\"2(757)6227382\")
should return false.');",
- "assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: telephoneCheck(\"2(757)622-7382\")
should return false.');"
+ "assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: telephoneCheck(\"2(757)622-7382\")
should return false.');",
+ "assert(telephoneCheck(\"555)-555-5555\") === false, 'message: telephoneCheck(\"555)555-5555\")
should return false.');",
+ "assert(telephoneCheck(\"(555-555-5555\") === false, 'message: telephoneCheck(\"(555-555-5555\")
should return false.');"
],
"challengeSeed": [
"function telephoneCheck(str) {",
@@ -142,6 +145,7 @@
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"QUARTER\", 0.50]], 'message: drawer(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])
should return [[\"QUARTER\", 0.50]]
.');",
"assert.deepEqual(drawer(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]], 'message: drawer(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])
should return [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]]
.');",
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Insufficient Funds\".');",
+ "assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Insufficient Funds\".');",
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Closed\", 'message: drawer(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Closed\".');"
],
"MDNlinks": [
diff --git a/challenges/angularjs.json b/challenges/angularjs.json
index 92c85e751b..905c120f33 100644
--- a/challenges/angularjs.json
+++ b/challenges/angularjs.json
@@ -1,6 +1,7 @@
{
"name": "AngularJS",
"order": 16,
+ "time": "5h",
"challenges": [
{
"id": "bd7154d8c441eddfaeb5bdef",
diff --git a/challenges/automated-testing-and-debugging.json b/challenges/automated-testing-and-debugging.json
index b5ab25c2f9..0c7304045b 100644
--- a/challenges/automated-testing-and-debugging.json
+++ b/challenges/automated-testing-and-debugging.json
@@ -1,6 +1,7 @@
{
"name": "Automated Testing and Debugging",
"order": 14,
+ "time": "15m",
"challenges": [
{
"id":"cf1111c1c16feddfaeb6bdef",
diff --git a/challenges/basejumps.json b/challenges/basejumps.json
index c0dc0a0ba3..627e95482f 100644
--- a/challenges/basejumps.json
+++ b/challenges/basejumps.json
@@ -1,6 +1,7 @@
{
"name": "Full Stack JavaScript Projects",
"order": 20,
+ "time": "300h",
"challenges": [
{
"id": "bd7158d8c443eddfaeb5bcef",
@@ -52,7 +53,7 @@
"Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the control + c
hotkey to shut down these processes.",
"Run the following command in a Cloud9 terminal prompt tab: npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login
. At this point, the terminal will prompt you to log in to Heroku from the command line.",
"Now run yo angular-fullstack:heroku
. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.",
- "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:create mongolab
.",
+ "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:add mongolab
.",
"As you build your app, you should frequently commit changes to your codebase. Make sure you're in the ~/workspace
directory by running cd ~/workspace
. Then you can use this code to stage the changes to your changes and commit them: git commit -am \"your commit message\"
. Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".",
"You can push these new commits to GitHub by running git push origin master
, and to Heroku by running grunt --force && grunt buildcontrol:heroku
.",
"If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: https://github.com/clnhll/guidetobasejumps.",
diff --git a/challenges/basic-bonfires.json b/challenges/basic-bonfires.json
index 12da55a771..e2e2fa0e3f 100644
--- a/challenges/basic-bonfires.json
+++ b/challenges/basic-bonfires.json
@@ -1,6 +1,7 @@
{
"name": "Basic Algorithm Scripting",
- "order": 7,
+ "order": 8,
+ "time": "50h",
"challenges": [
{
"id": "ad7123c8c441eddfaeb5bdef",
@@ -60,7 +61,7 @@
" return str;",
"}",
"",
- "reverseString(\"hello\", \"\");"
+ "reverseString(\"hello\");"
],
"MDNlinks": [
"Global String Object",
@@ -103,7 +104,7 @@
" return num;",
"}",
"",
- "factorialize(5, '');"
+ "factorialize(5);"
],
"MDNlinks": [
"Arithmetic Operators"
@@ -142,7 +143,7 @@
"assert(palindrome(\"almostomla\") === false, 'message: palindrome(\"almostomla\")
should return false.');",
"assert(palindrome(\"My age is 0, 0 si ega ym.\") === true, 'message: palindrome(\"My age is 0, 0 si ega ym.\")
should return true.');",
"assert(palindrome(\"1 eye for of 1 eye.\") === false, 'message: palindrome(\"1 eye for of 1 eye.\")
should return false.');",
- "assert(palindrome(\"0_0 (: /-\\ :) 0-0\") === true, 'message: palindrome(\"0_0 (: /-\\\\ :) 0-0\")
should return true.');"
+ "assert(palindrome(\"0_0 (: /-\\ :) 0-0\") === true, 'message: palindrome(\"0_0 (: /-\\ :) 0-0\")
should return true.');"
],
"challengeSeed": [
"function palindrome(str) {",
@@ -224,7 +225,7 @@
" return str;",
"}",
"",
- "titleCase(\"I'm a little tea pot\", \"\");"
+ "titleCase(\"I'm a little tea pot\");"
],
"tests": [
"assert(typeof(titleCase(\"I'm a little tea pot\")) === \"string\", 'message: titleCase()
should return a string.');",
@@ -300,13 +301,14 @@
" return str;",
"}",
"",
- "end(\"Bastian\", \"n\", \"\");"
+ "end(\"Bastian\", \"n\");"
],
"tests": [
"assert(end(\"Bastian\", \"n\") === true, 'message: end(\"Bastian\", \"n\")
should return true.');",
"assert(end(\"Connor\", \"n\") === false, 'message: end(\"Connor\", \"n\")
should return false.');",
"assert(end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\") === false, 'message: end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\")
should return false.');",
"assert(end(\"He has to give me a new name\", \"name\") === true, 'message: end(\"He has to give me a new name\", \"name\")
should return true.');",
+ "assert(end(\"He has to give me a new name\", \"me\") === true, 'message: end(\"He has to give me a new name\", \"me\")
should return true.');",
"assert(end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\") === false, 'message: end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\")
should return false.');"
],
"MDNlinks": [
@@ -338,7 +340,7 @@
" return str;",
"}",
"",
- "repeat(\"abc\", 3, \"\");"
+ "repeat(\"abc\", 3);"
],
"tests": [
"assert(repeat(\"*\", 3) === \"***\", 'message: repeat(\"*\", 3)
should return \"***\"
.');",
@@ -367,6 +369,7 @@
"description": [
"Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a \"...\" ending.",
"Note that the three dots at the end add to the string length.",
+ "If the length of the string is less than or equal to 3 characters, then the length of the three dots is not added to the string length.",
"Remember to use Read-Search-Ask if you get stuck. Write your own code."
],
"challengeSeed": [
@@ -375,13 +378,14 @@
" return str;",
"}",
"",
- "truncate(\"A-tisket a-tasket A green and yellow basket\", 11, \"\");"
+ "truncate(\"A-tisket a-tasket A green and yellow basket\", 11);"
],
"tests": [
"assert(truncate(\"A-tisket a-tasket A green and yellow basket\", 11) === \"A-tisket...\", 'message: truncate(\"A-tisket a-tasket A green and yellow basket\", 11)
should return \"A-tisket...\".');",
"assert(truncate(\"Peter Piper picked a peck of pickled peppers\", 14) === \"Peter Piper...\", 'message: truncate(\"Peter Piper picked a peck of pickled peppers\", 14)
should return \"Peter Piper...\".');",
"assert(truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length) === \"A-tisket a-tasket A green and yellow basket\", 'message: truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length)
should return \"A-tisket a-tasket A green and yellow basket\".');",
- "assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2) === 'A-tisket a-tasket A green and yellow basket', 'message: truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length + 2)
should return \"A-tisket a-tasket A green and yellow basket\".');"
+ "assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2) === 'A-tisket a-tasket A green and yellow basket', 'message: truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length + 2)
should return \"A-tisket a-tasket A green and yellow basket\".');",
+ "assert(truncate(\"A-\", 1) === \"A...\", 'message: truncate(\"A-\", 1)
should return \"A...\".');"
],
"MDNlinks": [
"String.slice()"
@@ -412,7 +416,7 @@
" return arr;",
"}",
"",
- "chunk([\"a\", \"b\", \"c\", \"d\"], 2, \"\");"
+ "chunk([\"a\", \"b\", \"c\", \"d\"], 2);"
],
"tests": [
"assert.deepEqual(chunk([\"a\", \"b\", \"c\", \"d\"], 2), [[\"a\", \"b\"], [\"c\", \"d\"]], 'message: chunk([\"a\", \"b\", \"c\", \"d\"], 2)
should return [[\"a\", \"b\"], [\"c\", \"d\"]]
.');",
@@ -450,12 +454,13 @@
" return arr;",
"}",
"",
- "slasher([1, 2, 3], 2, \"\");"
+ "slasher([1, 2, 3], 2);"
],
"tests": [
- "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: slasher([1, 2, 3], 2, [3])
should return [3]
.');",
+ "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: slasher([1, 2, 3], 2)
should return [3]
.');",
"assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'message: slasher([1, 2, 3], 0)
should return [1, 2, 3]
.');",
- "assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: slasher([1, 2, 3], 9)
should return []
.');"
+ "assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: slasher([1, 2, 3], 9)
should return []
.');",
+ "assert.deepEqual(slasher([1, 2, 3], 4), [], 'message: slasher([1, 2, 3], 4)
should return []
.');"
],
"MDNlinks": [
"Array.slice()",
@@ -489,7 +494,7 @@
" return arr;",
"}",
"",
- "mutation([\"hello\", \"hey\"], \"\");"
+ "mutation([\"hello\", \"hey\"]);"
],
"tests": [
"assert(mutation([\"hello\", \"hey\"]) === false, 'message: mutation([\"hello\", \"hey\"])
should return false.');",
@@ -531,7 +536,7 @@
" return arr;",
"}",
"",
- "bouncer([7, \"ate\", \"\", false, 9], \"\");"
+ "bouncer([7, \"ate\", \"\", false, 9]);"
],
"tests": [
"assert.deepEqual(bouncer([7, \"ate\", \"\", false, 9]), [7, \"ate\", 9], 'message: bouncer([7, \"ate\", \"\", false, 9])
should return [7, \"ate\", 9]
.');",
@@ -568,7 +573,7 @@
" return arr;",
"}",
"",
- "destroyer([1, 2, 3, 1, 2, 3], 2, 3, \"\");"
+ "destroyer([1, 2, 3, 1, 2, 3], 2, 3);"
],
"tests": [
"assert.deepEqual(destroyer([1, 2, 3, 1, 2, 3], 2, 3), [1, 1], 'message: destroyer([1, 2, 3, 1, 2, 3], 2, 3)
should return [1, 1]
.');",
@@ -608,7 +613,7 @@
" return num;",
"}",
"",
- "where([40, 60], 50, \"\");"
+ "where([40, 60], 50);"
],
"MDNlinks": [
"Array.sort()"
diff --git a/challenges/basic-javascript.json b/challenges/basic-javascript.json
index 82a0430852..97b37c6fab 100644
--- a/challenges/basic-javascript.json
+++ b/challenges/basic-javascript.json
@@ -1,6 +1,7 @@
{
"name": "Basic JavaScript",
- "order": 5,
+ "order": 6,
+ "time": "3h",
"challenges": [
{
"id":"bd7123c9c441eddfaeb4bdef",
@@ -177,9 +178,9 @@
"id": "bd7123c9c450eddfaeb5bdef",
"title": "Use Bracket Notation to Find the Nth Character in a String",
"description": [
- "You can also use bracket Notation
to get the character at other positions within a string.",
+ "You can also use bracket notation
to get the character at other positions within a string.",
"Remember that computers start counting at 0, so the first character is actually the zeroth character.",
- "Let's try to set thirdLetterOfLastName
to equal the third letter
of the lastName
variable.",
+ "Let's try to set thirdLetterOfLastName
to equal the third letter
of the lastName
variable.",
"Try looking at the secondLetterOfFirstName
variable declaration if you get stuck."
],
"tests": [
@@ -529,7 +530,7 @@
],
"tests": [
"assert((function(d){if(d[0] == 'John' && d[1] == 23 && d[2] == undefined){return true;}else{return false;}})(myArray), 'message: myArray
should only contain [\"John\", 23]
.');",
- "assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removed), 'message: removed
should only contain [\"cat\"], 2
.');"
+ "assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removed), 'message: removed
should only contain [\"cat\", 2]
.');"
],
"challengeSeed": [
"// var numbers = [1,2,3];",
@@ -802,7 +803,7 @@
"assert.deepEqual(myArray, [0,1,2,3,4], 'message: myArray
should equal [0,1,2,3,4].');"
],
"challengeSeed":[
- "ourArray = [];",
+ "var ourArray = [];",
"for(var i = 0; i < 5; i++){",
" ourArray.push(i);",
"}",
@@ -933,13 +934,13 @@
"assert(myFunction() >= min, 'message: The random number generated by myFunction
should be greater than or equal to the minimum number.');",
"assert(myFunction() <= max, 'message: The random number generated by myFunction
should be less than or equal to the maximum number.');",
"assert(myFunction() % 1 === 0 , 'message: The random number generated by myFunction
should be an integer, not a decimal.');",
- "assert((function(){if(editor.getValue().match(/max/g).length >= 2 && editor.getValue().match(/min/g).length >= 2 && editor.getValue().match(/Math.floor/g) && editor.getValue().match(/Math.random/g)){return true;}else{return false;}})(), 'message: You should be using the function given in the description to calculate the random in number in a range.');"
+ "assert((function(){if(editor.getValue().match(/max/g).length >= 3 && editor.getValue().match(/min/g).length >= 4 && editor.getValue().match(/Math.floor/g) && editor.getValue().match(/Math.random/g)){return true;}else{return false;}})(), 'message: You should be using the function given in the description to calculate the random in number in a range.');"
],
"challengeSeed":[
- "var min = 0;",
+ "var min = 1;",
"var max = 9;",
"function myFunction() {",
- " // Make myFunction return a random number between zero and nine instead of a decimal",
+ " // Make myFunction return a random number between min and max values instead of a decimal",
" // Only change code below this line.",
"",
" return Math.random();",
@@ -1059,13 +1060,14 @@
},
{
"id":"cf1111c1c12feddfaeb8bdef",
- "title": "Find White Space with Regular Expressions",
+ "title": "Find Whitespace with Regular Expressions",
"difficulty":"9.986",
"description":[
- "We can also use selectors like \\s
to find spaces in a string.",
+ "We can also use selectors like \\s
to find whitespace in a string.",
+ "The whitespace characters are \" \"
(space), \\r
(carriage return), \\n
(newline), \\t
(tab), and \\f
(form feed).",
"It is used like this:",
"/\\s+/g
",
- "Select all the spaces in the sentence string."
+ "Select all the whitespace characters in the sentence string."
],
"tests":[
"assert(test === 7, 'message: Your RegEx should have found seven spaces in the testString
.');",
@@ -1127,10 +1129,10 @@
"Math.floor(Math.random() * (3 - 1 + 1)) + 1;
"
],
"tests":[
- "assert(typeof(runSlots($(\".slot\"))[0]) === \"number\", 'message: slotOne
should be a random number.')",
- "assert(typeof(runSlots($(\".slot\"))[1]) === \"number\", 'message: slotTwo
should be a random number.')",
- "assert(typeof(runSlots($(\".slot\"))[2]) === \"number\", 'message: slotThree
should be a random number.')",
- "assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi) !== null){return editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi).length >= 3;}else{return false;}})(), 'message: You should have used Math.floor(Math.random() * (3 - 1 + 1)) + 1;
three times to generate your random numbers.')"
+ "assert(typeof(runSlots($(\".slot\"))[0]) === \"number\", 'slotOne
should be a random number.')",
+ "assert(typeof(runSlots($(\".slot\"))[1]) === \"number\", 'slotTwo
should be a random number.')",
+ "assert(typeof(runSlots($(\".slot\"))[2]) === \"number\", 'slotThree
should be a random number.')",
+ "assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi) !== null){return editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi).length >= 3;}else{return false;}})(), 'You should have used Math.floor(Math.random() * (3 - 1 + 1)) + 1;
three times to generate your random numbers.')"
],
"challengeSeed":[
"fccss",
diff --git a/challenges/basic-ziplines.json b/challenges/basic-ziplines.json
index cf2ac272f6..15043e6220 100644
--- a/challenges/basic-ziplines.json
+++ b/challenges/basic-ziplines.json
@@ -1,50 +1,53 @@
{
"name": "Basic Front End Development Projects",
- "order": 8,
+ "order": 9,
+ "time": "100h",
"challenges": [
{
"id": "bd7158d8c442eddfbeb5bd1f",
"title": "Get Set for Ziplines",
- "difficulty": 1.00,
- "challengeSeed": ["125658022"],
+ "challengeSeed": [],
"description": [
- "Now you're ready to start our Zipline challenges. These front-end development challenges will give you many opportunities to apply the HTML, CSS, jQuery and JavaScript you've learned to build static (database-less) applications.",
- "Whatever you do, don't get discouraged! Remember to use Read-Search-Ask if you get stuck.",
- "We'll build these challenges using CodePen, a popular tool for creating, sharing, and discovering static web applications.",
- "Go to http://codepen.io and create an account.",
- "Click your user image in the top right corner, then click the \"New pen\" button that drops down.",
- "Drag the windows around and press the buttons in the lower-right hand corner to change the orientation to suit your preference.",
- "Click the gear next to CSS. Then under the \"Add External CSS\" section, use the \"Quick-add\" select box to select Bootstrap. Then click \"Save & Close\".",
- "Verify that bootstrap is active by adding the following code to your HTML: <h1 class='text-primary'>Hello CodePen!</h1>
. The text's color should be Bootstrap blue.",
- "Click the gear next to JavaScript. Click the \"Quick-add\" select box and choose jQuery (not jQuery UI).",
- "Click the \"Quick-add\" select box again and choose Bootstrap. Then click \"Save & Close\".",
- "Now add the following code to your JavaScript: $(document).ready(function() { $('.text-primary').text('Hi CodePen!') });
. Click the \"Save\" button at the top. Your \"Hello CodePen!\" should change to \"Hi CodePen!\". This means that jQuery is working.",
- "You can use this CodePen that you've just created as a starting point for your Ziplines. Just click the \"fork\" button at the top of your CodePen and it will create a duplicate CodePen.",
- "Now you're ready for your first Zipline. Click the \"I've completed this challenge\" button."
+ [
+ "http://i.imgur.com/6WLULsC.gif",
+ "A gif showing how to create a Codepen account.",
+ "For our front end Zipline challenges, we'll use a popular browser-based code editor called CodePen. Open CodePen and click \"Sign up\" in the upper right hand corner, then scroll down to the free plan and click \"Sign up\" again. Click the \"Use info from GitHub button\", then add your email address and create a password. Click the \"Sign up\" button. Then in the upper right hand corner, click \"New pen\".",
+ "http://codepen.io"
+ ],
+ [
+ "http://i.imgur.com/U4y9RJ1.gif",
+ "A gif showing that you can type \"hello world\" will output \"hello world\" in the preview window. You can also drag windows to resize them, and change their orientation.",
+ "In the HTML box, create an h1 element with the text \"Hello World\". You can drag the frames around to resize them. You can also click the \"Change View\" button and change the orientation of the frames.",
+ ""
+ ],
+ [
+ "http://i.imgur.com/G9KFQDL.gif",
+ "A gif showing the process of adding Bootstrap to your pen.",
+ "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Bootstrap. Now give your h1 element the class of \"text-primary\" to change its color and prove that Bootstrap is now available.",
+ ""
+ ],
+ [
+ "http://i.imgur.com/Gi3aig0.gif",
+ "A gif showing the process of adding Animate.css and jQuery to pen.",
+ "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Animate.css. Click the gear in the upper left hand corner of the JS box, then scroll down to \"Quick add\" and choose jQuery. Let's prove that Animate.css and jQuery are loaded properly. In the JS box, add the following code to make your h1 element bounce: $(document).ready(function(){ $(\"h1\").addClass(\"animated bounce\"); });
.",
+ ""
+ ],
+ [
+ "http://i.imgur.com/Wzt6Y9Y.gif",
+ "A gif showing the process of saving and forking a pen.",
+ "Save your pen with the \"Save\" button. Then click the \"Fork\" button. This will create a fork (copy) of your pen that you can experiment with.",
+ ""
+ ]
],
- "type": "waypoint",
- "challengeType": 2,
+ "type": "Waypoint",
+ "challengeType": 7,
"tests": [],
"nameCn": "",
"descriptionCn": [],
"nameFr": "",
"descriptionFr": [],
- "nameRu": "Приготовьтесь к Zipline'ам",
- "descriptionRu": [
- "Теперь вы готовы приступить к Zipline'ам. Это задания по фронт-энд разработке, в них вы примените ранее изученные HTML, CSS, jQuery и JavaScript и создадите статические (не использующие базу данных) приложения.",
- "Ни в коем случае не унывайте! Воспользуйтесь Read-Search-Ask, если что-то не получается.",
- "Задания мы будем выполнять используя CodePen - популярный инструмент для создания и обмена статическими веб приложениями.",
- "Перейдите по ссылке http://codepen.io и создайте аккаунт.",
- "Нажмите на ваш аватар в правом верхнем углу, а затем в открывшемся меню на кнопку \"New pen\".",
- "Выберите удобное расположение окон с помощью кнопок в правом нижнем углу, отрегулируйте их ширину.",
- "Нажмите на звездочку рядом с CSS. Затем в секции \"Add External CSS\" выберите \"Quick-add\" и добавьте Bootstrap. Нажмите \"Save & Close\".",
- "Проверьте, что Bootstrap подключен добавив следующий HTML код: <h1 class='text-primary'>Hello CodePen!</h1>
. Цвет текста должен быть синим.",
- "Нажмите на звездочку рядом с JavaScript. Нажмите \"Quick-add\" и выберите jQuery (не jQuery UI). Нажмите \"Save & Close\".",
- "Снова нажмите на поле \"Quick-add\", выберите Bootstrap и затем нажмите \"Save & Close\".",
- "Теперь добавьте следующий код в окошко JavaScript: $(document).ready(function() { $('.text-primary').text('Hi CodePen!') });
. Нажмите на кнопку \"Save\" расположенную наверху. Текст \"Hello CodePen!\" должен измениться на \"Hi CodePen!\". Это значит что jQuery работает.",
- "CodePen, который мы создали, можно использовать в качестве отправной точки для ваших Zipline'ов. Кликните кнопку \"fork\", чтобы создать копию текущего CodePen'a.",
- "Все готово для первого Zipline'а. Жмите кнопку \"I've completed this challenge\"."
- ],
+ "nameRu": "",
+ "descriptionRu": [],
"nameEs": "",
"descriptionEs": [],
"namePt": "",
@@ -53,7 +56,6 @@
{
"id": "bd7158d8c242eddfaeb5bd13",
"title": "Build a Personal Portfolio Webpage",
- "difficulty": 1.01,
"challengeSeed": ["133315782"],
"description": [
"Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/ThiagoFerreir4/full/eNMxEp.",
@@ -107,7 +109,6 @@
{
"id": "bd7158d8c442eddfaeb5bd13",
"title": "Build a Random Quote Machine",
- "difficulty": 1.02,
"challengeSeed": ["126415122"],
"description": [
"Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/AdventureBear/full/vEoVMw.",
@@ -117,7 +118,6 @@
"Here are the user stories you must enable, and optional bonus user stories:",
"User Story: As a user, I can click a button to show me a new random quote.",
"Bonus User Story: As a user, I can press a button to tweet out a quote.",
- "Note that you can either put your quotes into an array and show them at random, or use an API to get quotes, such as http://forismatic.com/en/api/.",
"Remember to use Read-Search-Ask if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project.
Click here then add your link to your tweet's text"
@@ -203,7 +203,7 @@
"Here are the user stories you must enable, and optional bonus user stories:",
"User Story: As a user, I can add, subtract, multiply and divide two numbers.",
"Bonus User Story: I can clear the input field with a clear button.",
- "Bonus User Story: I can keep chaining mathematical operations together until I hit the clear button, and the calculator will tell me the correct output.",
+ "Bonus User Story: I can keep chaining mathematical operations together until I hit the equal button, and the calculator will tell me the correct output.",
"Remember to use Read-Search-Ask if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project.
Click here then add your link to your tweet's text"
diff --git a/challenges/bootstrap.json b/challenges/bootstrap.json
index 3982fe18d5..e9b43babb3 100644
--- a/challenges/bootstrap.json
+++ b/challenges/bootstrap.json
@@ -1,6 +1,7 @@
{
"name": "Responsive Design with Bootstrap",
"order": 3,
+ "time": "2h",
"challenges": [
{
"id": "bad87fee1348bd9acde08712",
@@ -13,8 +14,9 @@
"To get started, we should nest all of our HTML in a div
element with the class container-fluid
."
],
"tests": [
- "assert($(\"div\").hasClass(\"container-fluid\"), 'Your div
element should have the class container-fluid
')",
- "assert(editor.match(/<\\/div>/g) && editor.match(/
div
element should have the class container-fluid
.')",
+ "assert(editor.match(/<\\/div>/g) && editor.match(/.container-fluid
.')"
],
"challengeSeed": [
"",
@@ -89,7 +91,7 @@
"id": "bad87fee1348bd9acde08812",
"title": "Make Images Mobile Responsive",
"description": [
- "First, add a new image below the existing one. Set it's src
attribute to http://bit.ly/fcc-running-cats
.",
+ "First, add a new image below the existing one. Set its src
attribute to http://bit.ly/fcc-running-cats
.",
"It would be great if this image could be exactly the width of our phone's screen.",
"Fortunately, with Bootstrap, all we need to do is add the img-responsive
class to your image. Do this, and the image should perfectly fit the width of your page."
],
@@ -2110,7 +2112,7 @@
"tests": [
"assert(editor.match(//g) && editor.match(/-->/g).length > 0, 'Be sure to close your comment with -->
.')"
+ "assert(editor.match(/-->.*\\n+.+/g), 'Be sure to close your comment with -->
.')"
],
"challengeSeed": [
"h2
element.')",
"assert($(\"style\") && $(\"style\").length > 1, 'Create a style
element.')",
"assert($(\"h2\").css(\"color\") === \"rgb(0, 0, 255)\", 'Your h2
element should be blue.')",
+ "assert(editor.match(/h2\\s*\\{\\s*color:\\s*blue;\\s*\\}/g), 'Ensure that your stylesheet h2
declaration is valid with a semicolon and closing brace')",
"assert(editor.match(/<\\/style>/g) && editor.match(/<\\/style>/g).length === (editor.match(/",
"",
"Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
", @@ -1411,7 +1415,7 @@ "assert($(\"ul\").length > 0, 'Create aul
element.')",
"assert($(\"ul li\").length > 2, 'You should have three li
elements within your ul
element.')",
"assert(editor.match(/<\\/ul>/g) && editor.match(/li
element has a closing tag.')"
+ "assert(editor.match(/<\\/li>/g) && editor.match(/li
elements have closing tags.')"
],
"challengeSeed": [
"",
@@ -3702,7 +3706,7 @@
"Let's replace the hex code in our body
element's background color with the RGB value for black: rgb(0, 0, 0)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Give your body
element the background-color
of black.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Your body
element should have a black background.')",
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of black. For example body { color: rgb(0, 0, 0); }
.')"
],
"challengeSeed": [
@@ -3736,7 +3740,7 @@
"Change the body
element's background color from the RGB value for black to the rgb
value for white: rgb(255, 255, 255)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Give your body
element the background-color
of white.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Your body
should have a white background.')",
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*255\\s*,\\s*255\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of white. For example body { background-color: rgb(255, 255 , 255); }
.')"
],
"challengeSeed": [
@@ -3770,7 +3774,7 @@
"Change the body
element's background color to the RGB value red: rgb(255, 0, 0)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Give your body
element the background-color
of red.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Your body
should have a red background.')",
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of red. For example body { background-color: rgb(255, 0, 0); }
.')"
],
"challengeSeed": [
@@ -3802,7 +3806,7 @@
"Now change the body
element's background color to the rgb
value green: rgb(0, 255, 0)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Give your body
element the background-color
of green.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Your body
element should have a green background.')",
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*255\\s*,\\s*0\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of green. For example body { background-color: rgb(0, 255, 0); }
.')"
],
"challengeSeed": [
@@ -3834,7 +3838,7 @@
"Change the body
element's background color to the RGB value blue: rgb(0, 0, 255)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Give your body
element the background-color of blue.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Your body
element should have a blue background.')",
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*255\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of blue. For example body { background-color: rgb(0, 0, 255); }
.')"
],
"challengeSeed": [
@@ -3867,7 +3871,7 @@
"Change the body
element's background color to the RGB value orange: rgb(255, 165, 0)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Give your body
element the background-color of orange.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Your body
element should have an orange background.')",
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*165\\s*,\\s*0\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of orange. For example body { background-color: rgb(255, 165, 0); }
.')"
],
"challengeSeed": [
@@ -3900,7 +3904,7 @@
"Change the body
element's background color to the RGB value for gray: rgb(128, 128, 128)
"
],
"tests": [
- "assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Give your body
element the background-color of gray.')",
+ "assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Your body
element should have a gray background.')",
"assert(editor.match(/rgb\\s*\\(\\s*128\\s*,\\s*128\\s*,\\s*128\\s*\\)/ig), 'Use rgb
to give your body
element the background-color
of gray. For example body { background-color: rgb(128, 128, 128); }
.')"
],
"challengeSeed": [
diff --git a/challenges/intermediate-bonfires.json b/challenges/intermediate-bonfires.json
index cc15964181..ea05dd355f 100644
--- a/challenges/intermediate-bonfires.json
+++ b/challenges/intermediate-bonfires.json
@@ -1,6 +1,7 @@
{
"name": "Intermediate Algorithm Scripting",
- "order": 9,
+ "order": 10,
+ "time": "50h",
"challenges": [
{
"id": "a3566b1109230028080c9345",
@@ -65,7 +66,8 @@
"assert.deepEqual(diff([\"andesite\", \"grass\", \"dirt\", \"dead shrub\"], [\"andesite\", \"grass\", \"dirt\", \"dead shrub\"]), [], 'message: [\"andesite\", \"grass\", \"dirt\", \"dead shrub\"], [\"andesite\", \"grass\", \"dirt\", \"dead shrub\"]
should return []
.');",
"assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'message: [1, 2, 3, 5], [1, 2, 3, 4, 5]
should return [4]
.');",
"assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]), [\"piglet\", 4], 'message: [1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]
should return [\"piglet\", 4]
.');",
- "assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: [], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]
should return [\"snuffleupagus\", \"cookie monster\", \"elmo\"]
.');"
+ "assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: [], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]
should return [\"snuffleupagus\", \"cookie monster\", \"elmo\"]
.');",
+ "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [7, \"filly\"]), [1, \"calf\", 3, \"piglet\", 7, \"filly\"], 'message: [1, \"calf\", 3, \"piglet\"], [7, \"filly\"]
should return [1, \"calf\", 3, \"piglet\", 7, \"filly\"]
.');"
],
"MDNlinks": [
"Comparison Operators",
@@ -355,7 +357,7 @@
"assert.strictEqual(boo([].slice), false, 'message: boo([].slice)
should return false.');",
"assert.strictEqual(boo({ \"a\": 1 }), false, 'message: boo({ \"a\": 1 })
should return false.');",
"assert.strictEqual(boo(1), false, 'message: boo(1)
should return false.');",
- "assert.strictEqual(boo(NaN), false, 'message: boo(NaN)
should return true.');",
+ "assert.strictEqual(boo(NaN), false, 'message: boo(NaN)
should return false.');",
"assert.strictEqual(boo(\"a\"), false, 'message: boo(\"a\")
should return false.');"
],
"MDNlinks": [
@@ -511,7 +513,7 @@
"sumFibs(4);"
],
"tests": [
- "assert(typeof(sumFibs(1)) === \"number\", 'message: sumFibs()
should return a number.');",
+ "assert(typeof(sumFibs(1)) === \"number\", 'message: sumFibs(1)
should return a number.');",
"assert.deepEqual(sumFibs(1000), 1785, 'message: sumFibs(1000)
should return 1785.');",
"assert.deepEqual(sumFibs(4000000), 4613732, 'message: sumFibs(4000000)
should return 4613732.');",
"assert.deepEqual(sumFibs(4), 5, 'message: sumFibs(4)
should return 5.');",
@@ -631,7 +633,7 @@
"assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'message: find([1, 3, 5, 9], function(num) { return num % 2 === 0; })
should return undefined.');"
],
"MDNlinks": [
- "Array.some()"
+ "Array.filter()"
],
"type": "bonfire",
"challengeType": 5,
@@ -823,7 +825,7 @@
"assert.isUndefined(add(2)([3]), 'message: add(2)([3])
should return undefined.');"
],
"MDNlinks": [
- "Global Function Object",
+ "Closures",
"Arguments object"
],
"type": "bonfire",
diff --git a/challenges/intermediate-ziplines.json b/challenges/intermediate-ziplines.json
index 27680d7350..0d2afbcb5c 100644
--- a/challenges/intermediate-ziplines.json
+++ b/challenges/intermediate-ziplines.json
@@ -1,13 +1,14 @@
{
"name": "Intermediate Front End Development Projects",
"order": 11,
+ "time": "200h",
"challenges": [
{
"id": "bd7158d8c442eddfaeb5bd10",
"title": "Show the Local Weather",
"challengeSeed": ["126415127"],
"description": [
- "Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/AdventureBear/full/yNBJRj.",
+ "Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/FreeCodeCamp/pen/avqvgJ.",
"Rule #1: Don't look at the example project's code on CodePen. Figure it out for yourself.",
"Rule #2: You may use whichever libraries or APIs you need.",
"Rule #3: Reverse engineer the example project's functionality, and also feel free to personalize it.",
@@ -16,6 +17,7 @@
"Bonus User Story: As a user, I can see an icon depending on the weather.",
"Bonus User Story: As a user, I see a different background image (e.g. snowy mountain, hot desert) depending on the weather.",
"Bonus User Story: As a user, I can push a button to toggle between Fahrenheit and Celsius.",
+ "We recommend using the Open Weather API. This will require creating a free API key. Normally you want to avoid exposing API keys on CodePen, but we haven't been able to find a keyless API for weather.",
"Remember to use Read-Search-Ask if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project. script
element at the top of your page. Be sure to close it on the following line.",
"Your browser will run any JavaScript inside a script
element, including jQuery.",
- "Inside your script
element, add this code: $(document).ready(function() {
to your script
. Then close it on the following line (still inside your script
element) with: });
"
+ "Inside your script
element, add this code: $(document).ready(function() {
to your script
. Then close it on the following line (still inside your script
element) with: });
",
+ "We'll learn more about functions
later. The important thing to know is that code you put inside this function
will run as soon as your browser has loaded your page.",
+ "This is important because without your document ready function
, your code may run before your HTML is rendered, which would cause bugs."
],
"tests": [
"assert(editor.match(/