From eab48d205aa3af8e0d4c3e206e53182017044760 Mon Sep 17 00:00:00 2001 From: miguel Date: Wed, 25 Sep 2024 11:03:55 +0100 Subject: [PATCH 01/31] fix(AI.GO)change the name of dpxai --- subjects/{DPxAI => AI.GO}/call-it/README.md | 0 subjects/{DPxAI => AI.GO}/class-it/README.md | 0 subjects/{DPxAI => AI.GO}/colorful-arms/README.md | 0 subjects/{DPxAI => AI.GO}/colorful-legs/README.md | 0 subjects/{DPxAI => AI.GO}/declare-everything/README.md | 0 subjects/{DPxAI => AI.GO}/embedded-organs/README.md | 0 subjects/{DPxAI => AI.GO}/first-function/README.md | 0 subjects/{DPxAI => AI.GO}/first-hello/README.md | 0 subjects/{DPxAI => AI.GO}/first-move/README.md | 0 subjects/{DPxAI => AI.GO}/first-wink/README.md | 0 subjects/{DPxAI => AI.GO}/glance-on-power/README.md | 0 subjects/{DPxAI => AI.GO}/good-recipe/README.md | 0 subjects/{DPxAI => AI.GO}/i-win-arguments/README.md | 0 subjects/{DPxAI => AI.GO}/listed/README.md | 0 subjects/{DPxAI => AI.GO}/objects-around/README.md | 0 subjects/{DPxAI => AI.GO}/only-if/README.md | 0 subjects/{DPxAI => AI.GO}/play-with-variables/README.md | 0 subjects/{DPxAI => AI.GO}/robots-harmony/README.md | 0 subjects/{DPxAI => AI.GO}/robots-harmony/audit/README.md | 0 subjects/{DPxAI => AI.GO}/select-then-style/README.md | 0 subjects/{DPxAI => AI.GO}/star-forge/README.md | 0 subjects/{DPxAI => AI.GO}/the-skeleton/README.md | 0 subjects/{DPxAI => AI.GO}/the-smooth-operator/README.md | 0 subjects/{DPxAI => AI.GO}/transform-objects/README.md | 0 24 files changed, 0 insertions(+), 0 deletions(-) rename subjects/{DPxAI => AI.GO}/call-it/README.md (100%) rename subjects/{DPxAI => AI.GO}/class-it/README.md (100%) rename subjects/{DPxAI => AI.GO}/colorful-arms/README.md (100%) rename subjects/{DPxAI => AI.GO}/colorful-legs/README.md (100%) rename subjects/{DPxAI => AI.GO}/declare-everything/README.md (100%) rename subjects/{DPxAI => AI.GO}/embedded-organs/README.md (100%) rename subjects/{DPxAI => AI.GO}/first-function/README.md (100%) rename subjects/{DPxAI => AI.GO}/first-hello/README.md (100%) rename subjects/{DPxAI => AI.GO}/first-move/README.md (100%) rename subjects/{DPxAI => AI.GO}/first-wink/README.md (100%) rename subjects/{DPxAI => AI.GO}/glance-on-power/README.md (100%) rename subjects/{DPxAI => AI.GO}/good-recipe/README.md (100%) rename subjects/{DPxAI => AI.GO}/i-win-arguments/README.md (100%) rename subjects/{DPxAI => AI.GO}/listed/README.md (100%) rename subjects/{DPxAI => AI.GO}/objects-around/README.md (100%) rename subjects/{DPxAI => AI.GO}/only-if/README.md (100%) rename subjects/{DPxAI => AI.GO}/play-with-variables/README.md (100%) rename subjects/{DPxAI => AI.GO}/robots-harmony/README.md (100%) rename subjects/{DPxAI => AI.GO}/robots-harmony/audit/README.md (100%) rename subjects/{DPxAI => AI.GO}/select-then-style/README.md (100%) rename subjects/{DPxAI => AI.GO}/star-forge/README.md (100%) rename subjects/{DPxAI => AI.GO}/the-skeleton/README.md (100%) rename subjects/{DPxAI => AI.GO}/the-smooth-operator/README.md (100%) rename subjects/{DPxAI => AI.GO}/transform-objects/README.md (100%) diff --git a/subjects/DPxAI/call-it/README.md b/subjects/AI.GO/call-it/README.md similarity index 100% rename from subjects/DPxAI/call-it/README.md rename to subjects/AI.GO/call-it/README.md diff --git a/subjects/DPxAI/class-it/README.md b/subjects/AI.GO/class-it/README.md similarity index 100% rename from subjects/DPxAI/class-it/README.md rename to subjects/AI.GO/class-it/README.md diff --git a/subjects/DPxAI/colorful-arms/README.md b/subjects/AI.GO/colorful-arms/README.md similarity index 100% rename from subjects/DPxAI/colorful-arms/README.md rename to subjects/AI.GO/colorful-arms/README.md diff --git a/subjects/DPxAI/colorful-legs/README.md b/subjects/AI.GO/colorful-legs/README.md similarity index 100% rename from subjects/DPxAI/colorful-legs/README.md rename to subjects/AI.GO/colorful-legs/README.md diff --git a/subjects/DPxAI/declare-everything/README.md b/subjects/AI.GO/declare-everything/README.md similarity index 100% rename from subjects/DPxAI/declare-everything/README.md rename to subjects/AI.GO/declare-everything/README.md diff --git a/subjects/DPxAI/embedded-organs/README.md b/subjects/AI.GO/embedded-organs/README.md similarity index 100% rename from subjects/DPxAI/embedded-organs/README.md rename to subjects/AI.GO/embedded-organs/README.md diff --git a/subjects/DPxAI/first-function/README.md b/subjects/AI.GO/first-function/README.md similarity index 100% rename from subjects/DPxAI/first-function/README.md rename to subjects/AI.GO/first-function/README.md diff --git a/subjects/DPxAI/first-hello/README.md b/subjects/AI.GO/first-hello/README.md similarity index 100% rename from subjects/DPxAI/first-hello/README.md rename to subjects/AI.GO/first-hello/README.md diff --git a/subjects/DPxAI/first-move/README.md b/subjects/AI.GO/first-move/README.md similarity index 100% rename from subjects/DPxAI/first-move/README.md rename to subjects/AI.GO/first-move/README.md diff --git a/subjects/DPxAI/first-wink/README.md b/subjects/AI.GO/first-wink/README.md similarity index 100% rename from subjects/DPxAI/first-wink/README.md rename to subjects/AI.GO/first-wink/README.md diff --git a/subjects/DPxAI/glance-on-power/README.md b/subjects/AI.GO/glance-on-power/README.md similarity index 100% rename from subjects/DPxAI/glance-on-power/README.md rename to subjects/AI.GO/glance-on-power/README.md diff --git a/subjects/DPxAI/good-recipe/README.md b/subjects/AI.GO/good-recipe/README.md similarity index 100% rename from subjects/DPxAI/good-recipe/README.md rename to subjects/AI.GO/good-recipe/README.md diff --git a/subjects/DPxAI/i-win-arguments/README.md b/subjects/AI.GO/i-win-arguments/README.md similarity index 100% rename from subjects/DPxAI/i-win-arguments/README.md rename to subjects/AI.GO/i-win-arguments/README.md diff --git a/subjects/DPxAI/listed/README.md b/subjects/AI.GO/listed/README.md similarity index 100% rename from subjects/DPxAI/listed/README.md rename to subjects/AI.GO/listed/README.md diff --git a/subjects/DPxAI/objects-around/README.md b/subjects/AI.GO/objects-around/README.md similarity index 100% rename from subjects/DPxAI/objects-around/README.md rename to subjects/AI.GO/objects-around/README.md diff --git a/subjects/DPxAI/only-if/README.md b/subjects/AI.GO/only-if/README.md similarity index 100% rename from subjects/DPxAI/only-if/README.md rename to subjects/AI.GO/only-if/README.md diff --git a/subjects/DPxAI/play-with-variables/README.md b/subjects/AI.GO/play-with-variables/README.md similarity index 100% rename from subjects/DPxAI/play-with-variables/README.md rename to subjects/AI.GO/play-with-variables/README.md diff --git a/subjects/DPxAI/robots-harmony/README.md b/subjects/AI.GO/robots-harmony/README.md similarity index 100% rename from subjects/DPxAI/robots-harmony/README.md rename to subjects/AI.GO/robots-harmony/README.md diff --git a/subjects/DPxAI/robots-harmony/audit/README.md b/subjects/AI.GO/robots-harmony/audit/README.md similarity index 100% rename from subjects/DPxAI/robots-harmony/audit/README.md rename to subjects/AI.GO/robots-harmony/audit/README.md diff --git a/subjects/DPxAI/select-then-style/README.md b/subjects/AI.GO/select-then-style/README.md similarity index 100% rename from subjects/DPxAI/select-then-style/README.md rename to subjects/AI.GO/select-then-style/README.md diff --git a/subjects/DPxAI/star-forge/README.md b/subjects/AI.GO/star-forge/README.md similarity index 100% rename from subjects/DPxAI/star-forge/README.md rename to subjects/AI.GO/star-forge/README.md diff --git a/subjects/DPxAI/the-skeleton/README.md b/subjects/AI.GO/the-skeleton/README.md similarity index 100% rename from subjects/DPxAI/the-skeleton/README.md rename to subjects/AI.GO/the-skeleton/README.md diff --git a/subjects/DPxAI/the-smooth-operator/README.md b/subjects/AI.GO/the-smooth-operator/README.md similarity index 100% rename from subjects/DPxAI/the-smooth-operator/README.md rename to subjects/AI.GO/the-smooth-operator/README.md diff --git a/subjects/DPxAI/transform-objects/README.md b/subjects/AI.GO/transform-objects/README.md similarity index 100% rename from subjects/DPxAI/transform-objects/README.md rename to subjects/AI.GO/transform-objects/README.md From b27860235bf6b950d1b24b922cddd39dddb4a9aa Mon Sep 17 00:00:00 2001 From: miguel Date: Wed, 25 Sep 2024 10:31:17 +0100 Subject: [PATCH 02/31] docs(quad): improve questions in audit --- subjects/quad/audit/README.md | 92 +++++++++++++++++------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/subjects/quad/audit/README.md b/subjects/quad/audit/README.md index b60f03e657..22983a9167 100644 --- a/subjects/quad/audit/README.md +++ b/subjects/quad/audit/README.md @@ -1,6 +1,6 @@ #### quadA -> ***NOTE: If you are an admin and you want to test this project, follow the instructions [in the this subject](https://github.com/01-edu/go-tests/blob/master/raid-testing.md) before you proceed to the questions.*** +> **_NOTE: If you are an admin and you want to test this project, follow the instructions [in the this subject](https://github.com/01-edu/go-tests/blob/master/raid-testing.md) before you proceed to the questions._** ##### Open the repository of the project and check the submitted files @@ -14,7 +14,7 @@ o---o o---o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=5 and y=1"` @@ -22,7 +22,7 @@ o---o o---o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=1"` @@ -30,7 +30,7 @@ o---o o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=5"` @@ -42,19 +42,19 @@ o o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=0 and y=0"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=-1 and y=6"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=6 and y=-1"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=20 and y=1"` @@ -62,7 +62,7 @@ o o------------------o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=10 and y=8"` @@ -77,7 +77,7 @@ o--------o o--------o ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? #### quadB @@ -89,7 +89,7 @@ o--------o \***/ ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=5 and y=1"` @@ -97,7 +97,7 @@ o--------o /***\ ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=1"` @@ -105,7 +105,7 @@ o--------o / ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=5"` @@ -117,19 +117,19 @@ o--------o \ ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=0 and y=0"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=-1 and y=6"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=6 and y=-1"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=18 and y=6"` @@ -142,7 +142,7 @@ o--------o \****************/ ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=9 and y=3"` @@ -152,7 +152,7 @@ o--------o \*******/ ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? #### quadC @@ -164,7 +164,7 @@ B B CBBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=5 and y=1"` @@ -172,7 +172,7 @@ CBBBC ABBBA ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=1"` @@ -180,7 +180,7 @@ ABBBA A ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=5"` @@ -192,19 +192,19 @@ B C ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=0 and y=0"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=-1 and y=6"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=6 and y=-1"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=13 and y=7"` @@ -218,7 +218,7 @@ B B CBBBBBBBBBBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=10 and y=15"` @@ -240,7 +240,7 @@ B B CBBBBBBBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? #### quadD @@ -252,7 +252,7 @@ B B ABBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=5 and y=1"` @@ -260,7 +260,7 @@ ABBBC ABBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=1"` @@ -268,7 +268,7 @@ ABBBC A ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=5"` @@ -280,19 +280,19 @@ B A ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=0 and y=0"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=-1 and y=6"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=6 and y=-1"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=3 and y=16"` @@ -315,7 +315,7 @@ B B ABC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=7 and y=16"` @@ -338,7 +338,7 @@ B B ABBBBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? #### quadE @@ -350,7 +350,7 @@ B B CBBBA ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=5 and y=1"` @@ -358,7 +358,7 @@ CBBBA ABBBC ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=1"` @@ -366,7 +366,7 @@ ABBBC A ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=1 and y=5"` @@ -378,19 +378,19 @@ B C ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=0 and y=0"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=-1 and y=6"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=6 and y=-1"` -###### Does the function returns nothing? +###### Does the function return nothing? ##### Try running the function with the arguments: `"x=21 and y=24"` @@ -422,7 +422,7 @@ CBBBBBBBBBBBBBBBBBBBA ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? ##### Try running the function with the arguments: `"x=18 and y=8"` @@ -438,4 +438,4 @@ CBBBBBBBBBBBBBBBBA ``` -###### Does the function returns the value above? +###### Does the function return the output shown above? From 3d7e4d40b2faebf857fcc74297676a96a0902a01 Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Wed, 25 Sep 2024 18:16:30 +0100 Subject: [PATCH 03/31] fix(READMES): fixes inconsistencies and grammar improvements for 2 first quests of AI piscine --- subjects/AI.GO/call-it/README.md | 2 +- subjects/AI.GO/declare-everything/README.md | 5 ----- subjects/AI.GO/first-function/README.md | 2 +- subjects/AI.GO/first-move/README.md | 10 +++++----- subjects/AI.GO/good-recipe/README.md | 16 ++++++++-------- subjects/AI.GO/i-win-arguments/README.md | 6 +++--- subjects/AI.GO/listed/README.md | 2 +- subjects/AI.GO/only-if/README.md | 8 ++++---- subjects/AI.GO/select-then-style/README.md | 2 +- subjects/AI.GO/the-skeleton/README.md | 2 +- subjects/AI.GO/transform-objects/README.md | 4 ++-- 11 files changed, 27 insertions(+), 32 deletions(-) diff --git a/subjects/AI.GO/call-it/README.md b/subjects/AI.GO/call-it/README.md index 06bd18778f..d08b7454b7 100644 --- a/subjects/AI.GO/call-it/README.md +++ b/subjects/AI.GO/call-it/README.md @@ -12,7 +12,7 @@ there's still a bit of work to do. First of all, instead of writing down what things are _(you're not writing down on your hand the word 'hand', are you?)_, we're going to identify them semantically with the very practical [id -attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attri butes/id). This `id` has to be a **unique** +attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id). This `id` has to be a **unique** identifier on your webpage, allowing you to target your element when needed. You can compare it to your name and surname; this is what identifies you to other people, and if someone's calling you by your name, you answer. diff --git a/subjects/AI.GO/declare-everything/README.md b/subjects/AI.GO/declare-everything/README.md index e87b9119e8..c44abef71c 100644 --- a/subjects/AI.GO/declare-everything/README.md +++ b/subjects/AI.GO/declare-everything/README.md @@ -103,11 +103,6 @@ Declare two variables: - Use the identifier `seven` with the value being a string of the number 7 - Use the identifier `seventySeven` with the value being a string of the number 77 -```js -let seven = "7"; -let seventySeven = "77"; -``` - --- > "When we first begin fighting for our dreams, we have no experience and make many mistakes. The secret of life, though, is to fall seven times and get up eight times." diff --git a/subjects/AI.GO/first-function/README.md b/subjects/AI.GO/first-function/README.md index cf0be42bfe..a45187a6d6 100644 --- a/subjects/AI.GO/first-function/README.md +++ b/subjects/AI.GO/first-function/README.md @@ -84,4 +84,4 @@ You are a robot made by a scientist called Rick and you want to know your purpos - Declare a function named `ask` that `log` 'What is my purpose ?' in the console - Declare a function named `reply` that `log` 'You pass butter.' in the console - Then first `call the ask` then `the reply` once, in that order. + Then call the `ask` and the `reply` each once, in that order. diff --git a/subjects/AI.GO/first-move/README.md b/subjects/AI.GO/first-move/README.md index 3d51315d99..e4a47063f6 100644 --- a/subjects/AI.GO/first-move/README.md +++ b/subjects/AI.GO/first-move/README.md @@ -6,9 +6,9 @@ Glad to see you here! It's impressive how far you've come today, and you are just one step away from seeing a simple yet impressive thing we can do with JavaScript. This will give you a glimpse of how JavaScript works with HTML and CSS to make your robot interesting! By using JavaScript, you will control and interact with your creation, adding dynamic abilities that make it come alive. -So far, you haven't learned much about JavaScript (but you will soon, don't worry!), but we want you to see an example of how powerful JavaScript can be in modifying the robot. +So far, you haven't learned much about JavaScript (but you will soon, don't worry!), now we want you to see an example of how powerful JavaScript can be in modifying the robot. -In these instructions, you will execute the steps to change your robot's eyes from open to closed using JavaScript! Does it seem simple? Yes, but you will later make your robot more dynamic by pushing a button to open and close that eye! Of course, that's for when you learn more about JavaScript (Again, a secret for you because you made it until here). +In these instructions, you will execute the steps to change your robot's eyes from open to closed using JavaScript! Does it seem simple? Yes, but you will later make your robot more dynamic by pushing a button to open and close that eye! Of course, that's for when you will learn more about JavaScript. This is more of a puzzle to use your brain to follow hints and make things work, even if it seems complex (it is not!). Isn't that your brain's superpower? @@ -33,15 +33,15 @@ First, define this new class in `your CSS file`: #### Task 1 -Second, [`Link a JS script`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script) to your HTML file. +Second, [Link a JS script](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script) to your HTML file. #### Task 2 -Then in your Javascript file, you're going to close the left eye of your entity. To do so, you have to target the `eye-left` HTML element by its `id` using the [`getElementById`](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) method. +Then in your Javascript file, you're going to close the left eye of your entity. To do so, you have to first target the `eye-left` HTML element by its `id` using the [getElementById](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) method. #### Task 3 -Then, [set the `style`](https://developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/style#setting_styles) of your `eye-left` to change its background color to "black". We also need to modify its shape; for that, we are going to add a new class to it. +Then, after your eye is targetted, [set the style](https://developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/style#setting_styles) of your `eye-left` to change its background color to "black". Finally, we also need to modify its shape; for that, we are going to add a new class to it. To do so, you need to you use the [classList.add()](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList). ### Code examples diff --git a/subjects/AI.GO/good-recipe/README.md b/subjects/AI.GO/good-recipe/README.md index fa53c92db6..784f1f3ec9 100644 --- a/subjects/AI.GO/good-recipe/README.md +++ b/subjects/AI.GO/good-recipe/README.md @@ -51,10 +51,10 @@ console.log(num.toFixed(2)); // -> '3.33' Using the `.slice` method to cut parts of a string: ```js -let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -let cutFirst = alphabet.slice(10); // 'KLMNOPQRSTUVWXYZ' -let cutLast = alphabet.slice(0, -3); // 'ABCDEFGHIJKLMNOPQRSTU' -let cutFirstLast = alphabet.slice(5, -6); // 'FGHIJKLMNOPQRS +let numbers = "0123456789"; +let firstNumbers = numbers.slice(5); // '6789' +let lastNumbers = numbers.slice(0, -3); // '0123456' +let cutBothSides= numbers.slice(2, -3); // '23456' ``` ### Splitting Strings @@ -93,11 +93,11 @@ Declare an `oldestAge` variable that uses `Math.max` on the `age` properties of #### Task 2: -You need to slice some virtual vegetables. Using the `.slice` method and the provided alphabet variable, which is a string of all the characters in the alphabet: +You need to slice some virtual vegetables. Using the `.slice` method and the provided `alphabet` variable, which is a string of all the characters in the alphabet: -- Declare a `cutFirst` variable that removes the first `10` characters of alphabet, simulating the removal of the first few slices. -- Declare a `cutLast` variable that removes the last `3` characters of alphabet, simulating the trimming of the last few slices. -- Declare a `cutFirstLast` variable that removes the first `5` characters and the last 6 characters of alphabet, simulating a precise cut in the middle. +- Declare a `cutFirst` variable that removes the first `10` characters of `alphabet`, simulating the removal of the first few slices. +- Declare a `cutLast` variable that removes the last `3` characters of `alphabet`, simulating the trimming of the last few slices. +- Declare a `cutFirstLast` variable that removes the first `5` characters and the last 6 characters of `alphabet`, simulating a precise cut in the middle. #### Task 3: diff --git a/subjects/AI.GO/i-win-arguments/README.md b/subjects/AI.GO/i-win-arguments/README.md index 767b72f43f..1df4fe8487 100644 --- a/subjects/AI.GO/i-win-arguments/README.md +++ b/subjects/AI.GO/i-win-arguments/README.md @@ -4,7 +4,7 @@ ### Context -You made it to the last mission in getting your full power, to make your robot alive and fully functional! +You made it to the last mission for getting your full power which will make your robot alive and fully functional! The final step involves mastering the use of `arguments` in functions. By learning how to use and manage these `arguments` effectively, you can unlock the full potential of your robot and make it later truly come alive. @@ -141,7 +141,7 @@ As the leader of the RoboGuard forces, you're not just preparing for battle—yo 1- Create the `duos` Function: - This function will take `two arguments`, representing the **names** of **two robots**. -- It will `log them` together with an **and** and an **exclamation mark**. +- It will `log them` together with a space, the word **and**, another space and end the sentence with an **exclamation mark**. > Output's example: "robotOne and robotTwo!" @@ -149,7 +149,7 @@ As the leader of the RoboGuard forces, you're not just preparing for battle—yo - This function will take `three arguments`: the **names** of two robots and the **task** they will perform together. -- It will `log them` together in a sentence describing their task. +- It will `log them` together in a sentence describing their task with the same formatting than below. > Output's example: "robotOne and robotTwo are saying hi! diff --git a/subjects/AI.GO/listed/README.md b/subjects/AI.GO/listed/README.md index 7858ea1bb4..7bd2310c01 100644 --- a/subjects/AI.GO/listed/README.md +++ b/subjects/AI.GO/listed/README.md @@ -109,7 +109,7 @@ Now, the array looks like this: #### Task 1: -You must declare a variable `components` that contains 4 strings, one for each robot component. +You must declare a variable `components` that contains 4 strings, one for each robot component "motor", "sensor", "battery" and "camera" (respect that order). #### Task 2: diff --git a/subjects/AI.GO/only-if/README.md b/subjects/AI.GO/only-if/README.md index e8063a1ff0..732f13f285 100644 --- a/subjects/AI.GO/only-if/README.md +++ b/subjects/AI.GO/only-if/README.md @@ -108,14 +108,14 @@ if (temperature < 8) { Your Robot must always seek the truth. -- Check if the value of the provided variable `truth` is truthy, log '`The truth was spoken.`' -- Otherwise, log '`Lies !!!!`' because the value of the provided variable truth is falsy. +- Check if the value of the provided variable `truth` is truthy, log the string: `The truth was spoken.` +- Otherwise, log the string: `Lies !!!!` because the value of the provided variable truth is falsy. #### Task 2: -Your `RoboGuard's traveling company` has a special promotion for robot members aged between 18 and 25. Write the if condition that will check if the robot user can benefit from the promotion: +Your `RoboGuard's traveling company` has a special promotion for robot members aged between 18 (included) and 25 (included). Write the if condition that will check if the robot user can benefit from the promotion: -- `user.age` must be at least `18`. +- `user.age` must be more than `17`. - `user.age` must be less than or equal to `25`. - `user.activeMembership` must be `true`. diff --git a/subjects/AI.GO/select-then-style/README.md b/subjects/AI.GO/select-then-style/README.md index 346d7313ea..d7c8db2dde 100644 --- a/subjects/AI.GO/select-then-style/README.md +++ b/subjects/AI.GO/select-then-style/README.md @@ -32,7 +32,7 @@ Now that you have created and properly identified the different sections of your - `width` of `100%` - `height` of `calc(100% / 3)` _(one third of the `body` height)_ -- Target each of the following elements with the [`id` selector][4], using the `id` you defined earlier for each section, and style them: +- Target each of the following elements with the [id selector][4], using the `id` you defined earlier for each section, and style them: - `face` with a "cyan" `background-color` - `upper-body` with a "blueviolet" `background-color` - `lower-body` with a "lightsalmon" `background-color` diff --git a/subjects/AI.GO/the-skeleton/README.md b/subjects/AI.GO/the-skeleton/README.md index 3ec4773790..ebfbe67495 100644 --- a/subjects/AI.GO/the-skeleton/README.md +++ b/subjects/AI.GO/the-skeleton/README.md @@ -52,7 +52,7 @@ Choose a power that you will give to your robot from the following list and put #### The `` part: -This section contains the content of your webpage , in our case the lower body of your buddy. Define the skeleton of your robot by organizing it into three main sections: the face, the upper body, and the lower body. Inside the tag of your HTML file, create three divisions using
tags, and place the following text content inside each one: face, upper-body, lower-body. +This section contains the content of your webpage , in our case the lower body of your buddy. Define the skeleton of your robot by organizing it into three main sections: the face, the upper body, and the lower body. Inside the `` tag of your HTML file, create three divisions using `
` tags, and place the following text content inside each one: face, upper-body, lower-body. > Don't forget to press Render again to refresh the display page when you modify your code. diff --git a/subjects/AI.GO/transform-objects/README.md b/subjects/AI.GO/transform-objects/README.md index e3f8619f1d..c9da92e964 100644 --- a/subjects/AI.GO/transform-objects/README.md +++ b/subjects/AI.GO/transform-objects/README.md @@ -65,14 +65,14 @@ robot.code = undefined; Modify the provided `robot` variable: - Add a `model` property with the string value 'RX-78'. -- Add a `fullName` property that is the joined value of the `brand` and the `model` with a space in between. +- Add a `fullName` property that is the joined value of the `brand` and the `model` with a space in between. (`brand` and `model`are already defined in the provided `robot`) - Add `10` to its `batteryLevel` property. #### Task 2: Let's move away from objects a bit, and discover a notion we will use later. `Duplicating a String with Placeholders`! -Declare a variable `duplicate` that repeats the provided variable `sentence`, separated by a comma, and adds an exclamation mark at the end. +Declare a variable `duplicate` that repeats the provided variable `sentence`, separated by a comma and a space, and then adds an exclamation mark at the end. > For example, if `sentence` is "Hello there", we expect "Hello there, Hello there!". From 79d92e8382a8b04af69e40b2b474ce7972e01f68 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:05:01 +0100 Subject: [PATCH 04/31] Chore(AI-GO): Run prettier to fix formatting --- subjects/AI.GO/first-move/README.md | 2 +- subjects/AI.GO/good-recipe/README.md | 2 +- subjects/AI.GO/i-win-arguments/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subjects/AI.GO/first-move/README.md b/subjects/AI.GO/first-move/README.md index e4a47063f6..efd76973ba 100644 --- a/subjects/AI.GO/first-move/README.md +++ b/subjects/AI.GO/first-move/README.md @@ -37,7 +37,7 @@ Second, [Link a JS script](https://developer.mozilla.org/en-US/docs/Web/HTML/Ele #### Task 2 -Then in your Javascript file, you're going to close the left eye of your entity. To do so, you have to first target the `eye-left` HTML element by its `id` using the [getElementById](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) method. +Then in your Javascript file, you're going to close the left eye of your entity. To do so, you have to first target the `eye-left` HTML element by its `id` using the [getElementById](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) method. #### Task 3 diff --git a/subjects/AI.GO/good-recipe/README.md b/subjects/AI.GO/good-recipe/README.md index 784f1f3ec9..54f757bf35 100644 --- a/subjects/AI.GO/good-recipe/README.md +++ b/subjects/AI.GO/good-recipe/README.md @@ -54,7 +54,7 @@ Using the `.slice` method to cut parts of a string: let numbers = "0123456789"; let firstNumbers = numbers.slice(5); // '6789' let lastNumbers = numbers.slice(0, -3); // '0123456' -let cutBothSides= numbers.slice(2, -3); // '23456' +let cutBothSides = numbers.slice(2, -3); // '23456' ``` ### Splitting Strings diff --git a/subjects/AI.GO/i-win-arguments/README.md b/subjects/AI.GO/i-win-arguments/README.md index 1df4fe8487..7c16cba8bf 100644 --- a/subjects/AI.GO/i-win-arguments/README.md +++ b/subjects/AI.GO/i-win-arguments/README.md @@ -149,7 +149,7 @@ As the leader of the RoboGuard forces, you're not just preparing for battle—yo - This function will take `three arguments`: the **names** of two robots and the **task** they will perform together. -- It will `log them` together in a sentence describing their task with the same formatting than below. +- It will `log them` together in a sentence describing their task with the same formatting than below. > Output's example: "robotOne and robotTwo are saying hi! From 50a03dfb226ddc115f414979b4cbe57cbd0b69ee Mon Sep 17 00:00:00 2001 From: Zouhair AMAZZAL Date: Sun, 1 Sep 2024 21:02:39 +0300 Subject: [PATCH 05/31] CON-3132 docs(image-inspector) improve format and quality --- .../resources/image-example.jpeg | Bin 0 -> 47757 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 subjects/cybersecurity/image-inspector/resources/image-example.jpeg diff --git a/subjects/cybersecurity/image-inspector/resources/image-example.jpeg b/subjects/cybersecurity/image-inspector/resources/image-example.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..456d5bc32b42b447abfd7db2fb8970a7f42a7bd8 GIT binary patch literal 47757 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 Z)w9+L@CLvCck`H78~;Cd*8gt9{{xf`F`@tf literal 0 HcmV?d00001 From d6c38c116a89ab63f36d7afd7e29454c74c8d335 Mon Sep 17 00:00:00 2001 From: Zouhair AMAZZAL Date: Sat, 14 Sep 2024 15:48:38 +0300 Subject: [PATCH 06/31] CON-3132 docs(image-inspector) fix the requested changes --- .../resources/image-example.jpeg | Bin 47757 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 subjects/cybersecurity/image-inspector/resources/image-example.jpeg diff --git a/subjects/cybersecurity/image-inspector/resources/image-example.jpeg b/subjects/cybersecurity/image-inspector/resources/image-example.jpeg deleted file mode 100644 index 456d5bc32b42b447abfd7db2fb8970a7f42a7bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47757 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 Z)w9+L@CLvCck`H78~;Cd*8gt9{{xf`F`@tf From 82e7bb75d52c261bc643faa5890a9072a4487b76 Mon Sep 17 00:00:00 2001 From: Zouhair AMAZZAL Date: Mon, 23 Sep 2024 20:33:31 +0300 Subject: [PATCH 07/31] CON-3132 docs(image-inspector) improve audit and subject --- .../cybersecurity/image-inspector/README.md | 4 +- .../image-inspector/audit/README.md | 51 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/subjects/cybersecurity/image-inspector/README.md b/subjects/cybersecurity/image-inspector/README.md index 777233ece0..7a6a2d9368 100644 --- a/subjects/cybersecurity/image-inspector/README.md +++ b/subjects/cybersecurity/image-inspector/README.md @@ -13,7 +13,7 @@ Images can contain more than just visual information, they often carry hidden da The goal is to develop a tool using a programming language of your choice (Python is recommended) that can analyze images to extract hidden information. Specifically, your tool should: 1. **Extract Metadata**: Identify and display metadata from images, such as geolocation (latitude and longitude) where the photo was taken, the device used, and other relevant information. -2. **Detect Steganography**: Discover and extract any hidden PGP keys or other data concealed within the image using steganography techniques. +2. **Detect Steganography**: Discover and extract any hidden PGP keys within the image using steganography techniques. By completing this project, you will: @@ -101,7 +101,7 @@ Data saved in hidden_data.txt ``` **You will be provided with an example image to test your tool. Make sure your tool can successfully analyze this image and produce the expected outputs.** -The example image attached: +The example image attached: [image-example1.jpeg](resources/image-example1.jpeg) [image-example2.jpeg](resources/image-example2.jpeg) [image-example3.jpeg](resources/image-example3.jpeg) diff --git a/subjects/cybersecurity/image-inspector/audit/README.md b/subjects/cybersecurity/image-inspector/audit/README.md index 03ad9adce7..a31b381e1f 100644 --- a/subjects/cybersecurity/image-inspector/audit/README.md +++ b/subjects/cybersecurity/image-inspector/audit/README.md @@ -22,8 +22,6 @@ Suggested role play questions include: - How can this tool be used in real-life digital forensics or cybersecurity scenarios? - What ethical considerations should be taken into account when analyzing images for hidden data? -###### Were the students able to answer all the questions? - ###### Did the students demonstrate a thorough understanding of the concepts and technologies used in the project? ###### Were the students able to communicate effectively and justify their decisions and explain the knowledge behind this project? @@ -64,14 +62,14 @@ $> image-inspector -m -o metadata.txt image-example1.jpeg $> image-inspector -s -o hidden_data.txt image-example1.jpeg ``` -###### Does the output correctly detect and extract any hidden PGP keys or other concealed information within the image? +###### Does the output correctly detect and extract any hidden PGP keys within the image? ###### Is the output stored in the file specified in the output parameter? ##### Testing with Images **You will be provided with an example image to test the students tool. Feel free to test with other images.** -The example image attached: +The example image attached: [image-example1.jpeg](resources/image-example1.jpeg) [image-example2.jpeg](resources/image-example2.jpeg) [image-example3.jpeg](resources/image-example3.jpeg) @@ -79,18 +77,47 @@ The example image attached: ###### Test the tool with the provided example image and at least one other image to ensure the tool's robustness. -###### Does the tool produce accurate and expected results for different images? +```sh +$> image-inspector -s -o hidden_data1.txt image-example1.jpeg +Enter -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 01 + +mQENBGIwpy4BC<...> +=N8hc +-----END PGP PUBLIC KEY BLOCK----- +$> +``` + +```sh +$> image-inspector -s -o hidden_data2.txt image-example2.jpeg +-----BEGIN PGP PUBLIC KEY BLOCK----- +xo0EZuV9/AEEANRklh3<...> +=BhsK +-----END PGP PUBLIC KEY BLOCK----- +$> +``` -##### Ensure that the student submission meets the project requirements: +```sh +$> image-inspector -s -o hidden_data3.txt image-example3.jpeg +-----BEGIN PGP PUBLIC KEY BLOCK----- +xo0EZuWBWQEEALrj<...> +=SXXm +-----END PGP PUBLIC KEY BLOCK----- +$> +``` -1. **Functionality:** Does the tool perform its intended functions accurately (metadata extraction and steganography detection)? -2. **Data Accuracy:** Is the retrieved information accurate and relevant? -3. **Ethical Considerations:** Are there clear guidelines and warnings about the ethical and legal use of the tool? -4. **Usability:** Is the tool user-friendly and well-documented? +```sh +$> image-inspector -s -o hidden_data4.txt image-example4.jpeg +-----BEGIN PGP PUBLIC KEY BLOCK----- +xo0EZuWA9AE<...> +=/1dE +-----END PGP PUBLIC KEY BLOCK----- +$> +``` -###### Did the tool design and implementation align with all the project requirements above? +> The results are cut. you can compare the beginning and the end of the results! -###### Were the students able to implement a functional and reliable tool that meets the project requirements? +###### Does the tool produce accurate and expected results for different images? #### Bonus From a28b3584ced0de82b19ff4e32f60693c8658c1a7 Mon Sep 17 00:00:00 2001 From: Zouhair AMAZZAL Date: Sun, 1 Sep 2024 21:02:39 +0300 Subject: [PATCH 08/31] CON-3132 docs(image-inspector) improve format and quality --- .../resources/image-example.jpeg | Bin 0 -> 47757 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 subjects/cybersecurity/image-inspector/resources/image-example.jpeg diff --git a/subjects/cybersecurity/image-inspector/resources/image-example.jpeg b/subjects/cybersecurity/image-inspector/resources/image-example.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..456d5bc32b42b447abfd7db2fb8970a7f42a7bd8 GIT binary patch literal 47757 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 Z)w9+L@CLvCck`H78~;Cd*8gt9{{xf`F`@tf literal 0 HcmV?d00001 From a5580e926a9142ec3ab4711adf4f87edcf85d1b3 Mon Sep 17 00:00:00 2001 From: Zouhair AMAZZAL Date: Sat, 14 Sep 2024 15:48:38 +0300 Subject: [PATCH 09/31] CON-3132 docs(image-inspector) fix the requested changes --- .../resources/image-example.jpeg | Bin 47757 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 subjects/cybersecurity/image-inspector/resources/image-example.jpeg diff --git a/subjects/cybersecurity/image-inspector/resources/image-example.jpeg b/subjects/cybersecurity/image-inspector/resources/image-example.jpeg deleted file mode 100644 index 456d5bc32b42b447abfd7db2fb8970a7f42a7bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47757 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 Z)w9+L@CLvCck`H78~;Cd*8gt9{{xf`F`@tf From f0761cc9f040d103fbe5fa2e146aca68ea8b9552 Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Sat, 28 Sep 2024 19:39:26 +0100 Subject: [PATCH 10/31] fix(READMES): fixes inconsistencies and grammar improvements for 3rd quest quest and raid of AI piscine --- subjects/AI.GO/colorful-arms/README.md | 5 ++- subjects/AI.GO/robots-harmony/README.md | 56 ++++++++++++------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/subjects/AI.GO/colorful-arms/README.md b/subjects/AI.GO/colorful-arms/README.md index 5ee7069dba..71b0470415 100644 --- a/subjects/AI.GO/colorful-arms/README.md +++ b/subjects/AI.GO/colorful-arms/README.md @@ -58,9 +58,10 @@ In the JS file, like in the previous exercise, get the following elements: #### Task 3: -We provide you with the variable `randomColor`, that stores a random color in each different time we use it. +In the code example below, we show you the variable `randomColor` which stores a random color each time we use it. -- Apply the random color to both arms by changing their `backgroundColor`. +- Create a function that applies the random color to both arms by changing their `backgroundColor`every time the function is called. +- Then add an `event listener` on `click event` for the button with ID `arm-color`. ### Code Example: diff --git a/subjects/AI.GO/robots-harmony/README.md b/subjects/AI.GO/robots-harmony/README.md index 3934a7bc9b..9a817568ae 100644 --- a/subjects/AI.GO/robots-harmony/README.md +++ b/subjects/AI.GO/robots-harmony/README.md @@ -4,19 +4,19 @@ ## Context -Welcome to your final milestone! After each of you has brought a robot to friend to life, it's time to reunite them together. +Welcome to your final milestone! After each of you has brought a robot friend to life, it's time to bring them together. -Now, all those incredible robots need to be displayed in perfect harmony in our interactive and visually stunning Robots `Gallery`. +Now, all these incredible robots need to be displayed in perfect harmony in our interactive and visually stunning Robots `Gallery`. As a team, your task is to combine your individual creations into a cohesive display. -This gallery won't just be functional, it will be a fun and visually appealing experience that highlights the creativity and collaboration behind your robots. +This gallery won't be functional yet; it will be a fun and visually appealing experience that highlights the creativity and collaboration behind your robots. -> You'll be working on this mission as a team, so effective communication and mutual support are key to bringing your robots together. +> You'll be working on this mission as a team, so effective communication and mutual support are key to bring your robots together. -> Separate tasks equally, it will make the results better! +> Divide tasks equally, it will make the results better! -> Remember what you learned in asking AI for the precise explanation of concepts, while your team apply those concepts and do the actual fun work! +> Remember what you learned when asking AI for precise concepts' explanations. Make use of them to do the actual fun work! Go ahead, and let the world see the amazing robots you've created together! @@ -57,7 +57,7 @@ You need to submit the following files: ## Instructions -Theses tasks are representing the mandatory part for this raid to be passed successfully. Bonus part is optional but highly encouraged for more fun! +These following tasks are mandatory for this raid to be passed successfully. The bonus part is optional but highly encouraged for more fun! ### Task 1: Set Up the Gallery Structure @@ -67,7 +67,7 @@ Inside your HTML file, set up the basic structure of the HTML document with a `< #### 2- Give a gallery title: -- Inside your `` , create an `

` tag inside a `
` with an `id` of `title`. Then put the name of your gallery inside it ! +- Inside your `` , create an `

` tag inside a `
` with the `id` **title**. Then put the name of your gallery inside the `

` section ! ```HTML
@@ -77,7 +77,7 @@ Inside your HTML file, set up the basic structure of the HTML document with a `< #### 3- Put your robots inside the gallery: -- Under the `title` div, create a div element with the `id` `gallery`. +- Under the `title` div, create a div element with the `id` **gallery**. - This div will serve as the container for all the robot portraits. @@ -209,7 +209,7 @@ h3 { > Trust the process! -- Then add this gallery style block, and change the `background-color` of it based on your team's favorite color: +- Then add this gallery style block, and change its `background-color` based on your team's favorite color: ```css #gallery { @@ -223,17 +223,17 @@ h3 { } ``` -- Add the following block of style to all your class's of `name-robot`. To do so, we follow the rule: +- Add the following style block to all your `name-robot` classes. To do so, we follow the rule: ```css .class-one, .class-two, .class-three { - /* block of style */ + /* style block */ } ``` -- Name it with your `name-robot` for each member of the team, and put inside the block the following styles: +- Name it with the `name-robot` of each teammember, and add inside the block the following styles: ```css { @@ -266,9 +266,9 @@ h3 { > Experiment by changing the colors of the box-shadow and the scale value! Be creative. -- In your `#gallery` CSS rule, add some animated gradient color to the background! You can achieve it by combining CSS properties: `background`, `background-size`, `animation`, `box-shadow`. +- In your `#gallery` CSS rule, add some animated gradient color to the background! You can achieve it by combining CSS properties: `background`, `background-size`, `animation` and `box-shadow`. -> Hint : Do not forget to replace the background property with the new value bellow! +> Hint : Do not forget to replace the background property with the new value below! _For Example:_ @@ -284,9 +284,9 @@ animation: gradientBackground 2s ease infinite; /* Animates the background to cr box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); /* Adds a shadow around the element. Adjust the offsets, blur radius, and opacity as needed */ ``` -> You saw no change? well we did not specify yet what to do with all those colors, angles and timing yet! +> You didn't see any change? Well we didn't specify what to do with all those colors, angles and timing yet! -- Let's make it more exciting, by actually making the colors move! We can do that with `keyframes`! Under the `#gallery` css rule, put the `keyframes`` block and see the magic ! +- Let's make it more exciting by actually making the colors move! We can do that with `keyframes`! Under the `#gallery` css rule, put the `keyframes` block and see the magic ! _For Example:_ @@ -310,7 +310,7 @@ _For Example:_ - "How do I create a smooth gradient background with multiple colors in CSS?" -- "Explain to me as a beginner these CSS properties: `background`, `background-size`, `animation`, `box-shadow`." +- "Explain to me as a beginner these CSS properties: `background`, `background-size`, `animation` and `box-shadow`." ### Task 3: Add Interactivity with JavaScript: @@ -324,15 +324,15 @@ Follow the following steps: - Create a function named `changeArmColor`. - This function should accept a parameter `robotClass` to identify which robot to modify. - - Inside the function, generate a random color using JavaScript, to both `left` and `right` arms. + - Inside the function, generate a random color using JavaScript, to apply to both `left` and `right` arms. ```js const randomColor = `#${Math.floor(Math.random() * 16777215).toString(16)}`; ``` - Use `document.querySelector` to select the `left` and `right` arm elements of the robot. - - Apply the random color to both arm elements using `style.backgroundColor`. - - Here is an example, do the same for right arm: + - Apply the random color to both arm' elements using `style.backgroundColor`. + - Below is an example, do the same for the right arm: ```js const randomColor = `#${Math.floor(Math.random() * 16777215).toString(16)}`; @@ -340,30 +340,30 @@ Follow the following steps: document.querySelector(`.${robotClass} #arm-left`).style.backgroundColor = randomColor; - //do the same to right arm + //do the same to the right arm ``` - **Function to Change Legs Colors**: - Create a function named `changeLegColor`. - - Follow the same steps as the `changeArmColor` function but target the `legs`. + - Follow the same steps as the `changeArmColor` function but have it target the `legs`. - **Function to Change Eye Colors**: - Create a function named `changeEyeColor`. - - Follow the same steps as the `changeArmColor` function but target the `eye`. + - Follow the same steps as the `changeArmColor` function but have it target the `eye`. - **Function to Change Face Colors**: - Create a function named `changeFaceColor`. - - Follow the same steps as the `changeArmColor` function but target the `eyes` `id`. (Yes, pay attention, the `id` that changes the face color is called `eyes`!) + - Follow the same steps as the `changeArmColor` function but target the `eyes` **id**. (Yes, pay attention, the `id` that changes the face color is called `eyes`!) #### 3- Adding Event Listeners for Keyboard Input: Next, you need to detect when specific keys are pressed and trigger the corresponding function. - Use `document.addEventListener` to listen for `keydown` events. -- Inside the event listener, use multiple `if` statements to check which `key` was `pressed`. +- Inside the event listener, use multiple `if` statements to check which `key` is `pressed`. - Depending on the `key` pressed, call the appropriate `function` and pass the `robot's class` as an `argument`. _Code example:_ @@ -389,7 +389,7 @@ document.addEventListener("keydown", function (event) { }); ``` -- You should decide with your team mates the keys that will trigger each robot of yours! +- You should decide with your teammates the keys that will trigger each of your robots! **`Prompt Example:`** @@ -400,7 +400,7 @@ document.addEventListener("keydown", function (event) { - Ensure that all robots are displayed correctly in the gallery. -- Make sure all files (robots-harmony.html, robots-harmony.css, robots-harmony.js) are in the same folder submitted to your `Gitea`. +- Make sure all files (robots-harmony.html, robots-harmony.css, robots-harmony.js) are in the same folder submitted in the repository of your `Gitea` account. - Double-check the code to ensure everything is clean and well-organized. From 907d64c6a79f535a078e9922c15312c3c7c842a0 Mon Sep 17 00:00:00 2001 From: Toussaint Louis <66522867+lotoussa@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:12:16 +0200 Subject: [PATCH 11/31] [update] AI.GO first-hello video link --- subjects/AI.GO/first-hello/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/first-hello/README.md b/subjects/AI.GO/first-hello/README.md index 5df4169a00..35c9d896f1 100644 --- a/subjects/AI.GO/first-hello/README.md +++ b/subjects/AI.GO/first-hello/README.md @@ -86,7 +86,7 @@ const handleSpeakClick = (event) => { ### Expected result -You can see an example of the expected result [here](https://youtu.be/At4BhyzMxzw) +You can see an example of the expected result [here](https://youtu.be/PuyEdAA0wy4) **`Prompt Example:`** From e5e7e342625bcbf02e5fa8ed1efad985e6d99d68 Mon Sep 17 00:00:00 2001 From: Toussaint Louis <66522867+lotoussa@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:10:49 +0200 Subject: [PATCH 12/31] [update] AI.GO first-wink video link --- subjects/AI.GO/first-wink/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/first-wink/README.md b/subjects/AI.GO/first-wink/README.md index a706bcfab6..8783d5a0f2 100644 --- a/subjects/AI.GO/first-wink/README.md +++ b/subjects/AI.GO/first-wink/README.md @@ -106,7 +106,7 @@ button.addEventListener('click', handleClick) ### Expected result -You can see an example of the expected result [here](https://youtu.be/wuYTorfBViE) +You can see an example of the expected result [here](https://youtu.be/IQ6-3X3JBss) **`Prompt Examples:`** From c1faa65e9149367b67d764a276d7e140f26350ac Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:05:26 +0100 Subject: [PATCH 13/31] Chore(AI): Fix subjects structure and issue with emotions detector --- subjects/ai/backtesting-sp500/README.md | 148 +++++++++++++----- subjects/ai/backtesting-sp500/audit/README.md | 6 +- subjects/ai/credit-scoring/README.md | 47 ++++-- subjects/ai/credit-scoring/audit/README.md | 12 +- subjects/ai/credit-scoring/readme_data.md | 9 +- subjects/ai/emotions-detector/README.md | 32 ++-- subjects/ai/emotions-detector/audit/README.md | 4 +- subjects/ai/kaggle-titanic/README.md | 81 +++++----- subjects/ai/kaggle-titanic/audit/README.md | 2 +- subjects/ai/nlp-scraper/README.md | 38 +++-- subjects/ai/nlp-scraper/audit/README.md | 2 +- subjects/ai/sp500-strategies/README.md | 29 ++-- subjects/ai/sp500-strategies/audit/README.md | 2 +- 13 files changed, 275 insertions(+), 137 deletions(-) diff --git a/subjects/ai/backtesting-sp500/README.md b/subjects/ai/backtesting-sp500/README.md index 54fca3fb91..b9c59167d3 100644 --- a/subjects/ai/backtesting-sp500/README.md +++ b/subjects/ai/backtesting-sp500/README.md @@ -1,10 +1,31 @@ -# Backtesting on the SP500 +## Backtesting-SP500 -## SP500 data preprocessing +### Overview The goal of this project is to perform a Backtest on the SP500 constituents, which represents the 500 largest companies by market capitalization in the United States. -## Data +### Role Play + +You are a quantitative analyst at a prestigious hedge fund. Your manager has tasked you with developing and backtesting a stock-picking strategy using historical data from the S&P 500 index. The goal is to create a strategy that outperforms the market benchmark. You'll need to clean and preprocess messy financial data, develop a signal for stock selection, implement a backtesting framework, and present your findings to the investment committee. + +### Learning Objectives + +By the end of this project, you will be able to: + +1. Optimize data types in large datasets to improve memory efficiency +2. Perform exploratory data analysis on financial time series data +3. Identify and handle outliers and missing values in stock price data +4. Preprocess financial data, including resampling and calculating returns +5. Develop a simple stock selection signal based on historical performance +6. Implement a backtesting framework for evaluating trading strategies +7. Compare the performance of a custom strategy against a market benchmark +8. Visualize financial performance data using appropriate charts and graphs +9. Write modular, reusable code for financial data analysis and strategy testing +10. Interpret and communicate the results of a quantitative trading strategy + +### Instructions + +#### Data The input files are: @@ -24,42 +45,15 @@ _Note: The quality of this data set is not good: some prices are wrong, there ar _Note: The corrections will not fix the data, as a result the results may be abnormal compared to results from cleaned financial data. That's not a problem for this small project !_ -## Problem +#### Problem Once preprocessed this data, it will be used to generate a signal that is, for each asset at each date a metric that indicates if the asset price will increase the next month. At each date (once a month) we will take the 20 highest metrics and invest $1 per company. This strategy is called **stock picking**. It consists in picking stock in an index and try to over perform the index. Finally, we will compare the performance of our strategy compared to the benchmark: the SP500 It is important to understand that the SP500 components change over time. The reason is simple: Facebook entered the SP500 in 2013 thus meaning that another company had to be removed from the 500 companies. -The structure of the project is: - -```console -project -│ README.md -│ environment.yml -│ -└───data -│ │ sp500.csv -│ | prices.csv -│ -└───notebook -│ │ analysis.ipynb -| -|───scripts -| │ memory_reducer.py -| │ preprocessing.py -| │ create_signal.py -| | backtester.py -│ | main.py -│ -└───results - │ plots - │ results.txt - │ outliers.txt -``` - There are four parts: -## 1. Preliminary +#### 1. Preliminary - Create a function that takes as input one CSV data file. This function should optimize the types to reduce its size and returns a memory optimized DataFrame. - For `float` data the smaller data type used is `np.float32` @@ -71,7 +65,7 @@ There are four parts: 4. Find the min and the max value 5. Determine and apply the smallest datatype that can fit the range of values -## 2. Data wrangling and preprocessing +#### 2. Data wrangling and preprocessing - Create a Jupyter Notebook to analyze the data sets and perform EDA (Exploratory Data Analysis). This notebook should contain at least: @@ -112,7 +106,7 @@ At this stage the DataFrame should look like this: - Resample data on month and keep the last value - Compute historical monthly returns on the adjusted close -## 3. Create signal +#### 3. Create signal At this stage we have a data set with features that we will leverage to get an investment signal. As previously said, we will focus on one single variable to create the signal: **monthly_past_return**. The signal will be the average of monthly returns of the previous year @@ -121,7 +115,7 @@ The naive assumption made here is that if a stock has performed well the last ye - Create a column `average_return_1y` - Create a column named `signal` that contains `True` if `average_return_1y` is among the 20 highest in the month `average_return_1y`. -## 4. Backtester +#### 4. Backtester At this stage we have an investment signal that indicates each month what are the 20 companies we should invest 1$ on (1$ each). In order to check the strategies and performance we will backtest our investment signal. @@ -135,9 +129,9 @@ A data point (x-axis: date, y-axis: cumulated_return) is: the **cumulated return ![alt text][performance] -[performance]: images/w1_weekend_plot_pnl.png 'Cumulative Performance' +[performance]: images/w1_weekend_plot_pnl.png "Cumulative Performance" -## 5. Main +#### 5. Main Here is a sketch of `main.py`. @@ -158,3 +152,83 @@ backtest(prices, sp500) ``` **The command `python main.py` executes the code from data imports to the backtest and save the results.** + +### Project repository structure: + +```console +project +│ README.md +│ requirements.txt +│ +└───data +│ │ sp500.csv +│ | prices.csv +│ +└───notebook +│ │ analysis.ipynb +| +|───scripts +| │ memory_reducer.py +| │ preprocessing.py +| │ create_signal.py +| | backtester.py +│ | main.py +│ +└───results + │ plots + │ results.txt + │ outliers.txt +``` + +### Tips: + +1. Data Quality Management: + + - Be prepared to encounter messy data. Financial datasets often contain errors, outliers, and missing values. + - Develop a systematic approach to identify and handle data quality issues. + +2. Memory Optimization: + + - When working with large datasets, optimize memory usage by selecting appropriate data types for each column. + - Consider using smaller data types like np.float32 for floating-point numbers when precision allows. + +3. Exploratory Data Analysis: + + - Spend time understanding the data through visualization and statistical analysis before diving into strategy development. + - Pay special attention to outliers and their potential impact on your strategy. + +4. Preprocessing Financial Data: + + - When resampling time series data, be mindful of which value to keep (e.g., last value for month-end prices). + - Calculate both historical and future returns to avoid look-ahead bias in your strategy. + +5. Handling Outliers: + + - Develop a method to identify and handle outliers that is specific to each company's historical data. + - Be cautious about removing outliers during periods of high market volatility (e.g., 2008-2009 financial crisis). + +6. Signal Creation: + + - Start with a simple signal (like past 12-month average returns) before exploring more complex strategies. + - Ensure your signal doesn't use future information that wouldn't have been available at the time of decision. + +7. Backtesting: + + - Implement your backtesting logic without using loops for better performance. + - Compare your strategy's performance against a relevant benchmark (in this case, the S&P 500). + +8. Visualization: + + - Create clear, informative visualizations to communicate your strategy's performance. + - Include cumulative return plots to show how your strategy performs over time compared to the benchmark. + +9. Code Structure: + + - Organize your code into modular functions for better readability and reusability. + - Use a main script to orchestrate the entire process from data loading to results visualization. + +10. Results Interpretation: + - Don't just focus on total returns. Consider other metrics like risk-adjusted returns, maximum drawdown, etc. + - Be prepared to explain any anomalies or unexpected results in your strategy's performance. + +Remember, the goal is not just to create a strategy that looks good on paper, but to develop a robust process for analyzing financial data and testing investment ideas. diff --git a/subjects/ai/backtesting-sp500/audit/README.md b/subjects/ai/backtesting-sp500/audit/README.md index fdf200d933..3f09f13898 100644 --- a/subjects/ai/backtesting-sp500/audit/README.md +++ b/subjects/ai/backtesting-sp500/audit/README.md @@ -5,7 +5,7 @@ ``` project │ README.md -│ environment.yml +│ requirements.txt │ └───data │ │ sp500.csv @@ -30,7 +30,7 @@ project ###### Does the readme file contain a description of the project, explain how to run the code from an empty environment, give a summary of the implementation of each python file and contain a conclusion that gives the performance of the strategy? -###### Does the environment contain all libraries used and their versions that are necessary to run the code? +###### Does the requirements contain all libraries used and their versions that are necessary to run the code? ###### Does the notebook contain a missing values analysis? **Example**: number of missing values per variables or per year @@ -107,7 +107,7 @@ Best practice: ![alt text][performance] -[performance]: ../images/w1_weekend_plot_pnl.png 'Cumulative Performance' +[performance]: ../images/w1_weekend_plot_pnl.png "Cumulative Performance" ##### 5. main.py diff --git a/subjects/ai/credit-scoring/README.md b/subjects/ai/credit-scoring/README.md index d74008b311..66a7f65c66 100644 --- a/subjects/ai/credit-scoring/README.md +++ b/subjects/ai/credit-scoring/README.md @@ -1,16 +1,24 @@ ## Credit scoring +### Overview + The goal of this project is to implement a scoring model based on various source of data ([check data documentation](./readme_data.md)) that returns the probability of default. In a nutshell, credit scoring represents an evaluation of how well the bank's customer can pay and is willing to pay off debt. It is also required that you provide an explanation of the score. For example, your model returns that the probability that one client doesn't pay back the loan is very high (90%). The reason behind is that variable_xxx which represents the ability to pay back the past loan is low. The output interpretability will appear in a visualization. -The ability to understand the underlying factors of credit scoring is important. Credit scoring is subject to more and more regulation, so transparency is key. And more generally, more and more companies prefer transparency to black box models. +### Role play -### Resources +Hey there, future credit scoring expert! Ready to dive into the exciting world of predicting loan defaults? You're in for a treat! This project is all about building a nifty model that can help figure out how likely someone is to pay back their loan. Cool, right? + +### Learning Objective + +The ability to understand the underlying factors of credit scoring is important. Credit scoring is subject to more and more regulation, so transparency is key. And more generally, more and more companies prefer transparency to black box models. Historical timeline of machine learning techniques applied to credit scoring - [Machine Learning or Econometrics for Credit Scoring: Let’s Get the Best of Both Worlds](https://hal.archives-ouvertes.fr/hal-02507499v3/document) -### Scoring model +### Instructions + +#### Scoring model There are 3 expected deliverables associated with the scoring model: @@ -18,21 +26,28 @@ There are 3 expected deliverables associated with the scoring model: - The trained machine learning model with the features engineering pipeline: - Do not forget: **Coming up with features is difficult, time-consuming, requires expert knowledge. ‘Applied machine learning’ is basically feature engineering.** - - The model is validated if the **AUC on the test set is higher than 75%**. + - The model is validated if the **AUC on the test set is higher than 50%**. - The labelled test data is not publicly available. However, a Kaggle competition uses the same data. The procedure to evaluate test set submission is the same as the one used for the project 1. + - Here are the [DataSets](https://assets.01-edu.org/ai-branch/project5/home-credit-default-risk.zip). + +- A report on model training and evaluation: + + - Include learning curves (training and validation scores vs. training set size or epochs) to demonstrate that the model is not overfitting. + - Explain the measures taken to prevent overfitting, such as early stopping or regularization techniques. + - Justify your choice of when to stop training based on the learning curves. -### Kaggle submission +#### Kaggle submission The way the Kaggle platform works is explained in the challenge overview page. If you need more details, I suggest [this resource](https://towardsdatascience.com/getting-started-with-kaggle-f9138b35ae18) that gives detailed explanations. - Create a username following that structure: username*01EDU* location_MM_YYYY. Submit the description profile and push it on the Git platform the first day of the week. Do not touch this file anymore. -- A text document that describes the methodology used to train the machine learning model: +- A text document `model_report.txt` that describes the methodology used to train the machine learning model : - Algorithm - Why the accuracy shouldn't be used in that case? - Limit and possible improvements -### Model interpretability +#### Model interpretability This part hasn't been covered during the piscine. Take the time to understand this key concept. There are different level of transparency: @@ -55,16 +70,16 @@ Choose the 3 clients of your choice, compute the score, run the visualizations o - 1 on which the model is correct and the other on which the model is wrong. Try to understand why the model got wrong on this client. - Take 1 client from the test set -### Optional +#### Bonus Implement a dashboard (using [Dash](https://dash.plotly.com/)) that takes as input the customer id and that returns the score and the required visualizations. -### Deliverables +### Project repository structure: ``` project │ README.md -│ environment.yml +│ requirements.txt │ └───data │ │ ... @@ -93,17 +108,17 @@ project │ │ preprocess.py ``` -- `README.md` introduces the project and shows the username. -- `environment.yml` contains all libraries required to run the code. +- `README.md` introduces the project, how to run the code, and shows the username. +- `requirements.txt` contains all libraries required to run the code. - `username.txt` contains the username, the last modified date of the file **has to correspond to the first day of the project**. - `EDA.ipynb` contains the exploratory data analysis. This file should contain all steps of data analysis that contributed or not to improve the score of the model. It has to be commented so that the reviewer can understand the analysis and run it without any problem. - `scripts` contains python file(s) that perform(s) the feature engineering, the model's training and prediction on the test set. It could also be one single Jupyter Notebook. It has to be commented to help the reviewers understand the approach and run the code without any bugs. -### Useful resources +### Tips -- [Interpreting machine learning models](https://towardsdatascience.com/interpretability-in-machine-learning-70c30694a05f) +Remember, creating a great credit scoring model is like baking a perfect cake - it takes the right ingredients, careful preparation, and a dash of creativity. You've got this! -### Files needed for this project +### Resources -[Files](https://assets.01-edu.org/ai-branch/project5/home-credit-default-risk.zip) +- [Interpreting machine learning models](https://towardsdatascience.com/interpretability-in-machine-learning-70c30694a05f) diff --git a/subjects/ai/credit-scoring/audit/README.md b/subjects/ai/credit-scoring/audit/README.md index 0c363cdd8e..1cceee5363 100644 --- a/subjects/ai/credit-scoring/audit/README.md +++ b/subjects/ai/credit-scoring/audit/README.md @@ -5,7 +5,7 @@ ``` project │ README.md -│ environment.yml +│ requirements.txt │ └───data │ │ ... @@ -38,7 +38,7 @@ project ###### Does the readme file introduce the project, summarize how to run the code and show the username? -###### Does the environment contain all libraries used and the versions that are necessary to run the code? +###### Does the requirements contain all libraries used and the versions that are necessary to run the code? ###### Does the `EDA.ipynb` explain in details the exploratory data analysis? @@ -46,7 +46,7 @@ project ###### Is the model trained only the training set? -###### Is the AUC on the test set higher than 75%? +###### Is the AUC on the test set higher than 50%? ###### Does the model learning curves prove that the model is not overfitting? @@ -59,7 +59,7 @@ project ```prompt python predict.py - AUC on test set: 0.76 + AUC on test set: 0.50 ``` @@ -75,11 +75,13 @@ This [article](https://medium.com/thecyphy/home-credit-default-risk-part-2-84b58 ### Descriptive variables: -###### These are important to understand for example the age of the client. If the data could be scaled or modified in the preprocessing pipeline but the data visualised here should be "raw". Are the visualisations computed for the 3 clients? +##### These are important to understand for example the age of the client. If the data could be scaled or modified in the preprocessing pipeline but the data visualized here should be "raw". - Visualisations that show at least 10 variables describing the client and its loan(s). - Visualisations that show the comparison between this client and other clients. +###### Are the visualisations computed for the 3 clients? + ##### SHAP values on the model are displayed through a summary plot that shows the important features and their impact on the target. This is optional if you have already computed the features importance. ###### Are the 3 clients selected as expected? 2 clients from the train set (1 on which the model is correct and 1 on which the model's wrong) and 1 client from the test set. diff --git a/subjects/ai/credit-scoring/readme_data.md b/subjects/ai/credit-scoring/readme_data.md index 12aa9509ca..8682b10e39 100644 --- a/subjects/ai/credit-scoring/readme_data.md +++ b/subjects/ai/credit-scoring/readme_data.md @@ -4,7 +4,7 @@ This file describes the available data for the project. ![alt data description](data_description.png "Credit scoring data description") -## application_{train|test}.csv +## application\_{train|test}.csv This is the main table, broken into two files for Train (with TARGET) and Test (without TARGET). Static data for all applications. One row represents one loan in our data sample. @@ -17,24 +17,23 @@ For every loan in our sample, there are as many rows as number of credits the cl ## bureau_balance.csv Monthly balances of previous credits in Credit Bureau. -This table has one row for each month of history of every previous credit reported to Credit Bureau – i.e the table has (#loans in sample * # of relative previous credits * # of months where we have some history observable for the previous credits) rows. +This table has one row for each month of history of every previous credit reported to Credit Bureau – i.e the table has (#loans in sample _ # of relative previous credits _ # of months where we have some history observable for the previous credits) rows. ## POS_CASH_balance.csv Monthly balance snapshots of previous POS (point of sales) and cash loans that the applicant had with Home Credit. -This table has one row for each month of history of every previous credit in Home Credit (consumer credit and cash loans) related to loans in our sample – i.e. the table has (#loans in sample * # of relative previous credits * # of months in which we have some history observable for the previous credits) rows. +This table has one row for each month of history of every previous credit in Home Credit (consumer credit and cash loans) related to loans in our sample – i.e. the table has (#loans in sample _ # of relative previous credits _ # of months in which we have some history observable for the previous credits) rows. ## credit_card_balance.csv Monthly balance snapshots of previous credit cards that the applicant has with Home Credit. -This table has one row for each month of history of every previous credit in Home Credit (consumer credit and cash loans) related to loans in our sample – i.e. the table has (#loans in sample * # of relative previous credit cards * # of months where we have some history observable for the previous credit card) rows. +This table has one row for each month of history of every previous credit in Home Credit (consumer credit and cash loans) related to loans in our sample – i.e. the table has (#loans in sample _ # of relative previous credit cards _ # of months where we have some history observable for the previous credit card) rows. ## previous_application.csv All previous applications for Home Credit loans of clients who have loans in our sample. There is one row for each previous application related to loans in our data sample. - ## installments_payments.csv Repayment history for the previously disbursed credits in Home Credit related to the loans in our sample. diff --git a/subjects/ai/emotions-detector/README.md b/subjects/ai/emotions-detector/README.md index a0bd998395..4d3e311361 100644 --- a/subjects/ai/emotions-detector/README.md +++ b/subjects/ai/emotions-detector/README.md @@ -1,10 +1,18 @@ -## Emotions detection with Deep Learning +## Emotion detector + +### Overview Cameras are everywhere. Videos and images have become one of the most interesting data sets for artificial intelligence. Image processing is a quite broad research area, not just filtering, compression, and enhancement. Besides, we are even interested in the question, “what is in images?”, i.e., content analysis of visual inputs, which is part of the main task of computer vision. +### Role play + +you're going to train a computer to be like a mind reader, but instead of reading thoughts, it's reading emotions! You'll be working with a bunch of pictures of faces, teaching your AI to tell the difference between a big grin and a grumpy frown, or a surprised gasp and a fearful wide-eyed look. + +### Learning Objective + The study of computer vision could make possible such tasks as 3D reconstruction of scenes, motion capturing, and object recognition, which are crucial for even higher-level intelligence such as image and video understanding, and motion understanding. For this project we will focus on two tasks: @@ -18,7 +26,9 @@ With the computing power exponentially increasing the computer vision field has - The history behind this field is fascinating! [Here](https://kapernikov.com/basic-introduction-to-computer-vision/) is a short summary of its history. -### Project goal and suggested timeline +### Instructions + +#### Project goal: The goal of the project is to implement a **system that detects the emotion on a face from a webcam video stream**. To achieve this exciting task you'll have to understand how to: @@ -32,7 +42,7 @@ Then starts the emotion detection in a webcam video stream step that will last u The two steps are detailed below. -### Preliminary: +#### Preliminary: - Take [this course](https://www.coursera.org/learn/convolutional-neural-networks). This course is a reference for many reasons and one of them is the creator: **Andrew Ng**. He explains the basics of CNNs but also some more advanced topics as transfer learning, siamese networks etc ... - I suggest to focus on Week 1 and 2 and to spend less time on Week 3 and 4. Don't worry the time scoping of such MOOCs are conservative. You can attend the lessons for free! @@ -41,7 +51,7 @@ The two steps are detailed below. - Start first with a logistic regression to understand how to handle images in Python. And then train your first CNN on this data set. -### Face emotions classification +#### Face emotions classification Emotion detection is one of the most researched topics in the modern-day machine learning arena. The ability to accurately detect and identify an emotion opens up numerous doors for Advanced Human Computer Interaction. The aim of this project is to detect up to seven distinct facial emotions in real time. @@ -57,7 +67,7 @@ Your goal is to implement a program that takes as input a video stream that cont This dataset was provided for this past [Kaggle challenge](https://www.kaggle.com/competitions/challenges-in-representation-learning-facial-expression-recognition-challenge/overview). It is possible to find more information about on the challenge page. Train a CNN on the dataset `train.csv`. Here is an [example of architecture](https://www.quora.com/What-is-the-VGG-neural-network) you can implement. **The CNN has to perform more than 60% on the test set**. You can use the `test_with_emotions.csv` file for this. You will see that the CNNs take a lot of time to train. - You don't want to overfit the neural network. I strongly suggest to use early stopping, callbacks and to monitor the training using the `TensorBoard`. + You don't want to overfit the neural network. I strongly suggest to use early stopping, callbacks and to monitor the training using the `TensorBoard` 'note: Integrating TensorBoard is not optional'. You have to save the trained model in `final_emotion_model.keras` and to explain the chosen architecture in `final_emotion_model_arch.txt`. Use `model.summary())` to print the architecture. It is also expected that you explain the iterations and how you end up choosing your final architecture. Save a screenshot of the `TensorBoard` while the model's training in `tensorboard.png` and save a plot with the learning curves showing the model training and stopping BEFORE the model starts overfitting in `learning_curves.png`. @@ -82,7 +92,7 @@ For that step, I suggest again to use **OpenCV** as much as possible. This link - Optional: **(very cool)** Hack the CNN. Take a picture for which the prediction of your CNN is **Happy**. Now, hack the CNN: using the same image **SLIGHTLY** modified make the CNN predict **Sad**. You can find an example on how to achieve this in [this article](https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196) -### Deliverable +### Project repository structure: ``` project @@ -90,7 +100,7 @@ project │   ├── test.csv │   ├── train.csv │   └── xxx.csv -├── environment.yml +├── requirements.txt ├── README.md ├── results │   ├── model @@ -148,7 +158,11 @@ Preprocessing ... ``` -### Useful resources: +### Tips + +Balance technical prowess with psychological insight: as you fine-tune your CNN and optimize your video processing, remember that understanding the nuances of human facial expressions is key to creating a truly effective emotion detection system. + +### Resources - https://machinelearningmastery.com/what-is-computer-vision/ @@ -156,6 +170,4 @@ Preprocessing ... - Hack the CNN https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196 -- http://ice.dlut.edu.cn/valse2018/ppt/WeihongDeng_VALSE2018.pdf - - https://arxiv.org/pdf/1812.06387.pdf diff --git a/subjects/ai/emotions-detector/audit/README.md b/subjects/ai/emotions-detector/audit/README.md index fe2a21df07..3fb9a78676 100644 --- a/subjects/ai/emotions-detector/audit/README.md +++ b/subjects/ai/emotions-detector/audit/README.md @@ -1,4 +1,4 @@ -#### Computer vision +#### Emotion detector ##### Preliminary @@ -14,7 +14,7 @@ ###### Is the model trained only the training set? -###### Is the accuracy on the test set higher than 70%? +###### Is the accuracy on the test set higher than 60%? ###### Do the learning curves prove that the model is not overfitting? diff --git a/subjects/ai/kaggle-titanic/README.md b/subjects/ai/kaggle-titanic/README.md index 0f31e79a72..2d931512c8 100644 --- a/subjects/ai/kaggle-titanic/README.md +++ b/subjects/ai/kaggle-titanic/README.md @@ -1,6 +1,6 @@ -# Your first Kaggle: Titanic +## Kaggle Titanic -### Introduction +### Overview The goal of this **1 week** project is to get the highest possible score on a Data Science competition. More precisely you will have to predict who survived the Titanic crash. @@ -8,11 +8,11 @@ The goal of this **1 week** project is to get the highest possible score on a Da [titanic]: titanic.jpg "Titanic" -### Kaggle +#### Kaggle Kaggle is an online community of data scientists and machine learning practitioners. Kaggle allows users to find and publish data sets, explore and build models in a web-based data-science environment, work with other data scientists and machine learning engineers, and enter competitions to solve data science challenges. It’s a crowd-sourced platform to attract, nurture, train and challenge data scientists from all around the world to solve data science, machine learning and predictive analytics problems. -### Titanic - Machine Learning from Disaster +#### Titanic - Machine Learning from Disaster One of the first Kaggle competition I did was: Titanic - Machine Learning from Disaster. This is a not-to-be-missed Kaggle competition. @@ -22,17 +22,54 @@ The sinking of the Titanic is one of the most infamous shipwrecks in history. On While there was some element of luck involved in surviving, it seems some groups of people were more likely to survive than others. +### Role play + +Ahoy, data explorer! Ready to set sail on the most thrilling voyage of your data science career? Welcome aboard the Kaggle Titanic challenge! You're about to embark on a journey through time, back to that fateful night in 1912. +Your mission, should you choose to accept it (and let's face it, you're already hooked), is to dive deep into the passenger manifest and uncover the secrets of survival. Who lived? Who perished? And most importantly, can you build a model that predicts it all? + +### Learning Objective + In this challenge, you have to build a predictive model that answers the question: **“what sorts of people were more likely to survive?”** using passenger data (ie name, age, gender, socio-economic class, etc). **You will have to submit your prediction on Kaggle**. -### Preliminary +### Instructions + +#### Preliminary -The way the Kaggle platform works is explained in the challenge overview page. If you need more details, I suggest this [resource](https://towardsdatascience.com/getting-started-with-kaggle-f9138b35ae18) that gives detailed explanations. +The way the Kaggle platform works is explained in the challenge overview page. If you need more details, I suggest this [resource](https://www.kaggle.com/code/alexisbcook/getting-started-with-kaggle) that gives detailed explanations. - Create a username following this structure: username*01EDU* location_MM_YYYY. Submit the description profile and push it on GitHub the first day of the week. Do not touch this file anymore. - It is possible to have different personal accounts merged in a team for one single competition. -### Deliverables +#### Scores + +In order to validate the project you will have to score at least **79% accuracy on the Leaderboard**: + +- 78.9% accuracy is the minimum score to validate the project. + +Scores indication: + +- 78.9% difficult - minimum required +- 80% very difficult: smart feature engineering needed +- More than 83%: excellent that corresponds to the top 2% on Kaggle +- More than 85%: cheating + +#### Cheating + +It is impossible to get 100%. Who would have predicted that Rose wouldn't let [Jack on the door](https://www.reddit.com/r/titanic/comments/14i0v5j/for_all_the_newbies_proof_its_not_a_door/?rdt=35268) ? + +All people having 100% of accuracy on the Leaderboard cheated, there's no point to compare with them or to cheat. The Kaggle community estimates that having more than 85% is almost considered as cheated submissions as they are element of luck involved in the surviving. + +**You can't use external data sets than the ones provided in that competition.** + +#### The key points + +- **Feature engineering**: + Put yourself in the shoes of an investigator trying to understand what happened exactly in that boat during the crash. Do not hesitate to watch the movie to try to find as many insights as possible. Without a smart the feature engineering there's no way to validate the project ;-) + +- The leaderboard evaluates on test data for which you don't have the labels. It means that there's no point to over fit the train set. Check the over fitting on the train set by dividing the data and by cross-validating the accuracy. + +### Project repository structure ```console project @@ -60,35 +97,7 @@ project - `main.ipynb` This file (single Jupyter Notebook) should contain all steps of data analysis that contributed or not to improve the accuracy, the feature engineering, the model's training and prediction on the test set. It has to be commented to help the reviewers understand the approach and run the code without any bugs. - **Submit your predictions on the Kaggle's competition platform**. Check your ranking and score in the leaderboard. -### Scores - -In order to validate the project you will have to score at least **79% accuracy on the Leaderboard**: - -- 78.9% accuracy is the minimum score to validate the project. - -Scores indication: - -- 78.9% difficult - minimum required -- 80% very difficult: smart feature engineering needed -- More than 83%: excellent that corresponds to the top 2% on Kaggle -- More than 85%: cheating - -#### Cheating - -It is impossible to get 100%. Who would have predicted that Rose wouldn't let [Jack on the door](https://www.insider.com/jack-and-rose-werent-on-a-door-in-titanic-2019-7) ? - -All people having 100% of accuracy on the Leaderboard cheated, there's no point to compare with them or to cheat. The Kaggle community estimates that having more than 85% is almost considered as cheated submissions as they are element of luck involved in the surviving. - -**You can't use external data sets than the ones provided in that competition.** - -### The key points - -- **Feature engineering**: - Put yourself in the shoes of an investigator trying to understand what happened exactly in that boat during the crash. Do not hesitate to watch the movie to try to find as many insights as possible. Without a smart the feature engineering there's no way to validate the project ;-) - -- The leaderboard evaluates on test data for which you don't have the labels. It means that there's no point to over fit the train set. Check the over fitting on the train set by dividing the data and by cross-validating the accuracy. - -### Advice +### Tips Don't try to build the perfect model the first day. Iterate a lot and test your assumptions: diff --git a/subjects/ai/kaggle-titanic/audit/README.md b/subjects/ai/kaggle-titanic/audit/README.md index 78dda58e15..43f81ce052 100644 --- a/subjects/ai/kaggle-titanic/audit/README.md +++ b/subjects/ai/kaggle-titanic/audit/README.md @@ -1,4 +1,4 @@ -#### First Kaggle: Titanic +#### Kaggle Titanic ##### Preliminary diff --git a/subjects/ai/nlp-scraper/README.md b/subjects/ai/nlp-scraper/README.md index b7c1741fc4..69545a6bfc 100644 --- a/subjects/ai/nlp-scraper/README.md +++ b/subjects/ai/nlp-scraper/README.md @@ -1,4 +1,4 @@ -## NLP-enriched News Intelligence platform +## NLP Scraper The goal of this project is to build an NLP-enriched News Intelligence platform. News analysis is a trending and important topic. The analysts get @@ -10,7 +10,25 @@ The platform connects to a news data source, detects the entities, detects the topic of the article, analyses the sentiment and performs a scandal detection analysis. -### Scraper +### Role Play + +You're a Natural Language Processing (NLP) specialist at a tech startup developing a sentiment analysis tool for social media posts. Your task is to build the preprocessing pipeline and create a bag-of-words representation for tweet analysis. + +### Learning Objectives + +1. Set up an NLP-focused Python environment +2. Implement basic text preprocessing techniques (lowercase, punctuation removal) +3. Perform text tokenization at sentence and word levels +4. Remove stop words from text data +5. Apply stemming to reduce words to their root forms +6. Create a complete text preprocessing pipeline +7. Implement a bag-of-words model using CountVectorizer +8. Analyze word frequency in a corpus of tweets +9. Prepare a labeled dataset for sentiment analysis + +### Instructions + +#### Scraper News data source: @@ -29,7 +47,7 @@ Use data from the last week otherwise the volume may be too high. There should be at least 300 articles stored in your file system or SQL database. -### NLP engine +#### NLP engine In production architectures, the NLP engine delivers a live output based on the news that are delivered in a live stream data by the scraper. However, it @@ -41,7 +59,7 @@ the stored data. Here how the NLP engine should process the news: -#### **1. Entities detection:** +##### **1. Entities detection:** The goal is to detect all the entities in the document (headline and body). The type of entity we focus on is `ORG`. This corresponds to companies and @@ -52,7 +70,7 @@ organizations. This information should be stored. [Named Entity Recognition with NLTK and SpaCy](https://towardsdatascience.com/named-entity-recognition-with-nltk-and-spacy-8c4a7d88e7da) -#### **2. Topic detection:** +##### **2. Topic detection:** The goal is to detect what the article is dealing with: Tech, Sport, Business, Entertainment or Politics. To do so, a labelled dataset is provided: [training @@ -68,7 +86,7 @@ that the model is trained correctly and not overfitted. - Learning constraints: **Score on test: > 95%** -#### **3. Sentiment analysis:** +##### **3. Sentiment analysis:** The goal is to detect the sentiment (positive, negative or neutral) of the news articles. To do so, use a pre-trained sentiment model. I suggest to use: @@ -82,7 +100,7 @@ articles. To do so, use a pre-trained sentiment model. I suggest to use: - [Sentiment analysis](https://en.wikipedia.org/wiki/Sentiment_analysis) -#### **4. Scandal detection** +##### **4. Scandal detection** The goal is to detect environmental disaster for the detected companies. Here is the methodology that should be used: @@ -107,7 +125,7 @@ is the methodology that should be used: - Flag the top 10 articles. -#### 5. **Source analysis (optional)** +##### 5. **Source analysis (optional)** The goal is to show insights about the news' source you scraped. This requires to scrap data on at least 5 days (a week ideally). Save the plots @@ -127,7 +145,7 @@ Here are examples of insights: - Companies mentioned the most - Sentiment per companies -### Deliverables +### Project repository structure: The expected structure of the project is: @@ -212,7 +230,7 @@ python scraper_news.py Environmental scandal detected for ``` -### Notions +### Resources - [Web Scraping](https://www.youtube.com/watch?v=XVv6mJpFOb0) - [Sentiment analysis](https://en.wikipedia.org/wiki/Sentiment_analysis) diff --git a/subjects/ai/nlp-scraper/audit/README.md b/subjects/ai/nlp-scraper/audit/README.md index e38aa81447..225dbeba46 100644 --- a/subjects/ai/nlp-scraper/audit/README.md +++ b/subjects/ai/nlp-scraper/audit/README.md @@ -1,4 +1,4 @@ -#### NLP-enriched News Intelligence platform +#### NLP Scraper ##### Preliminary diff --git a/subjects/ai/sp500-strategies/README.md b/subjects/ai/sp500-strategies/README.md index b7d88c1ab2..71e0767ee1 100644 --- a/subjects/ai/sp500-strategies/README.md +++ b/subjects/ai/sp500-strategies/README.md @@ -1,4 +1,6 @@ -## Financial strategies on the SP500 +## SP500 strategies + +### Overview In this project, you'll apply machine learning to finance. Your goal as a Quant/Data Scientist is to create a financial strategy that uses a signal generated by a machine learning model to outperform the [SP500](https://en.wikipedia.org/wiki/S%26P_500). @@ -6,15 +8,19 @@ The S&P 500 Index is a collection of 500 stocks that represent the overall perfo The S&P 500 started in 1926 with only 90 stocks and has grown to include 500 stocks since 1957. Historically, the average annual return of the S&P 500 has been about 10-11% since 1926, and around 8% since 1957. +### Role play + As a Quantitative Researcher, your challenge is to develop a strategy that can consistently outperform the S&P 500, not just in one year, but over many years. This is a difficult task and is the primary goal of many hedge funds around the world. -The project is divided in parts: +### Learning Objective - **Data processing and feature engineering**: Build a dataset: insightful features and the target - **Machine Learning pipeline**: Train machine learning models on the dataset, select the best model and generate the machine learning signal. - **Strategy backtesting**: Generate a strategy from the Machine Learning model output and backtest the strategy. As a reminder, the idea here is to see what would have performed the strategy if you had invested. -### Data processing and features engineering +### Instructions + +#### Data processing and features engineering The file `HistoricalData.csv` contains the open-high-low-close (OHLC) SP500 index data and the other file, `all_stocks_5yr.csv`, contains the open-high-low-close-volume (OHLCV) data on the SP500 constituents. @@ -42,7 +48,7 @@ We assume it is day `D`, and we want to take a position on the next n days. The > Remark: The target used is the return computed on the price and not the price directly. There are statistical reasons for this choice - the price is not stationary. The consequence is that a machine learning model tends to overfit while training on not stationary data. -### Machine learning pipeline +#### Machine learning pipeline - Cross-validation deliverables: - Implements a cross validation with at least 10 folds. The train set has to be bigger than 2 years history. @@ -80,7 +86,7 @@ Once you'll have run the grid search on the cross validation (choose either Bloc - (optional): [Train an RNN/LSTM](https://towardsdatascience.com/predicting-stock-price-with-lstm-13af86a74944). This is a nice way to discover and learn about recurrent neural networks. But keep in mind that there are some new neural network architectures that seem to outperform recurrent neural networks. Here is an [interesting article](https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0) about the topic. -### Strategy backtesting +#### Strategy backtesting - Backtesting module deliverables. The module takes as input a machine learning signal, convert it into a financial strategy. A financial strategy DataFrame gives the amount invested at time `t` on asset `i`. The module returns the following metrics on the train set and the test set. - Profit and Loss (PnL) plot: save it as `strategy.png` @@ -107,7 +113,7 @@ Once you'll have run the grid search on the cross validation (choose either Bloc - PnL plot - strategy metrics on the train set and test set -### Example of strategies: +#### Example of strategies: - Long only: - Binary signal: @@ -172,7 +178,7 @@ Here's an example on how to convert a machine learning signal into a financial s project ├── data │   └── sp500.csv -├── environment.yml +├── requirements.txt ├── README.md ├── results │   ├── cross-validation @@ -199,7 +205,10 @@ project Note: `features_engineering.py` can be used in `gridsearch.py` -### Files for this project +### Tips + +Remember, the goal of this project is not just to beat the S&P 500 in a backtest, but to learn about the process of developing and testing trading strategies using machine learning techniques. + +### Resources -You can find the data required for this project in this : -[link](https://assets.01-edu.org/ai-branch/project4/project04-20221031T173034Z-001.zip) +You can find the data required for this project in this : [link](https://assets.01-edu.org/ai-branch/project4/project04-20221031T173034Z-001.zip) diff --git a/subjects/ai/sp500-strategies/audit/README.md b/subjects/ai/sp500-strategies/audit/README.md index 5c5b361d45..4994363010 100644 --- a/subjects/ai/sp500-strategies/audit/README.md +++ b/subjects/ai/sp500-strategies/audit/README.md @@ -1,4 +1,4 @@ -#### Financial strategies on the SP500 +#### SP500 strategies ###### Is the structure of the project like the one presented in the `Project repository structure` in the subject? From 41514f2cbf08fca9d0eefc2f84fdbe1aff651d41 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:15:36 +0100 Subject: [PATCH 14/31] Chore(AI): Update accuracy to 78.9% --- subjects/ai/kaggle-titanic/README.md | 2 +- subjects/ai/kaggle-titanic/audit/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subjects/ai/kaggle-titanic/README.md b/subjects/ai/kaggle-titanic/README.md index 2d931512c8..93aeed23f9 100644 --- a/subjects/ai/kaggle-titanic/README.md +++ b/subjects/ai/kaggle-titanic/README.md @@ -43,7 +43,7 @@ The way the Kaggle platform works is explained in the challenge overview page. I #### Scores -In order to validate the project you will have to score at least **79% accuracy on the Leaderboard**: +In order to validate the project you will have to score at least **78.9% accuracy on the Leaderboard**: - 78.9% accuracy is the minimum score to validate the project. diff --git a/subjects/ai/kaggle-titanic/audit/README.md b/subjects/ai/kaggle-titanic/audit/README.md index 43f81ce052..363b2bcad1 100644 --- a/subjects/ai/kaggle-titanic/audit/README.md +++ b/subjects/ai/kaggle-titanic/audit/README.md @@ -43,7 +43,7 @@ project #### Final score -###### Is the accuracy associated with the username in `username.txt` higher than 79%? The best submission score can be accessed from the user profile. +###### Is the accuracy associated with the username in `username.txt` higher than 78.9%? The best submission score can be accessed from the user profile. #### Examples From 231b3f2c429d9c9be2e5806d7a18bd7681179f37 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:17:02 +0100 Subject: [PATCH 15/31] Chore(AI): Change audit title --- subjects/ai/backtesting-sp500/audit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/ai/backtesting-sp500/audit/README.md b/subjects/ai/backtesting-sp500/audit/README.md index 3f09f13898..27ba69dac3 100644 --- a/subjects/ai/backtesting-sp500/audit/README.md +++ b/subjects/ai/backtesting-sp500/audit/README.md @@ -1,4 +1,4 @@ -#### Functional +#### Backtesting-SP500 ###### Is the structure of the project as below? From da46bf9359de30bf41a918eb91a5a42770990d79 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:48:14 +0100 Subject: [PATCH 16/31] Chore(AI): fix problems of accuracy --- subjects/ai/credit-scoring/README.md | 2 +- subjects/ai/credit-scoring/audit/README.md | 4 ++-- subjects/ai/emotions-detector/README.md | 8 ++++---- subjects/ai/kaggle-titanic/README.md | 4 ++-- subjects/ai/nlp-scraper/README.md | 1 + 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/subjects/ai/credit-scoring/README.md b/subjects/ai/credit-scoring/README.md index 66a7f65c66..3ed8741a7a 100644 --- a/subjects/ai/credit-scoring/README.md +++ b/subjects/ai/credit-scoring/README.md @@ -26,7 +26,7 @@ There are 3 expected deliverables associated with the scoring model: - The trained machine learning model with the features engineering pipeline: - Do not forget: **Coming up with features is difficult, time-consuming, requires expert knowledge. ‘Applied machine learning’ is basically feature engineering.** - - The model is validated if the **AUC on the test set is higher than 50%**. + - The model is validated if the **AUC on the test set is at minimum 55%, ideally to 62% included (or in best cases higher than 62% if you can !)**. - The labelled test data is not publicly available. However, a Kaggle competition uses the same data. The procedure to evaluate test set submission is the same as the one used for the project 1. - Here are the [DataSets](https://assets.01-edu.org/ai-branch/project5/home-credit-default-risk.zip). diff --git a/subjects/ai/credit-scoring/audit/README.md b/subjects/ai/credit-scoring/audit/README.md index 1cceee5363..7eba4ec1fa 100644 --- a/subjects/ai/credit-scoring/audit/README.md +++ b/subjects/ai/credit-scoring/audit/README.md @@ -46,7 +46,7 @@ project ###### Is the model trained only the training set? -###### Is the AUC on the test set higher than 50%? +###### Is the AUC on the test set is between 55% (included) to 62%(included) or higher than 62%? ###### Does the model learning curves prove that the model is not overfitting? @@ -59,7 +59,7 @@ project ```prompt python predict.py - AUC on test set: 0.50 + AUC on test set: 0.62 ``` diff --git a/subjects/ai/emotions-detector/README.md b/subjects/ai/emotions-detector/README.md index 4d3e311361..f95b70deee 100644 --- a/subjects/ai/emotions-detector/README.md +++ b/subjects/ai/emotions-detector/README.md @@ -164,10 +164,10 @@ Balance technical prowess with psychological insight: as you fine-tune your CNN ### Resources -- https://machinelearningmastery.com/what-is-computer-vision/ +- [What is computer vision](https://machinelearningmastery.com/what-is-computer-vision/) -- Use a pre-trained CNN: https://arxiv.org/pdf/1812.06387.pdf +- [Use a pre-trained CNN](https://arxiv.org/pdf/1812.06387.pdf) -- Hack the CNN https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196 +- [Hack the CNN](https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196) -- https://arxiv.org/pdf/1812.06387.pdf +- [Convolutional Neural Network](https://arxiv.org/pdf/1812.06387.pdf) diff --git a/subjects/ai/kaggle-titanic/README.md b/subjects/ai/kaggle-titanic/README.md index 93aeed23f9..9e1c8f64ce 100644 --- a/subjects/ai/kaggle-titanic/README.md +++ b/subjects/ai/kaggle-titanic/README.md @@ -74,7 +74,7 @@ All people having 100% of accuracy on the Leaderboard cheated, there's no point ```console project │ README.md -│ environment.yml +│ requirements.txt │ username.txt │ └───data @@ -90,7 +90,7 @@ project - `README.md` introduction of the project, shows the username, describes the features engineering and the best score on the **leaderboard**. Note the score on the test set using the exact same pipeline that led to the best score on the leaderboard. -- `environment.yml` contains all libraries required to run the code. +- 'requirements.txt` contains all libraries required to run the code. - `username.txt` contains the username, the last modified date of the file **has to correspond to the first day of the project**. diff --git a/subjects/ai/nlp-scraper/README.md b/subjects/ai/nlp-scraper/README.md index 69545a6bfc..71209fb802 100644 --- a/subjects/ai/nlp-scraper/README.md +++ b/subjects/ai/nlp-scraper/README.md @@ -155,6 +155,7 @@ project ├── data │   └── ... ├── nlp_enriched_news.py +├── requirements.txt ├── README.md ├── results │   ├── training_model.py From 77e8a5ec49094ab4789e780e4e2fdc0490e71678 Mon Sep 17 00:00:00 2001 From: Toussaint Louis <66522867+lotoussa@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:09:14 +0200 Subject: [PATCH 17/31] [update] AI.GO colorful-arms video link --- subjects/AI.GO/colorful-arms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/colorful-arms/README.md b/subjects/AI.GO/colorful-arms/README.md index 71b0470415..8ecdea5095 100644 --- a/subjects/AI.GO/colorful-arms/README.md +++ b/subjects/AI.GO/colorful-arms/README.md @@ -88,7 +88,7 @@ armColorButton.addEventListener("click", handleChangeArmColor); ### Expected result -You can see an example of the expected result [here](https://youtu.be/KjTBuAmUnk4) +You can see an example of the expected result [here](https://youtu.be/viQymmWw6wo) **`Prompt Example:`** From 08b30de0a7a2e3ac642f9fd5f1fdf251ebda280d Mon Sep 17 00:00:00 2001 From: Toussaint Louis <66522867+lotoussa@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:02:13 +0200 Subject: [PATCH 18/31] [update] AI.GO robots-harmony video link --- subjects/AI.GO/robots-harmony/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/robots-harmony/README.md b/subjects/AI.GO/robots-harmony/README.md index 9a817568ae..2cb408bf0a 100644 --- a/subjects/AI.GO/robots-harmony/README.md +++ b/subjects/AI.GO/robots-harmony/README.md @@ -406,7 +406,7 @@ document.addEventListener("keydown", function (event) { ### Expected Output -Your project needs to check all the previous tasks, it will look something close to (and maybe better than) [this](https://youtu.be/pWD0tbyTyiI). +Your project needs to check all the previous tasks, it will look something close to (and maybe better than) [this](https://youtu.be/drQsUzPeoAQ). ### Bonus part From 0da730f0f127705cefec75c92560d2e5b238b756 Mon Sep 17 00:00:00 2001 From: Toussaint Louis <66522867+lotoussa@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:06:08 +0200 Subject: [PATCH 19/31] [update] AI.GO colorful-legs video link --- subjects/AI.GO/colorful-legs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/colorful-legs/README.md b/subjects/AI.GO/colorful-legs/README.md index 78f9606920..39ef5d8e6d 100644 --- a/subjects/AI.GO/colorful-legs/README.md +++ b/subjects/AI.GO/colorful-legs/README.md @@ -47,7 +47,7 @@ In the JS file, like in the previous exercise, get the following elements: ### Expected result -You can see an example of the expected result [here](https://youtu.be/QQ0GKGuXgBw) +You can see an example of the expected result [here](https://youtu.be/vnzQ0R-Ixl0) **`Prompt Example:`** From 457a2453e1ddcc8ca2bf3d4efee0d2637f077a51 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:05:22 +0100 Subject: [PATCH 20/31] Chore(AI-GO): Fixed the instructions in first wink subject --- subjects/AI.GO/first-wink/README.md | 51 +++++++++++++++++------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/subjects/AI.GO/first-wink/README.md b/subjects/AI.GO/first-wink/README.md index 8783d5a0f2..7858f4de35 100644 --- a/subjects/AI.GO/first-wink/README.md +++ b/subjects/AI.GO/first-wink/README.md @@ -16,7 +16,7 @@ Don't worry if things feel a bit challenging—that's part of the process! Just > We can mention thing you do not know; but by this time, you know what to do! Search for it, ask your peers and use clever prompts ;) -- **You need to continue on the HTML, CSS, JS code you submitted for the exercise `first-move`, but with an empty JavaScript file and do not forget to change the name of the linked files to the name of this exercise!** +- **You need to continue on the HTML, CSS, JS code you submitted for the exercise `first-move`, but with an empty JavaScript file and do not forget to change the name of the linked files to the name of this exercise as well as following the new instructions!** ### Resources @@ -33,12 +33,12 @@ We provide you with some content to get started smoothly, check it out! #### Task 1: -Let's put a button on the top right corner of the page, that will toggle (close or open) the left eye when clicked. +Let's put a button on the top right corner of the page with the `id` of "eye-btn", that will toggle (close or open) the left eye when clicked. Add it in the HTML structure: ```js - + ``` And add the style in the CSS file: @@ -55,18 +55,18 @@ button { #### Task 2: -Select the button in your JavaScript file that will allow the user to control the robot’s left eye. +Select the button in your JavaScript file by its `id`. That will allow the user to control the robot’s left eye. ```js // Select the button element using its ID so we can interact with it in our JavaScript //Example of selecting a button called myButton -const myButton = document.querySelector("button"); +const myButton = document.getElementById("btn-example"); ``` **`Prompt Example:`** -- "How do I use `querySelector` to select an HTML element by its ID?" +- "How do I use `getElementById` to select an HTML element by its ID?" #### Task 3: @@ -74,34 +74,45 @@ Write a function that will be triggered when the button is clicked. This function will make the robot "wink" by toggling the `eye-closed` class on the left eye and change the `button` text based on the current state of the eye. -- It changes the text content of the button: if the eye is open, write "Click to close the left eye", if the eye is closed, write "Click to open the left eye". +1- It changes the text content of the button: if the eye is open, write "Click to close the left eye", if the eye is closed, write "Click to open the left eye". -- It toggles the class eye-closed in the `classList` of the eye-left HTML element. +2- It toggles the class `eye-closed` in the `classList` of the `eye-left` HTML element. -It changes the background color of the eye-left: if the eye is open, to "red", if the eye is closed, to "black" +3- It changes the background color of the `eye-left`: if the eye is open, to "red", if the eye is closed, to "black" + +**Code Example:** ```js -const button = document.querySelector('button') +const button = document.getElementById('eye-btn') const handleClick = (event) => { - // Select the left eye element by its ID - const myDiv = ... + // Select left eye by its ID and assign it to the variable eyeLeft + const eyeLeft = ... - // Check if the eye is currently closed by looking at its background color + // Check if the eye is currently closed by looking at the eyeLeft background color, if it's 'black', that means it's closed. if (...) { - // If the eye is closed, open it and update the button text + /* + - Add to the 'button' element the text: "Click to close the left eye" + - Change the 'eyeLeft' element background color to red + */ } else { - // If the eye is open, close it and update the button text + /* + If the eye is open: + - Add to 'button' element the text: "Click to open the left eye" + - Change the 'eyeLeft' element background color to black + */ } // Toggle the 'eye-closed' class on the 'eye-left' div + eyeLeft.classList.toggle("eye-closed") }; -// register the event: +/* Register the event: + here we ask the button to call our `handleClick` function +on the 'click' event, so every time it's clicked +*/ button.addEventListener('click', handleClick) -// here we ask the button to call our `handleClick` function -// on the 'click' event, so every time it's clicked ``` ### Expected result @@ -110,8 +121,6 @@ You can see an example of the expected result [here](https://youtu.be/IQ6-3X3JBs **`Prompt Examples:`** -- "As a beginner, explain to me what is `querySelector` in JavaScript, and how do I use it to select an HTML element by its ID or class?" - -- "As a beginner, explain to me how can I change the text content of an `HTML element` using JavaScript?" +- "As a beginner, explain to me how can I change the text content and the background color of an `HTML element` using JavaScript?" - "As a beginner, explain to me how do I use `addEventListener` to make a button respond to a click event in JavaScript?" From f1452b14354fb3d2b357124ba037bfa934824994 Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Tue, 1 Oct 2024 11:54:14 +0100 Subject: [PATCH 21/31] fix(READMES): fixes some typo and divide a long sentence in two parts --- subjects/AI.GO/first-wink/README.md | 6 +++--- subjects/AI.GO/the-skeleton/README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subjects/AI.GO/first-wink/README.md b/subjects/AI.GO/first-wink/README.md index 7858f4de35..8c23afd6d1 100644 --- a/subjects/AI.GO/first-wink/README.md +++ b/subjects/AI.GO/first-wink/README.md @@ -16,7 +16,7 @@ Don't worry if things feel a bit challenging—that's part of the process! Just > We can mention thing you do not know; but by this time, you know what to do! Search for it, ask your peers and use clever prompts ;) -- **You need to continue on the HTML, CSS, JS code you submitted for the exercise `first-move`, but with an empty JavaScript file and do not forget to change the name of the linked files to the name of this exercise as well as following the new instructions!** +- **You need to continue on the HTML, CSS, JS code you submitted for the exercise `first-move`, but with an empty JavaScript file. Do not forget to change the name of the linked files to the name of this exercise as well as following the new instructions!** ### Resources @@ -33,7 +33,7 @@ We provide you with some content to get started smoothly, check it out! #### Task 1: -Let's put a button on the top right corner of the page with the `id` of "eye-btn", that will toggle (close or open) the left eye when clicked. +Let's put a button on the top right corner of the page with the `id` set to "eye-btn", that will toggle (close or open) the left eye when clicked. Add it in the HTML structure: @@ -60,7 +60,7 @@ Select the button in your JavaScript file by its `id`. That will allow the user ```js // Select the button element using its ID so we can interact with it in our JavaScript -//Example of selecting a button called myButton +//Example of selecting a button called btn-example const myButton = document.getElementById("btn-example"); ``` diff --git a/subjects/AI.GO/the-skeleton/README.md b/subjects/AI.GO/the-skeleton/README.md index ebfbe67495..47dcfa1c12 100644 --- a/subjects/AI.GO/the-skeleton/README.md +++ b/subjects/AI.GO/the-skeleton/README.md @@ -24,7 +24,7 @@ We provide you with some content to get started smoothly, check it out! - Video [Basic set up of an HTML page](https://www.youtube.com/watch?v=QtKoO7tT-Gg&list=PLHyAJ_GrRtf979iZZ1N3qYMfsPj9PCCrF&index=1) - Video [Different HTML tags overview](https://www.youtube.com/watch?v=Al-Jzpib8VY&list=PLHyAJ_GrRtf979iZZ1N3qYMfsPj9PCCrF&index=2) -Those videos are accompanying you step by step in each exercise, but if you want to check right away all the notions covered in the quest, you can watch the whole playlist throughout your next exercices[Web - HTML, CSS & DOM JavaScript](https://www.youtube.com/playlist?list=PLHyAJ_GrRtf979iZZ1N3qYMfsPj9PCCrF). +Those videos are accompanying you step by step in each exercise, but if you want to check right away all the notions covered in the quest, you can watch the whole playlist throughout your next exercises[Web - HTML, CSS & DOM JavaScript](https://www.youtube.com/playlist?list=PLHyAJ_GrRtf979iZZ1N3qYMfsPj9PCCrF). > Your working environment may not be exactly the same as what you see in the videos or documentation, just try to adapt your work according to your research and discoveries. > Don't be afraid to try! From 3b79b2840c9ba66e2810ef3ed662e32c180bab0e Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Tue, 1 Oct 2024 12:02:25 +0100 Subject: [PATCH 22/31] fix(READMES): fix a typo --- subjects/AI.GO/first-wink/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/first-wink/README.md b/subjects/AI.GO/first-wink/README.md index 8c23afd6d1..f32bfc0b76 100644 --- a/subjects/AI.GO/first-wink/README.md +++ b/subjects/AI.GO/first-wink/README.md @@ -100,7 +100,7 @@ const handleClick = (event) => { } else { /* If the eye is open: - - Add to 'button' element the text: "Click to open the left eye" + - Add to the 'button' element the text: "Click to open the left eye" - Change the 'eyeLeft' element background color to black */ } From c4a427c4579d432ba7b392706aa5f81922ee88ca Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:38:32 +0100 Subject: [PATCH 23/31] Chore(listed): Add a hint for the third instruction and clarify the first --- subjects/AI.GO/listed/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/subjects/AI.GO/listed/README.md b/subjects/AI.GO/listed/README.md index 7bd2310c01..f445a92835 100644 --- a/subjects/AI.GO/listed/README.md +++ b/subjects/AI.GO/listed/README.md @@ -42,7 +42,7 @@ let batteryLevels = [80, 60, 90, 50]; ### Indexes in Arrays -The position of an element in an array is called its index, starting from 0. So, our `batteryLevels` array is roughly equivalent to writing this object: +The position of an element in an array is called its `index`, starting from `0`. So, our `batteryLevels` array is roughly equivalent to writing this object: ```js let batteryLevelsObject = { @@ -109,7 +109,7 @@ Now, the array looks like this: #### Task 1: -You must declare a variable `components` that contains 4 strings, one for each robot component "motor", "sensor", "battery" and "camera" (respect that order). +You must declare a variable `components` that contains 4 strings, one for each robot component : `"motor"`, `"sensor"`, `"battery"` and `"camera"` (respect that order). #### Task 2: @@ -128,7 +128,7 @@ We provide you a variable `robotParts` that contains some elements. You will hav #### Task 3: -You must replace the third element of the provided `replaceComponents` array with the string 'enhanced'. +- You must replace the third element of the provided `replaceComponents` array with the string 'enhanced'. Example: @@ -137,7 +137,9 @@ let replaceComponents = ["motor", "sensor", "battery"]; // expect -> ['motor', 'sensor', 'enhanced'] ``` -You must swap the first and second element of the provided `swapComponents` array. +- You must `swap` the first and second element of the provided `swapComponents` array using a variable `temp`. + +_Hint: Use a `temp` variable to store the first element, assign the second element to the first, and then assign `temp` to the second element to complete the swap._ Example: From 01851207c756f7b859eb50f7b3cb612ad6f8d273 Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:59:08 +0100 Subject: [PATCH 24/31] Chore(listed): Modifying hint for the third instruction and clarify the first --- subjects/AI.GO/listed/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/AI.GO/listed/README.md b/subjects/AI.GO/listed/README.md index f445a92835..d3319847e4 100644 --- a/subjects/AI.GO/listed/README.md +++ b/subjects/AI.GO/listed/README.md @@ -139,7 +139,7 @@ let replaceComponents = ["motor", "sensor", "battery"]; - You must `swap` the first and second element of the provided `swapComponents` array using a variable `temp`. -_Hint: Use a `temp` variable to store the first element, assign the second element to the first, and then assign `temp` to the second element to complete the swap._ +_Hint: Use a `temp` variable to store the first element, you must modify the array swapComponents, not create a new one !_ Example: From a2ded36c6528a28a07b082090f6c178f94ae9ed3 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 3 Oct 2024 16:09:19 +0100 Subject: [PATCH 25/31] fix(ui-ux): title not visible in the platform due to H2 --- .../piscine-ui/atomic-design/README.md | 12 +++++----- .../building-an-interface/README.md | 13 ++++++----- .../piscine-ui/colors-and-moodboard/README.md | 22 +++++++++---------- .../piscine-ui/heuristics/README.md | 4 ++-- .../piscine-ui/rules/README.md | 22 +++++++++---------- .../athlete-keep-hydrated/README.md | 14 ++++++------ .../athlete-keep-hydrated/audit/README.md | 14 ++++++------ .../piscine-ux/going-on-holidays/README.md | 16 +++++++------- .../piscine-ux/music-on/README.md | 16 +++++++------- .../piscine-ux/seamstress/README.md | 16 +++++++------- .../piscine-ux/sunday-night-movie/README.md | 12 +++++----- .../piscine-ux/teenage-drama/README.md | 14 ++++++------ .../piscine-ux/the-olympics/README.md | 16 +++++++------- .../projects/a-table/audit/README.md | 2 +- .../lets-do-some-sports/audit/README.md | 2 +- .../projects/lets-fair-trade/README.md | 2 +- .../projects/lets-fair-trade/audit/README.md | 2 +- 17 files changed, 100 insertions(+), 99 deletions(-) diff --git a/subjects/user-experience/piscine-ui/atomic-design/README.md b/subjects/user-experience/piscine-ui/atomic-design/README.md index 5e5a642db2..7157c9c51e 100644 --- a/subjects/user-experience/piscine-ui/atomic-design/README.md +++ b/subjects/user-experience/piscine-ui/atomic-design/README.md @@ -1,4 +1,4 @@ -## Browsing +### Browsing **Context:** @@ -48,7 +48,7 @@ Don't forget to: - User Interface Design is a hybrid role and can bring together concepts from interaction design, visual design, information architecture and even Front End Development. -## Material Design +### Material Design ### Instructions @@ -74,7 +74,7 @@ Don't forget to: - [Material Design Awards 2019](https://design.google/library/material-design-awards-2019/) - [What is Material Design - Wikipedia](https://en.wikipedia.org/wiki/Material_Design) -## Design system library +### Design system library ### Instructions @@ -103,7 +103,7 @@ Don't forget to: - [Atomic Design Methodology](https://atomicdesign.bradfrost.com/chapter-2/) -## Library for climbing addicts +### Library for climbing addicts ### Instructions @@ -145,7 +145,7 @@ Don't forget to: - [Building a design system library - Lyft](https://medium.com/tap-to-dismiss/building-a-design-system-library-532ef2492811) - [Examples of UI Buttons library](https://www.pinterest.co.kr/pin/663014376380850291/) -## Library for a dating app +### Library for a dating app ### Instructions @@ -185,4 +185,4 @@ Don't forget to: - [Introduction to design systems](https://www.youtube.com/watch?v=xEuBCUngJ_U) - [Create a design system - Figma course](https://www.youtube.com/watch?v=RYDiDpW2VkM) - [Building a design system library - Lyft](https://medium.com/tap-to-dismiss/building-a-design-system-library-532ef2492811) -- [Examples of UI Buttons library](https://www.pinterest.co.kr/pin/663014376380850291/) \ No newline at end of file +- [Examples of UI Buttons library](https://www.pinterest.co.kr/pin/663014376380850291/) diff --git a/subjects/user-experience/piscine-ui/building-an-interface/README.md b/subjects/user-experience/piscine-ui/building-an-interface/README.md index ca292bf0e7..cb0d6aedd0 100644 --- a/subjects/user-experience/piscine-ui/building-an-interface/README.md +++ b/subjects/user-experience/piscine-ui/building-an-interface/README.md @@ -1,4 +1,4 @@ -## Styleguide +### Styleguide **Context:** @@ -47,7 +47,7 @@ Don't forget to: - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) - [Example of a Style Guide in UI](https://www.pinterest.pt/pin/454019206175050454/) -## Design system library +### Design system library ### Instructions @@ -82,7 +82,7 @@ Don't forget to: - [Building a design system library - Lyft](https://medium.com/tap-to-dismiss/building-a-design-system-library-532ef2492811) - [Examples of UI Buttons library](https://www.pinterest.co.kr/pin/663014376380850291/) -## Design screens +### Design screens ### Instructions @@ -115,7 +115,7 @@ Don't forget to: - [Unsplash](https://unsplash.com/) for visuals -## Animation +### Animation ### Instructions @@ -141,9 +141,10 @@ Don't forget to: **Quote:** "Speak human: Use the words your users use.’ Dan Saffer | Microinteractions. + - [From low-fidelity to high-fidelity](https://mockitt.wondershare.com/prototyping/low-fidelity-vs-high-fidelity.html) -## Desirability testing +### Desirability testing ### Instructions @@ -181,4 +182,4 @@ Don't forget to: **Quote:** -- "Interaction design focuses on the design of behavior of a person’s interaction with a digital interface. It is also concerned with satisfying the needs and desires of the people who will interact with a product or service.’ Alan Cooper, About Face: The Essentials of Interaction Design \ No newline at end of file +- "Interaction design focuses on the design of behavior of a person’s interaction with a digital interface. It is also concerned with satisfying the needs and desires of the people who will interact with a product or service.’ Alan Cooper, About Face: The Essentials of Interaction Design diff --git a/subjects/user-experience/piscine-ui/colors-and-moodboard/README.md b/subjects/user-experience/piscine-ui/colors-and-moodboard/README.md index 9fdd95f399..2e69635c7e 100644 --- a/subjects/user-experience/piscine-ui/colors-and-moodboard/README.md +++ b/subjects/user-experience/piscine-ui/colors-and-moodboard/README.md @@ -1,4 +1,4 @@ -## Find the colors +### Find the colors **Context:** @@ -38,7 +38,7 @@ Don't forget to: - [Beginning graphic design](https://edu.gcfglobal.org/en/beginning-graphic-design/) - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) -## Color codes +### Color codes ### Instructions @@ -72,7 +72,7 @@ Don't forget to : - [https://brave.com/es/](https://brave.com/es/) - [https://www.ted.com/](https://www.ted.com/) -## Color combinations +### Color combinations ### Instructions @@ -151,7 +151,7 @@ Don't forget to: - [https://calendar.google.com/](https://calendar.google.com/) - [https://www.ebay.com/](https://www.ebay.com/) -## Moodboard +### Moodboard ### Instructions @@ -185,7 +185,7 @@ Don't forget to: - [Example3](https://i.pinimg.com/564x/ee/9d/d6/ee9dd6fbb82b0e5b4dd2924580b765dd.jpg) - Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Typography +### Typography ### Instructions @@ -226,7 +226,7 @@ Don't forget to: - [Beginning graphic design](https://edu.gcfglobal.org/en/beginning-graphic-design/) - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) -## Typography moodboard +### Typography moodboard ### Instructions @@ -268,7 +268,7 @@ Don't forget to: - [Beginning graphic design](https://edu.gcfglobal.org/en/beginning-graphic-design/) - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) -## UI Challenge - Timer +### UI Challenge - Timer ### Instructions @@ -298,7 +298,7 @@ Don't forget to: - The frame is Android 360 x 640px. - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## UI Challenge - Watches +### UI Challenge - Watches ### Instructions @@ -332,7 +332,7 @@ Don't forget to: - You can use existing Libraries by browsing the Figma community resources. - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## UI Challenge - Flight +### UI Challenge - Flight ### Instructions @@ -362,7 +362,7 @@ Don't forget to: - [Figma article about Symbols and Variants](https://help.figma.com/hc/en-us/articles/360056440594-Create-and-use-variants). - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## UI Challenge - Spotify +### UI Challenge - Spotify ### Instructions @@ -394,7 +394,7 @@ Don't forget to: - [Figma article about Symbols and Variants](https://help.figma.com/hc/en-us/articles/360056440594-Create-and-use-variants). - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## UI Challenge - Bitcoin Dashboard +### UI Challenge - Bitcoin Dashboard ### Instructions diff --git a/subjects/user-experience/piscine-ui/heuristics/README.md b/subjects/user-experience/piscine-ui/heuristics/README.md index a6f2688da6..64cc5f5baa 100644 --- a/subjects/user-experience/piscine-ui/heuristics/README.md +++ b/subjects/user-experience/piscine-ui/heuristics/README.md @@ -1,4 +1,4 @@ -## Audit +### Audit **Context:** @@ -49,7 +49,7 @@ Don't forget to: - [A new usability heuristic evaluation checklist](https://uxplanet.org/a-new-usability-heuristic-evaluation-checklist-259f588da308) - [Tool : Heuristic evaluation checklist](https://drive.google.com/file/d/10KbfbNZA1oVS1sXbjjXLPPmdZ6nqVkdc/view) -## Recommendations +### Recommendations ### Instructions diff --git a/subjects/user-experience/piscine-ui/rules/README.md b/subjects/user-experience/piscine-ui/rules/README.md index dc05ffa8c7..7556c15599 100644 --- a/subjects/user-experience/piscine-ui/rules/README.md +++ b/subjects/user-experience/piscine-ui/rules/README.md @@ -1,4 +1,4 @@ -## Grids +### Grids **Context:** @@ -37,7 +37,7 @@ Don't forget to: - [Beginning graphic design](https://edu.gcfglobal.org/en/beginning-graphic-design/) - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) -## Multi state +### Multi state ### Instructions @@ -67,7 +67,7 @@ Don't forget to: - [Gareth graphic studio](https://www.youtube.com/c/GarethDavidStudio) - [Example here with Nintendo.com](https://www.figma.com/file/ahSnWRZeKBO62oJDiXltxY/UI-III---Ex-2) (The screenshots date back to nov 2021. They may differ from the current version of [Nintendo.com](http://Nintendo.com) but the rules are the same). -## Accessibility (website) +### Accessibility (website) ### Instructions @@ -106,7 +106,7 @@ Don't forget to: - Error states. - etc. -## Accessibility (app) +### Accessibility (app) ### Instructions @@ -144,7 +144,7 @@ Don't forget to: - Error states - etc. -## Breadcrumbs +### Breadcrumbs ### Instructions @@ -167,7 +167,7 @@ Don't forget to: - [What are breadcrumbs?](https://www.seoptimer.com/blog/breadcrumbs-website/) -## Toggle buttons +### Toggle buttons ### Instructions @@ -190,7 +190,7 @@ Don't forget to: - [Toggle Switch - Tips](https://uxplanet.org/toggle-switch-5-simple-design-tips-for-better-design-b4046eff4a2f) -## Radio buttons +### Radio buttons ### Instructions @@ -213,7 +213,7 @@ Don't forget to: - [What is a radio button?](https://www.justinmind.com/blog/radio-button-design-examples/) -## Calendars +### Calendars ### Instructions @@ -232,7 +232,7 @@ Don't forget to: - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Time pickers +### Time pickers ### Instructions @@ -251,7 +251,7 @@ Don't forget to: - Pay attention to the global aspect of the file. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Micro-interactions +### Micro-interactions ### Instructions @@ -282,7 +282,7 @@ Don't forget to: - [Why use micro-interactions in your design](https://hike.one/update/why-use-micro-animations-in-your-design) - [Micro-interactions: why, when, and how to use them to boost the UX](https://uxdesign.cc/micro-interactions-why-when-and-how-to-use-them-to-boost-the-ux-17094b3baaa0) -## Consistency +### Consistency ### Instructions diff --git a/subjects/user-experience/piscine-ux/athlete-keep-hydrated/README.md b/subjects/user-experience/piscine-ux/athlete-keep-hydrated/README.md index 6f399c023a..4384e64b68 100644 --- a/subjects/user-experience/piscine-ux/athlete-keep-hydrated/README.md +++ b/subjects/user-experience/piscine-ux/athlete-keep-hydrated/README.md @@ -1,4 +1,4 @@ -## User Interviews +### User Interviews **Context:** @@ -86,7 +86,7 @@ Thank you so much for your time! I have a last favor to ask you: is there anyone you know who runs frequently and would be available for a talk? -## Analytics +### Analytics ### Instructions @@ -125,7 +125,7 @@ Examples of insights you can extract from the articles: Always base your decisions on the data, not on your biases. -## Personas +### Personas ### Instructions @@ -165,7 +165,7 @@ Use the material you got from the exercise `User interview` to build the pierre "Focus unswervingly, on the customer’ Jesse Hertzberg | Former COO of Squarespace -## User Journey +### User Journey ### Instructions @@ -209,7 +209,7 @@ Most articles you'll find will be about user journeys or customer journeys. Keep 'It’s about catching customers in the act, and providing highly relevant and highly contextual information’ Paul Maritz | CEO Pivotal -## Problem Statement +### Problem Statement ### Instructions @@ -257,7 +257,7 @@ Based on the insights from the exercises `analytics` and `user interviews`, comm “If I had an hour to solve a problem, I’d spend 55 minutes thinking about the problem and 5 minutes thinking about solutions.” Albert Einstein -## Ideation +### Ideation _You can replace Pierre with your own persona._ @@ -330,7 +330,7 @@ Don't forget to: Chances are that... If you have gone through all possible solutions, you’ve found the good one. -## Prototyping +### Prototyping ### Instructions diff --git a/subjects/user-experience/piscine-ux/athlete-keep-hydrated/audit/README.md b/subjects/user-experience/piscine-ux/athlete-keep-hydrated/audit/README.md index 19ec073141..a4e64eee6d 100644 --- a/subjects/user-experience/piscine-ux/athlete-keep-hydrated/audit/README.md +++ b/subjects/user-experience/piscine-ux/athlete-keep-hydrated/audit/README.md @@ -1,4 +1,4 @@ -### User interview +#### User interview ###### Is the deliverable labeled as “Name_FirstName_DeliverableName_Date_VersionNumber”? @@ -12,7 +12,7 @@ ###### Does each insight have the name of the person(s) who said it? -### Analytics +#### Analytics ###### Is the deliverable labeled as “Name_FirstName_DeliverableName_Date_VersionNumber”? @@ -28,7 +28,7 @@ ###### Are the insights different from the ones given in the instructions as an example? -### Personas +#### Personas ###### Is the deliverable labeled as “Name_FirstName_DeliverableName_Date_VersionNumber”? @@ -54,7 +54,7 @@ ###### Are the insights from ex 1 included in Pierre's persona card? -### User Journey +#### User Journey ###### Is the deliverable labeled as “Name_FirstName_DeliverableName_Date_VersionNumber”? @@ -76,7 +76,7 @@ ###### For every thought, is there a main emotion? -### Problem Statement +#### Problem Statement ###### Is the deliverable labeled as “Name_FirstName_DeliverableName_Date_VersionNumber”? @@ -92,7 +92,7 @@ ##### Is the problem statement broad enough (check the readme tips to understand broad)? -### Ideation +#### Ideation ###### Is there a zip folder? @@ -108,7 +108,7 @@ ###### Is there one main idea to solve the problem? -### Prototyping +#### Prototyping ###### Is there a zip folder? diff --git a/subjects/user-experience/piscine-ux/going-on-holidays/README.md b/subjects/user-experience/piscine-ux/going-on-holidays/README.md index 2cf3787ddd..4d73571287 100644 --- a/subjects/user-experience/piscine-ux/going-on-holidays/README.md +++ b/subjects/user-experience/piscine-ux/going-on-holidays/README.md @@ -1,4 +1,4 @@ -## Interview guide +### Interview guide **Context:** @@ -46,7 +46,7 @@ Here are the recommended steps : “To ask open-ended questions is the best approach, but it’s easy to get into the weeds in data analysis when every answer is a paragraph or two of prose. Users quickly tire of answering many open-ended questions, which usually require a lot of typing and explanation.” Norman Nielsen Group -## Run interviews +### Run interviews ### Instructions @@ -68,7 +68,7 @@ Then, write down the script on a written document, and give elements of context - Pay attention to the global aspect of the document. It must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Affinity diagram & Empathy map +### Affinity diagram & Empathy map ### Instructions @@ -108,7 +108,7 @@ Don't forget to: Remember, you are not the user, so your opinions are not absolute truth. -## Problem statement +### Problem statement ### Instructions @@ -137,7 +137,7 @@ You may use the "How Might We" exercise in pairs. "Out of clutter, find simplicity. From discord, find harmony. In the middle of difficulty, lies opportunity.’ Albert Einstein -## Ideation +### Ideation ### Instructions @@ -180,7 +180,7 @@ Quote: - "Brainstorming means using the brain to storm a creative problem. Do so in commando fashion, with each stormer attacking the same objective.’ Alex Faickney Osborn -## User flow +### User flow ### Instructions @@ -210,7 +210,7 @@ Don't forget to: "Each use case is represented as a sequence of simple steps, beginning with a user’s goal and ending when that goal is fulfilled.’ Usability.gov -## Prototyping +### Prototyping ### Instructions @@ -243,4 +243,4 @@ Give another dimension to your user flow and turn it into a paper prototype (6 t **Quote:** -Any design is like a joke …if you have to explain it, it’s bad. \ No newline at end of file +Any design is like a joke …if you have to explain it, it’s bad. diff --git a/subjects/user-experience/piscine-ux/music-on/README.md b/subjects/user-experience/piscine-ux/music-on/README.md index 73da0a5e6b..c249421d71 100644 --- a/subjects/user-experience/piscine-ux/music-on/README.md +++ b/subjects/user-experience/piscine-ux/music-on/README.md @@ -1,4 +1,4 @@ -## Heuristics +### Heuristics **Context:** @@ -41,7 +41,7 @@ Conduct a heuristic analysis on **one** of these websites: 'If you think design is expensive, you should look at the cost of bad design’ Ralf Speth | Former CEO Jaguar Land Rover -## Site map +### Site map ### Instructions @@ -81,7 +81,7 @@ Stick to the website you have chosen in the previous exercise "heuristics" and d "The organization, search, and navigation systems that help people to complete tasks, find what they need, and understand what they’ve found’ Peter Morville | Information Architecture for the WWW. -## JTBD +### JTBD ### Instructions @@ -121,7 +121,7 @@ And remember: You are not your user! - "Documenting the what and why of each element promotes organization and makes the handoff to the development team much smoother." UX Booth - "When we buy a product, we essentially "hire" something to get a job done. If it does the job well, when we are confronted with the same job, we hire that same product again. And if the product does a crummy job, we "fire" it and look around for something else we might hire to solve the problem." Clayton M Christensen -## Card sorting +### Card sorting ### Instructions @@ -168,7 +168,7 @@ Don't forget to: - [10 things to know about card sorting](http://www.measuringu.com/blog/card-sorting.php) - [Card sorting: a definitive guide](http://boxesandarrows.com/card-sorting-a-definitive-guide/) -## Music label wireframes +### Music label wireframes ### Instructions @@ -218,7 +218,7 @@ Vocabulary: - Figma. -## Test protocol +### Test protocol ### Instructions @@ -257,7 +257,7 @@ Don't forget to: - You need to detect: How many errors do users make? How severe are these errors? How easily can they recover from the errors? -## Run 5 tests +### Run 5 tests ### Instructions @@ -287,4 +287,4 @@ Don't forget to: **Quote:** -- To get trustworthy results in your test, you can’t ask your customers to use their imagination. You’ve got to show them something realistic. If you do, their reactions will be genuine. \ No newline at end of file +- To get trustworthy results in your test, you can’t ask your customers to use their imagination. You’ve got to show them something realistic. If you do, their reactions will be genuine. diff --git a/subjects/user-experience/piscine-ux/seamstress/README.md b/subjects/user-experience/piscine-ux/seamstress/README.md index 7ce1d6c398..dbd60f794c 100644 --- a/subjects/user-experience/piscine-ux/seamstress/README.md +++ b/subjects/user-experience/piscine-ux/seamstress/README.md @@ -1,4 +1,4 @@ -## UX strategy +### UX strategy **Context:** @@ -49,7 +49,7 @@ Don't forget to: - Design needs to fail. Failure is even a necessary step, but ideally it should happen before a product is launched, during the prototype and test phases - “UX Strategy lies at the intersection of UX and business. It provides a much better chance of creating successful products. It enables teams to see the “Big Picture” to achieve the business goals under uncertain conditions” Jamie Levy | UX Strategy: How to Devise Innovative Digital Products That People Want -- UX Strategy is the method by which you validate that your solution solves a problem for real customers in a dynamic marketplace because the market is constantly changing. +- UX Strategy is the method by which you validate that your solution solves a problem for real customers in a dynamic marketplace because the market i#s constantly changing. ## Empathy @@ -111,7 +111,7 @@ Don't forget to: - With 5 to 10 criteria - 10 organizations appear on the table -## Define +### Define ### Instructions @@ -158,7 +158,7 @@ Don't forget to: - The "I want to" part involves a practical action. - The "So I can" part involves a psychological or emotional purpose. -## Problem statement +### Problem statement ### Instructions @@ -199,7 +199,7 @@ Design is about solving problems. Fall in Love with the Problem, Not the Solutio - How might make sure Pierre doesn’t get drunk the night before the race? - Out of scope —> This is not about dehydration, nor about running. -## Ideation +### Ideation ### Instructions @@ -221,7 +221,7 @@ Don't forget to: - Use as many tools as needed, and make sure you do all the process in 4 working days! - Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Prototype +### Prototype ### Instructions @@ -265,7 +265,7 @@ Don't forget to: - High-Fidelity: Wireframes with color, styles, graphical details, and micro-interactions - [Example here](https://miro.medium.com/max/1400/1*Xn0HSKAvhr4TZzC9lN5udw.gif) - Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! -## Test protocol +### Test protocol ### Instructions @@ -295,4 +295,4 @@ Don't forget to: **Tips:** -- Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! \ No newline at end of file +- Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! diff --git a/subjects/user-experience/piscine-ux/sunday-night-movie/README.md b/subjects/user-experience/piscine-ux/sunday-night-movie/README.md index f85540f21f..1612a41e26 100644 --- a/subjects/user-experience/piscine-ux/sunday-night-movie/README.md +++ b/subjects/user-experience/piscine-ux/sunday-night-movie/README.md @@ -1,4 +1,4 @@ -## User flow +### User flow **Context:** @@ -39,7 +39,7 @@ Don't forget to: **Recommended tools:** - Figma. -- Whimsical. +- Whimsical.# ## Movie wireframes @@ -79,7 +79,7 @@ Don't forget to: - "77% of users return to content and information sites because of ease-of-use. Only 22% return because the site belongs to a favorite brand." Forrester -## Wireframes animation +### Wireframes animation ### Instructions @@ -106,7 +106,7 @@ Don't forget to: - [Efficiently Manage Your Designs - How Mockplus State Page Helps To View & Manage Multiple State](https://help.mockplus.com/p/372) -## Test on features +### Test on features ### Instructions @@ -140,7 +140,7 @@ Don't forget to: - [The art of guerrilla usability testing](http://www.uxbooth.com/articles/the-art-of-guerrilla-usability-testing/) - [How to write a user testing report that people will actually read](https://uxdesign.cc/how-to-write-a-user-testing-report-that-people-will-actually-read-652d15d2f92e) -## Iteration +### Iteration ### Instructions @@ -166,4 +166,4 @@ Don't forget to: **Tips:** - This report will be handed on to the CEO. Pay attention to the details and make sure the document is clean and easy to use! -- Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! \ No newline at end of file +- Pay attention to the global aspect of the deliverables. They must be clear, simple and easy to read. You can get inspiration [canva](https://www.canva.com/) but don’t overload your design with too much details! diff --git a/subjects/user-experience/piscine-ux/teenage-drama/README.md b/subjects/user-experience/piscine-ux/teenage-drama/README.md index 8f2ddf1613..ca199954d4 100644 --- a/subjects/user-experience/piscine-ux/teenage-drama/README.md +++ b/subjects/user-experience/piscine-ux/teenage-drama/README.md @@ -1,4 +1,4 @@ -## Competitive Analysis +### Competitive Analysis **Context:** @@ -43,7 +43,7 @@ Don't forget to: **Quote:** - 'Always design a thing in its larger context: a chair in a room, a room in a house, a house in an environment, an environment in a city plan’ Eero Sarrinen | Knoll -- Creating a great design isn’t just about understanding what the user wants. It’s also about understanding and delivering on what the business needs. +- Creating a great design isn’t just about understanding what the user wants. It’s also about understanding and delivering on what the business needs.# ## Surveys @@ -99,7 +99,7 @@ Here are the recommended steps: - “Surveys measure and categorize attitudes or collect self-reported data that can help track or discover important issues to address.” Norman Nielsen Group - Surveys are not accurate in providing behavioral data because USERS OMIT STEPS IN THE MIDDLE AND MEMORIES ARE FAULTY. -## Broadcast strategy +### Broadcast strategy ### Instructions @@ -141,7 +141,7 @@ Once your strategy is prepared, run it! - [How to get more survey responses](https://rafflepress.com/how-to-get-more-survey-responses/) -## Interviews +### Interviews ### Instructions @@ -183,7 +183,7 @@ Here are the recommended steps : - [How to design better products through user interviews](https://uxdesign.cc/how-to-design-better-products-through-user-interviews-4c5142bb1fc4) - [Asking the right questions](https://uxdesign.cc/asking-the-right-questions-on-user-research-interviews-and-testing-427261742a67) -## Personas +### Personas ### Instructions @@ -215,7 +215,7 @@ Your persona card should include common trends amongst the people you got data f - "If you design for everyone, you delight no one." - "A good user persona is the one based on user research, without regard to how many attributes we can describe." -## User journey +### User journey ### Instructions @@ -254,7 +254,7 @@ Most articles you'll find will be about user journeys or customer journeys. Keep - “More options = More problems.” Scott Belsky | VP of Product & Community Adobe - "A customer journey map is a visualization of the process that a person goes through in order to accomplish a goal. It’s used for understanding and addressing customer needs and pain points’ Norman Nielsen Group -## Problem statement +### Problem statement ### Instructions diff --git a/subjects/user-experience/piscine-ux/the-olympics/README.md b/subjects/user-experience/piscine-ux/the-olympics/README.md index 79e366d1b3..1caa19e107 100644 --- a/subjects/user-experience/piscine-ux/the-olympics/README.md +++ b/subjects/user-experience/piscine-ux/the-olympics/README.md @@ -1,4 +1,4 @@ -## Ideation A +### Ideation A **Context:** @@ -51,7 +51,7 @@ Don't forget to: - [3 proven methods to organize a brainstorming session](https://uxdesign.cc/brainstorm-79e51f20f313) - [Effective brainstorming (without feeling lost)](https://uxdesign.cc/effective-brainstorming-without-being-lost-b68750bbfac5?sk=5d5a332f7e3f2a43364c031b01b13229) - [The myth of brainstorming](https://uxdesign.cc/the-myth-of-brainstorming-8517e02facc0?sk=995d601cbf988d574e86dd71364cb92f) -- [Ideation method: Worst possible idea](https://www.interaction-design.org/literature/article/learn-how-to-use-the-best-ideation-methods-worst-possible-idea) +- [Ideation method: Worst possible idea](https://www.interaction-design.org/literature/article/learn-how-to#-use-the-best-ideation-methods-worst-possible-idea) ## Ideation B @@ -102,7 +102,7 @@ Pay attention not to use the same ideation technique as in Ex 1! - [The myth of brainstorming](https://uxdesign.cc/the-myth-of-brainstorming-8517e02facc0?sk=995d601cbf988d574e86dd71364cb92f) - [Ideation method: Worst possible idea](https://www.interaction-design.org/literature/article/learn-how-to-use-the-best-ideation-methods-worst-possible-idea) -## Ideation C +### Ideation C ### Instructions @@ -151,7 +151,7 @@ Pay attention not to use the same ideation technique as in Ex 2! - [The myth of brainstorming](https://uxdesign.cc/the-myth-of-brainstorming-8517e02facc0?sk=995d601cbf988d574e86dd71364cb92f) - [Ideation method: Worst possible idea](https://www.interaction-design.org/literature/article/learn-how-to-use-the-best-ideation-methods-worst-possible-idea) -## User flow +### User flow ### Instructions @@ -178,7 +178,7 @@ Don't forget to: - [Site flows vs User Flows](https://uxmovement.com/wireframes/site-flows-vs-user-flows-when-to-use-which/) - [How to make a User Flow diagram](https://www.lucidchart.com/blog/how-to-make-a-user-flow-diagram) -## Prototyping +### Prototyping ### Instructions @@ -219,7 +219,7 @@ Don't forget to: - "To prototype your solution, you’ll need a temporary change of philosophy: from perfect to just enough, from long-term quality to temporary simulation." - "The prototype is meant to answer questions, so keep it focused. You just need a real-looking facade to which customers can react." -## Animation +### Animation ### Instructions @@ -244,7 +244,7 @@ This exercise is to be made individually. - [Efficiently Manage Your Designs - How Mockplus State Page Helps To View & Manage Multiple State](https://help.mockplus.com/p/372) -## Test wireframe +### Test wireframe ### Instructions @@ -280,4 +280,4 @@ Don't forget to: **Quote:** -Prototypes are created for testing purposes, that’s why creating a prototype without running tests on it makes no sense. \ No newline at end of file +Prototypes are created for testing purposes, that’s why creating a prototype without running tests on it makes no sense. diff --git a/subjects/user-experience/projects/a-table/audit/README.md b/subjects/user-experience/projects/a-table/audit/README.md index e135adf6f0..91b03aca4b 100644 --- a/subjects/user-experience/projects/a-table/audit/README.md +++ b/subjects/user-experience/projects/a-table/audit/README.md @@ -1,6 +1,6 @@ #### A table -###### At least 5 people are attending the presentation +###### Are there at least 5 people attending the presentation? ###### Have the feedback forms been shared at the beginning of the presentation? diff --git a/subjects/user-experience/projects/lets-do-some-sports/audit/README.md b/subjects/user-experience/projects/lets-do-some-sports/audit/README.md index 680df33d71..fd09c4ae16 100644 --- a/subjects/user-experience/projects/lets-do-some-sports/audit/README.md +++ b/subjects/user-experience/projects/lets-do-some-sports/audit/README.md @@ -1,6 +1,6 @@ #### Let's do some sports -###### At least 5 people are attending the presentation +###### Are there at least 5 people attending the presentation? ###### Have the feedback forms been shared at the beginning of the presentation? diff --git a/subjects/user-experience/projects/lets-fair-trade/README.md b/subjects/user-experience/projects/lets-fair-trade/README.md index e229a223d2..043c7e190d 100644 --- a/subjects/user-experience/projects/lets-fair-trade/README.md +++ b/subjects/user-experience/projects/lets-fair-trade/README.md @@ -4,7 +4,7 @@ Creation of an ecommerce platform for second-hand clothes on desktop and mobile Bruno loves fashion. He loves buying clothes! As he is cautious with the environment, he prefers buying second-hand clothing. However, the existing platforms are not very user-friendly. -"I need to know more about the environmental impact of the pieces I buy. I’d like to know how old they are, where they are coming from, to measure their life and the amount of kilometres they have traveled. When a new pair of jeans arrive at the ready-to-wear store in Europe, they consumed approximately 11,000 litres of water and travelled 65,000 kilometres. I’d like to monitor that kind of data.’ +"I need to know more about the environmental impact of the pieces I buy. I’d like to know how old they are, where they are coming from, to measure their life and the amount of kilometers they have traveled. When a new pair of jeans arrive at the ready-to-wear store in Europe, they consumed approximately 11,000 litres of water and traveled 65,000 kilometers. I’d like to monitor that kind of data.’ You gather a team of 3 to think and design a website and an app for second-hand products. diff --git a/subjects/user-experience/projects/lets-fair-trade/audit/README.md b/subjects/user-experience/projects/lets-fair-trade/audit/README.md index 211d80533c..1aa8e8b325 100644 --- a/subjects/user-experience/projects/lets-fair-trade/audit/README.md +++ b/subjects/user-experience/projects/lets-fair-trade/audit/README.md @@ -1,6 +1,6 @@ #### Let's fair trade! -###### At least 5 people are attending the presentation +###### Are there at least 5 people attending the presentation? ###### Have the feedback forms been shared at the beginning of the presentation? From 4445fd34821eab77364762839e8b92efadf7ec13 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 3 Oct 2024 16:12:50 +0100 Subject: [PATCH 26/31] fix(ui-ux): title not visible in the platform due to H2 --- subjects/user-experience/projects/get-a-room/audit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/user-experience/projects/get-a-room/audit/README.md b/subjects/user-experience/projects/get-a-room/audit/README.md index 4e29cbb7a6..85beb00c54 100644 --- a/subjects/user-experience/projects/get-a-room/audit/README.md +++ b/subjects/user-experience/projects/get-a-room/audit/README.md @@ -1,6 +1,6 @@ #### Get a room -###### At least 5 people are attending the presentation +###### Are there at least 5 people attending the presentation? ###### Have the feedback forms been shared at the beginning of the presentation? From 9e72f60c8dcf134ca7fd05650f94ef638d5a9eb6 Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Tue, 1 Oct 2024 15:20:10 +0100 Subject: [PATCH 27/31] fix(tests): fix test to match subject demands to student --- js/tests/listed.json | 114 ++++++++++++++--------------- js/tests/only-if.json | 162 +++++++++++++++++++++--------------------- 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/js/tests/listed.json b/js/tests/listed.json index 3f24b0eecc..0b0bb7bd7b 100644 --- a/js/tests/listed.json +++ b/js/tests/listed.json @@ -1,58 +1,58 @@ [ - { - "description": "components variable must be an Array", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n\n// Your code\nif (!Array.isArray(components)) {\n throw Error('Season must be an Array')\n}" - }, - { - "description": "components first element must be motor", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[0].toLowerCase(), 'motor')\n" - }, - { - "description": "components second element sensor", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[1].toLowerCase(), 'sensor')\n" - }, - { - "description": "components third element battery", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[2].toLowerCase(), 'battery')\n" - }, - { - "description": "components fourth element camera", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[3].toLowerCase(), 'camera')\n" - }, - { - "description": "components we must not have a fifth element", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[4], undefined)\n" - }, - { - "description": "firstPart is the value of the first element", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(firstPart, 'motor')\n" - }, - { - "description": "firstPart is the value of the first element even if we change the list", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(firstPart, 'sensor')\n" - }, - { - "description": "lastPart is the value of the last element", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(lastPart, 'camera')\n" - }, - { - "description": "lastPart is the value of the last element even if we change the list", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(lastPart, 'battery')\n" - }, - { - "description": "comboParts is an array of lastPart and firstPart", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(comboParts, ['camera', 'motor'])\n" - }, - { - "description": "comboParts is an array of lastPart and firstPart even if we change the list", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(comboParts, ['battery', 'sensor'])\n" - }, - { - "description": "replaceComponents third element is 'enhanced'", - "code": "\n\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\n\n// Your code\n\nequal(replaceComponents, ['sensor', 'battery', 'enhanced', 'brain'])\n" - }, - { - "description": "1st and 2nd elements of swapComponents are swapped pif,paf,pom", - "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nlet swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(swapComponents, ['battery', 'sensor', 'motor'])\n" - } -] \ No newline at end of file + { + "description": "components variable must be an Array", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n\n// Your code\nif (!Array.isArray(components)) {\n throw Error('Components must be an Array')\n}" + }, + { + "description": "components first element must be motor", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[0].toLowerCase(), 'motor')\n" + }, + { + "description": "components second element sensor", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[1].toLowerCase(), 'sensor')\n" + }, + { + "description": "components third element battery", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[2].toLowerCase(), 'battery')\n" + }, + { + "description": "components fourth element camera", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[3].toLowerCase(), 'camera')\n" + }, + { + "description": "components we must not have a fifth element", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet swapComponents = ['motor', 'battery']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\n// Your code\nequal(components[4], undefined)\n" + }, + { + "description": "firstPart is the value of the first element", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(firstPart, 'motor')\n" + }, + { + "description": "firstPart is the value of the first element even if we change the list", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(firstPart, 'sensor')\n" + }, + { + "description": "lastPart is the value of the last element", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(lastPart, 'camera')\n" + }, + { + "description": "lastPart is the value of the last element even if we change the list", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(lastPart, 'battery')\n" + }, + { + "description": "comboParts is an array of lastPart and firstPart", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'battery',\n 'camera',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(comboParts, ['camera', 'motor'])\n" + }, + { + "description": "comboParts is an array of lastPart and firstPart even if we change the list", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'sensor',\n 'motor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(comboParts, ['battery', 'sensor'])\n" + }, + { + "description": "replaceComponents third element is 'enhanced'", + "code": "\n\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nconst swapComponents = ['sensor', 'battery', 'motor']\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\n\n// Your code\n\nequal(replaceComponents, ['sensor', 'battery', 'enhanced', 'brain'])\n" + }, + { + "description": "1st and 2nd elements of swapComponents are swapped pif,paf,pom", + "code": "\n\nconst replaceComponents = ['sensor', 'battery', 'motor', 'brain']\nlet robotParts = [\n 'motor',\n 'sensor',\n 'camera',\n 'battery',\n // 'memory', ??\n]\nlet swapComponents = ['sensor', 'battery', 'motor']\n\n// Your code\n\nequal(swapComponents, ['battery', 'sensor', 'motor'])\n" + } +] diff --git a/js/tests/only-if.json b/js/tests/only-if.json index 233970771c..0734d90037 100644 --- a/js/tests/only-if.json +++ b/js/tests/only-if.json @@ -1,82 +1,82 @@ [ - { - "description": "Test with the falsy value 0", - "code": "const args = saveArguments(console, 'log')\nlet truth = 0\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the falsy value NaN", - "code": "const args = saveArguments(console, 'log')\nlet truth = NaN\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the falsy value undefined", - "code": "const args = saveArguments(console, 'log')\nlet truth = undefined\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the falsy value null", - "code": "const args = saveArguments(console, 'log')\nlet truth = null\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the falsy value ''", - "code": "const args = saveArguments(console, 'log')\nlet truth = ''\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the falsy value false", - "code": "const args = saveArguments(console, 'log')\nlet truth = false\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" - }, - { - "description": "Test with the truthy value 'Sure'", - "code": "const args = saveArguments(console, 'log')\nlet truth = 'Sure'\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" - }, - { - "description": "Test with the truthy value []", - "code": "const args = saveArguments(console, 'log')\nlet truth = []\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" - }, - { - "description": "Test with the truthy value {}", - "code": "const args = saveArguments(console, 'log')\nlet truth = {}\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" - }, - { - "description": "Test with the truthy value true", - "code": "const args = saveArguments(console, 'log')\nlet truth = true\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" - }, - { - "description": "Test with the truthy value -0.1", - "code": "const args = saveArguments(console, 'log')\nlet truth = -0.1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" - }, - { - "description": "Test with a user that can have the promotion", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You cannot benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" - }, - { - "description": "Test with a user that is too old", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 33 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" - }, - { - "description": "Test with a user that is too young", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 12 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" - }, - { - "description": "Test with a user that doesn't have an active membership", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: false, age: 21 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" - }, - { - "description": "Test with a user that can have the promotion but is just at the limit", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 25 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" - }, - { - "description": "Test with a customer that has enough cash", - "code": "let truth = 0\nlet ticketSold = 8\nlet customer = { cash: 20, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket = 'You cannot benefit from our special promotion'\n\n// Your code\n\nequal(ticketSold, 9)" - }, - { - "description": "Test with a customer that has a voucher", - "code": "let truth = 0\nlet ticketSold = 5\nlet customer = { cash: 0, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket = 'You cannot benefit from our special promotion'\n\n// Your code\n\nequal(ticketSold, 6)" - }, - { - "description": "Test with a customer that has a voucher and cash", - "code": "let truth = 0\nlet ticketSold = 6\nlet customer = { cash: 42, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket = 'You cannot benefit from our special promotion'\n\n// Your code\n\nequal(ticketSold, 7)" - }, - { - "description": "Test with a customer that can not afford the ticket", - "code": "let truth = 0\nlet ticketSold = 3\nlet customer = { cash: 3, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket = 'You cannot benefit from our special promotion'\n\n// Your code\n\nequal(ticketSold, 3)" - } -] \ No newline at end of file + { + "description": "Test with the falsy value 0", + "code": "const args = saveArguments(console, 'log')\nlet truth = 0\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the falsy value NaN", + "code": "const args = saveArguments(console, 'log')\nlet truth = NaN\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the falsy value undefined", + "code": "const args = saveArguments(console, 'log')\nlet truth = undefined\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the falsy value null", + "code": "const args = saveArguments(console, 'log')\nlet truth = null\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the falsy value ''", + "code": "const args = saveArguments(console, 'log')\nlet truth = ''\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the falsy value false", + "code": "const args = saveArguments(console, 'log')\nlet truth = false\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + }, + { + "description": "Test with the truthy value 'Sure'", + "code": "const args = saveArguments(console, 'log')\nlet truth = 'Sure'\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + }, + { + "description": "Test with the truthy value []", + "code": "const args = saveArguments(console, 'log')\nlet truth = []\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + }, + { + "description": "Test with the truthy value {}", + "code": "const args = saveArguments(console, 'log')\nlet truth = {}\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + }, + { + "description": "Test with the truthy value true", + "code": "const args = saveArguments(console, 'log')\nlet truth = true\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + }, + { + "description": "Test with the truthy value -0.1", + "code": "const args = saveArguments(console, 'log')\nlet truth = -0.1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + }, + { + "description": "Test with a user that can have the promotion", + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" + }, + { + "description": "Test with a user that is too old", + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 33 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" + }, + { + "description": "Test with a user that is too young", + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 12 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" + }, + { + "description": "Test with a user that doesn't have an active membership", + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: false, age: 21 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You cannot benefit from our special promotion')" + }, + { + "description": "Test with a user that can have the promotion but is just at the limit", + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 25 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket = 'You can benefit from our special promotion'\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" + }, + { + "description": "Test with a customer that has enough cash", + "code": "let truth = 0\nlet ticketSold = 8\nlet customer = { cash: 20, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 9)" + }, + { + "description": "Test with a customer that has a voucher", + "code": "let truth = 0\nlet ticketSold = 5\nlet customer = { cash: 0, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 6)" + }, + { + "description": "Test with a customer that has a voucher and cash", + "code": "let truth = 0\nlet ticketSold = 6\nlet customer = { cash: 42, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 7)" + }, + { + "description": "Test with a customer that can not afford the ticket", + "code": "let truth = 0\nlet ticketSold = 3\nlet customer = { cash: 3, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 3)" + } +] From e62a3cdae002616f511c7244e94a203868085ca0 Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Tue, 1 Oct 2024 15:23:23 +0100 Subject: [PATCH 28/31] fix(tests): fix test formatting --- js/tests/only-if.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/js/tests/only-if.json b/js/tests/only-if.json index 0734d90037..28a88354b6 100644 --- a/js/tests/only-if.json +++ b/js/tests/only-if.json @@ -1,51 +1,51 @@ [ { "description": "Test with the falsy value 0", - "code": "const args = saveArguments(console, 'log')\nlet truth = 0\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = 0\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the falsy value NaN", - "code": "const args = saveArguments(console, 'log')\nlet truth = NaN\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = NaN\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the falsy value undefined", - "code": "const args = saveArguments(console, 'log')\nlet truth = undefined\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = undefined\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the falsy value null", - "code": "const args = saveArguments(console, 'log')\nlet truth = null\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = null\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the falsy value ''", - "code": "const args = saveArguments(console, 'log')\nlet truth = ''\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = ''\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the falsy value false", - "code": "const args = saveArguments(console, 'log')\nlet truth = false\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" + "code": "const args = saveArguments(console, 'log')\nlet truth = false\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'Lies !!!!')" }, { "description": "Test with the truthy value 'Sure'", - "code": "const args = saveArguments(console, 'log')\nlet truth = 'Sure'\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + "code": "const args = saveArguments(console, 'log')\nlet truth = 'Sure'\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" }, { "description": "Test with the truthy value []", - "code": "const args = saveArguments(console, 'log')\nlet truth = []\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + "code": "const args = saveArguments(console, 'log')\nlet truth = []\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" }, { "description": "Test with the truthy value {}", - "code": "const args = saveArguments(console, 'log')\nlet truth = {}\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + "code": "const args = saveArguments(console, 'log')\nlet truth = {}\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" }, { "description": "Test with the truthy value true", - "code": "const args = saveArguments(console, 'log')\nlet truth = true\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + "code": "const args = saveArguments(console, 'log')\nlet truth = true\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" }, { "description": "Test with the truthy value -0.1", - "code": "const args = saveArguments(console, 'log')\nlet truth = -0.1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" + "code": "const args = saveArguments(console, 'log')\nlet truth = -0.1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(args[0]?.[0], 'The truth was spoken.')" }, { "description": "Test with a user that can have the promotion", - "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket \nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" + "code": "const args = saveArguments(console, 'log')\nlet truth = 1\nlet user = { activeMembership: true, age: 22 }\nlet customer = { cash: 20, hasVoucher: false }\nlet ticket\nlet ticketSold = 3\n\n// Your code\n\nequal(ticket, 'You can benefit from our special promotion')" }, { "description": "Test with a user that is too old", @@ -65,18 +65,18 @@ }, { "description": "Test with a customer that has enough cash", - "code": "let truth = 0\nlet ticketSold = 8\nlet customer = { cash: 20, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 9)" + "code": "let truth = 0\nlet ticketSold = 8\nlet customer = { cash: 20, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket\n\n// Your code\n\nequal(ticketSold, 9)" }, { "description": "Test with a customer that has a voucher", - "code": "let truth = 0\nlet ticketSold = 5\nlet customer = { cash: 0, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 6)" + "code": "let truth = 0\nlet ticketSold = 5\nlet customer = { cash: 0, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket\n\n// Your code\n\nequal(ticketSold, 6)" }, { "description": "Test with a customer that has a voucher and cash", - "code": "let truth = 0\nlet ticketSold = 6\nlet customer = { cash: 42, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 7)" + "code": "let truth = 0\nlet ticketSold = 6\nlet customer = { cash: 42, hasVoucher: true }\nlet user = { activeMembership: true, age: 22 }\nlet ticket\n\n// Your code\n\nequal(ticketSold, 7)" }, { "description": "Test with a customer that can not afford the ticket", - "code": "let truth = 0\nlet ticketSold = 3\nlet customer = { cash: 3, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket \n\n// Your code\n\nequal(ticketSold, 3)" + "code": "let truth = 0\nlet ticketSold = 3\nlet customer = { cash: 3, hasVoucher: false }\nlet user = { activeMembership: true, age: 22 }\nlet ticket\n\n// Your code\n\nequal(ticketSold, 3)" } ] From 82e17cc37fbd5fd8e09119da254ae67e4ea2633f Mon Sep 17 00:00:00 2001 From: Oumaima Fisaoui <48260689+Oumaimafisaoui@users.noreply.github.com> Date: Thu, 26 Sep 2024 13:47:31 +0100 Subject: [PATCH 29/31] Chore(AI-GO): Fixed instructions in only if --- subjects/AI.GO/only-if/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/subjects/AI.GO/only-if/README.md b/subjects/AI.GO/only-if/README.md index 732f13f285..625c7893e4 100644 --- a/subjects/AI.GO/only-if/README.md +++ b/subjects/AI.GO/only-if/README.md @@ -113,13 +113,19 @@ Your Robot must always seek the truth. #### Task 2: -Your `RoboGuard's traveling company` has a special promotion for robot members aged between 18 (included) and 25 (included). Write the if condition that will check if the robot user can benefit from the promotion: +Your `RoboGuard's traveling company` has a special promotion for robot members aged between 18 (included) and 25 (included). -- `user.age` must be more than `17`. +**NB: The ticket variable has already been declared, so do not declare it again.** + +1- Assign the message "You cannot benefit from our special promotion" to the ticket variable. + +2- Use an if statement to check that all these conditions are true: + +- `user.age` must be greater than or equal to `18`. - `user.age` must be less than or equal to `25`. - `user.activeMembership` must be `true`. -If `all` of these conditions are `true`, log the message '`You can benefit from our special promotion`'. +3- If all conditions are true, update the ticket variable with the message: "You can benefit from our special promotion". > Hint : use AND Operator in your condition! From 0d8f2f28f3bff9598346f5c356ca3334cbb4ac7c Mon Sep 17 00:00:00 2001 From: Christopher Fremond Date: Tue, 1 Oct 2024 11:13:04 +0100 Subject: [PATCH 30/31] fix(README):improve grammar and formatting --- subjects/AI.GO/only-if/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subjects/AI.GO/only-if/README.md b/subjects/AI.GO/only-if/README.md index 625c7893e4..ce97a494cb 100644 --- a/subjects/AI.GO/only-if/README.md +++ b/subjects/AI.GO/only-if/README.md @@ -109,15 +109,15 @@ if (temperature < 8) { Your Robot must always seek the truth. - Check if the value of the provided variable `truth` is truthy, log the string: `The truth was spoken.` -- Otherwise, log the string: `Lies !!!!` because the value of the provided variable truth is falsy. +- Otherwise, log the string: `Lies !!!!` because the value of the provided variable `truth` is falsy. #### Task 2: Your `RoboGuard's traveling company` has a special promotion for robot members aged between 18 (included) and 25 (included). -**NB: The ticket variable has already been declared, so do not declare it again.** +**NB: The variable ticket has already been declared, so do not declare it again.** -1- Assign the message "You cannot benefit from our special promotion" to the ticket variable. +1- Assign the message "You cannot benefit from our special promotion" to the variable `ticket`. 2- Use an if statement to check that all these conditions are true: @@ -125,20 +125,20 @@ Your `RoboGuard's traveling company` has a special promotion for robot members a - `user.age` must be less than or equal to `25`. - `user.activeMembership` must be `true`. -3- If all conditions are true, update the ticket variable with the message: "You can benefit from our special promotion". +3- If all conditions are true, update the variable `ticket` with the message: "You can benefit from our special promotion". -> Hint : use AND Operator in your condition! +> Hint : use an AND Operator in your condition! #### Task 3: Your RoboGuard is selling plane tickets, each costing `9.99$`. The RoboGuard must confirm that the customer robot has the means to buy this ticket. -The customer robot may have enough cash `or` a voucher. +The customer robot may have enough cash **or** be in possesion of a voucher. Check if the provided variable customer can afford the ticket: If the customer has enough `cash` (`customer.cash` property) -`or` If the customer has a `voucher` (`customer.hasVoucher` property is true) +**OR** If the customer has a `voucher` (`customer.hasVoucher` property is true) If so, `increment` the provided variable `ticketSold` value by `1`. From b4b4e77daf58801ccef2aefcab506947766ff7de Mon Sep 17 00:00:00 2001 From: mfakiri Date: Fri, 4 Oct 2024 11:06:20 +0100 Subject: [PATCH 31/31] fixing a typo on the its-a-match subject | PISCINE-JS --- subjects/its-a-match/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subjects/its-a-match/README.md b/subjects/its-a-match/README.md index cc67b31696..61e585c1aa 100644 --- a/subjects/its-a-match/README.md +++ b/subjects/its-a-match/README.md @@ -2,7 +2,7 @@ ### Instructions -Have you been been pondering over the etymology of `grep`? +Have you been pondering over the etymology of `grep`? Create 4 regular expression variables: