From b73a9a2974bb6e37c6f8648679bed293ead256ed Mon Sep 17 00:00:00 2001 From: akhyarr <112689445+rrayhka@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:54:57 +0700 Subject: [PATCH 001/108] feat(update): comments.md (#5414) * feat(update): comments.md * Update comments.md minor changes --------- --- content/python/concepts/comments/comments.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/content/python/concepts/comments/comments.md b/content/python/concepts/comments/comments.md index be6df4676a7..4cb243ddf7d 100644 --- a/content/python/concepts/comments/comments.md +++ b/content/python/concepts/comments/comments.md @@ -1,6 +1,6 @@ --- Title: 'Comments' -Description: 'A comment is a piece of text within a program that is not executed. It can be used to provide additional information to aid in understanding the code. In Python, the # character is used to start a comment. The comment continues after the # until the end of the line. py name = "Pied Piper" # Comment after code Python does not have a specific syntax for multi-line comments, unlike some other languages. Instead, multiple # characters can be used:' +Description: 'A comment is a piece of text in a program used to explain code.' Subjects: - 'Computer Science' - 'Data Science' @@ -12,7 +12,7 @@ CatalogContent: - 'paths/computer-science' --- -A comment is a piece of text within a program that is not executed. It can be used to provide additional information to aid in understanding the code. +A comment is a piece of text within a program that is not executed. It is used to provide additional information or context to help understand the code. Python uses the `#` character to start a comment, which extends to the end of the line. ## Single-line Comments @@ -21,14 +21,12 @@ In Python, the `#` character is used to start a comment. The comment continues a ```py # Comment on a single line -name = "Pied Piper" # Comment after code +name = "Pied Piper" # Comment after code ``` ## Multi-line Comments -Python does not have a specific syntax for multi-line comments, unlike some other languages. - -Instead, multiple `#` characters can be used: +Python does not have a specific syntax for multi-line comments, unlike some other languages. Instead, multiple `#` characters can be used: ```py # This is a comment written over @@ -37,7 +35,7 @@ Instead, multiple `#` characters can be used: print("Hello, World!") ``` -Another, less official way of writing comments in Python is to use a multi-line string. Python will ignore string literals that are not assigned to a variable, so multi-line strings (created by surrounding text with triple quotes `"""`) can be used as de facto comments: +Alternatively, multi-line strings (with triple quotes `"""`) can also be used as de facto comments. These are ignored by Python if not assigned to a variable: ```py """ @@ -50,9 +48,9 @@ print("Hello, World!") ## Codebyte Example -Here are some examples of comments in a Python program: +Run the following codebyte to understand how comments work in Python: -```codebyte/py +```codebyte/python """ Tip Calculator Written by Sonny From ab6b385f1ef71a901392e06c0415cb6dc5d210f7 Mon Sep 17 00:00:00 2001 From: Ragul <67683723+ragul1697@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:15:34 +0530 Subject: [PATCH 002/108] SQL concept entry - Between (#5290) * SQL concept entry - Between * SQL Between - Suggested changes added * SQL Between - Review changes completed --------- --- .../concepts/dates/terms/between/between.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 content/sql/concepts/dates/terms/between/between.md diff --git a/content/sql/concepts/dates/terms/between/between.md b/content/sql/concepts/dates/terms/between/between.md new file mode 100644 index 00000000000..c17ceaf6bc0 --- /dev/null +++ b/content/sql/concepts/dates/terms/between/between.md @@ -0,0 +1,54 @@ +--- +Title: 'BETWEEN' +Description: 'Returns records where a specified value is within a given range, including the boundary values.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Database' + - 'Date' + - 'Queries' + - 'SQL Server' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +The **`BETWEEN`** [operator](https://www.codecademy.com/resources/docs/sql/operators) finds values within a given range. The values can be texts, dates, or numbers. Also, this operator is inclusive, i.e., both beginning and ending values are included. + +## Syntax + +```pseudo +SELECT column_name(s) +from table_name +where column_name between value1 and value2; +``` + +> Note: The basic syntax for `BETWEEN` is generally the same across most databases, but some differences may arise depending on how each database handles specific [data types](https://www.codecademy.com/resources/docs/sql/data-types) or expressions. To use this operator on a particular database, data handling, null handling, case sensitivity, and collations must be checked first to avoid errors. + +## Example + +Suppose there’s a `order_details` table with the following data: + +| order_id | item | price | quantity | order_date | +| -------- | ------------ | ----- | -------- | ------------------- | +| 1 | Donut | 2.49 | 2 | 2022-08-16 08:04:23 | +| 2 | Cookie | 0.99 | 3 | 2022-08-21 09:43:00 | +| 3 | Donut | 2.49 | 1 | 2022-08-18 11:25:12 | +| 4 | Egg Sandwich | 7.99 | 1 | 2022-08-20 11:45:41 | +| 5 | Ice Coffee | 3.99 | 2 | 2022-08-17 12:18:50 | + +Here is a query using the `BETWEEN` operator: + +```sql +SELECT * FROM order_details WHERE order_date BETWEEN '2022-08-15' AND '2022-08-19'; +``` + +This would return all records from the `order_details` table, where the `order_date` is between August 15, 2022 +and August 19, 2022 (inclusive): + +| order_id | item | price | quantity | order_date | +| -------- | ---------- | ----- | -------- | ------------------- | +| 1 | Donut | 2.49 | 2 | 2022-08-16 08:04:23 | +| 3 | Donut | 2.49 | 1 | 2022-08-18 11:25:12 | +| 5 | Ice Coffee | 3.99 | 2 | 2022-08-17 12:18:50 | From 70c472c1b441139f06224c2f40c7990997915fba Mon Sep 17 00:00:00 2001 From: Aaron Pedwell Date: Tue, 8 Oct 2024 10:27:07 +0100 Subject: [PATCH 003/108] =?UTF-8?q?updated=20the=20conditionals.md=20file?= =?UTF-8?q?=20to=20shorten=20the=20description=20and=20clean=E2=80=A6=20(#?= =?UTF-8?q?5406)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updated the conditionals.md file to shorten the description and cleaned up the text * updated the grammar * Minor changes * Update conditionals.md minor changes --------- --- content/javascript/concepts/conditionals/conditionals.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/javascript/concepts/conditionals/conditionals.md b/content/javascript/concepts/conditionals/conditionals.md index 4db9edab837..a3ac215d8ff 100644 --- a/content/javascript/concepts/conditionals/conditionals.md +++ b/content/javascript/concepts/conditionals/conditionals.md @@ -1,6 +1,6 @@ --- Title: 'Conditionals' -Description: 'Conditionals take an expression, which is code that evaluates to determine a value, and checks if it is true or false. If it’s true, we can tell our program to do one thing — we can even account for false to do another. An if statement accepts an expression with a set of parentheses: - If the expression evaluates to a truthy value, then the code within its code body executes. - If the expression evaluates to a falsy value, its code body will not execute. js const isMailSent = true; if (isMailSent) {' +Description: 'Conditionals evaluate an expression (a piece of code that produces a value) to determine whether it is true or false.' Subjects: - 'Web Development' - 'Computer Science' @@ -13,7 +13,7 @@ CatalogContent: - 'paths/front-end-engineer-career-path' --- -Conditionals take an expression, which is code that evaluates to determine a value, and checks if it is `true` or `false`. If it’s `true`, we can tell our program to do one thing — we can even account for `false` to do another. +Conditionals take an expression, which is code that evaluates to determine a value, and checks if it is `true` or `false`. If it’s `true`, the program can be told to do one thing and if it's `false`, the program can be told to do another thing. ## If Statement From 8308704d94671e3da544ee761c9eec78defa07ea Mon Sep 17 00:00:00 2001 From: arisdelacruz <115809819+arisdelacruz@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:34:43 +0800 Subject: [PATCH 004/108] Modification of the reshape entry in Numpy (#5407) * Creation of cat.md for pytorch tensors * Modification of reshape entry for numpy * Delete content/pytorch/concepts/tensors/terms/cat/cat.md * Minor changes * Update reshape.md prettified --------- --- .../numpy/concepts/ndarray/terms/reshape/reshape.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content/numpy/concepts/ndarray/terms/reshape/reshape.md b/content/numpy/concepts/ndarray/terms/reshape/reshape.md index ab3f2a0594e..e8ebea4bc35 100644 --- a/content/numpy/concepts/ndarray/terms/reshape/reshape.md +++ b/content/numpy/concepts/ndarray/terms/reshape/reshape.md @@ -60,3 +60,16 @@ This produces the following output: [5] [6]] ``` + +## Codebyte Example + +Run the following codebyte example to understand the usage of the `.reshape()` method: + +```codebyte/python +import numpy as np + +arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) +new_arr = arr.reshape(4, 3) + +print(new_arr) +``` From 97bb26e42a882ef9effdb85550c141c7c284cd77 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 8 Oct 2024 17:08:29 +0530 Subject: [PATCH 005/108] [Edit] C# Strings - Contains comparisionType (#5419) * edited contains.md with more info and example for comparisionType * fixed formatting * Update yarn.lock * Minor changes --------- Co-authored-by: Sriparno Roy <89148144+Sriparno08@users.noreply.github.com> Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- .../strings/terms/contains/contains.md | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/content/c-sharp/concepts/strings/terms/contains/contains.md b/content/c-sharp/concepts/strings/terms/contains/contains.md index 0f834456426..37cf3e436ba 100644 --- a/content/c-sharp/concepts/strings/terms/contains/contains.md +++ b/content/c-sharp/concepts/strings/terms/contains/contains.md @@ -36,12 +36,12 @@ String.Contains(string, comparisonType) - `char` is a single character. - `string` is a sequence of characters. - `comparisonType` is an enumeration value that allows to add specific rules to compare strings such as culture, case, and sort. Passing as an additional argument: -- `CurrentCulture` determines whether strings match culture-sensitive criteria. -- `CurrentCultureIgnoreCase` same as above and ignores the case. -- `InvariantCulture` determines whether strings match culture-sensitive criteria and the invariant culture. -- `InvariantCultureIgnoreCase` same as above and ignores the case. -- `Ordinal` determines whether strings match using binary sort rules. -- `OrdinalIgnoreCase` same as above and ignores the case. + - `CurrentCulture` determines whether strings match culture-sensitive criteria using the current system culture for comparison. + - `CurrentCultureIgnoreCase` does the same as above and ignores the case. + - `InvariantCulture` determines whether strings match using a fixed, culture-independent set of rules that remain consistent across all systems and regions. + - `InvariantCultureIgnoreCase` does the same as above and ignores the case. + - `Ordinal` determines whether strings match using binary sort rules. This is the fastest comparison method, performing a simple byte-by-byte comparison of Unicode values. + - `OrdinalIgnoreCase` does the same as above and ignores the case. ## Example @@ -78,6 +78,42 @@ True False ``` +Now, let's see how we can use the `comparisonType` parameter to modify the comparison rules: + +```cs +using System; +using System.Globalization; + +public class Example +{ + public static void Main() + { + // Turkish culture handles 'i' and 'İ' differently + CultureInfo turkishCulture = new CultureInfo("tr-TR"); + string turkishString = "İstanbul"; + string searchText = "istanbul"; + + // Default culture comparison (typically en-US) + bool defaultResult = turkishString.Contains(searchText, StringComparison.CurrentCultureIgnoreCase); + + // Turkish culture comparison + CultureInfo.CurrentCulture = turkishCulture; + bool turkishResult = turkishString.Contains(searchText, + StringComparison.CurrentCultureIgnoreCase); + + Console.WriteLine($"Default culture result: {defaultResult}"); + Console.WriteLine($"Turkish culture result: {turkishResult}"); + } +} +``` + +Here is the output: + +```shell +Default culture result: True +Turkish culture result: False +``` + ## Codebyte Example The example below determines whether the word `helpful` is included in the particular string. From 302bd57f15ef7b2c5c93650c5f1fa1f175208c1f Mon Sep 17 00:00:00 2001 From: Anton Roters <91165689+toshydev@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:09:35 +0200 Subject: [PATCH 006/108] [Term Entry] Python NumPy - Math functions .unwrap() (#5297) * add unwrap function to numpy term entries * fix output precision, add note about unwrap function precision * Update content/numpy/concepts/math-methods/terms/unwrap/unwrap.md * Update unwrap.md minor changes * Update unwrap.md minor changes --------- --- .../math-methods/terms/unwrap/unwrap.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 content/numpy/concepts/math-methods/terms/unwrap/unwrap.md diff --git a/content/numpy/concepts/math-methods/terms/unwrap/unwrap.md b/content/numpy/concepts/math-methods/terms/unwrap/unwrap.md new file mode 100644 index 00000000000..baee6b179ce --- /dev/null +++ b/content/numpy/concepts/math-methods/terms/unwrap/unwrap.md @@ -0,0 +1,90 @@ +--- +Title: '.unwrap()' +Description: 'Unwraps a phase angle array by changing deltas greater than a threshold to their 2*pi complement.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Arrays' + - 'Functions' + - 'Math' + - 'NumPy' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +In NumPy, the **`.unwrap()`** function is used to unwrap a phase angle array. This function adjusts the phase angles by changing any absolute difference between consecutive angles greater than the specified threshold (default: `pi`) by their `2*pi` complement. It is commonly used in signal processing to correct phase angle discontinuities in wrapped data. + +## Syntax + +```pseudo +numpy.unwrap(p, discont=pi, axis=-1, period=6.283185307179586) +``` + +- `p`: The input array of phase angles to be unwrapped. +- `discont` (optional): The discontinuity threshold, which defaults to `pi`. Differences greater than this value will be adjusted by adding or subtracting multiples of `2*pi`. +- `axis` (optional): The axis along which the unwrap operation is applied. Default is the last axis `-1`. +- `period` (optional): The period of the phase angles. Default is `2*pi`, but it can be set to other values to adjust for different periodicities. + +## Example 1 + +This example demonstrates how to use the `.unwrap()` function to correct phase discontinuities in an array of wrapped phase angles. + +```py +# Importing the 'numpy' library as 'np' +import numpy as np + +# Creating an array of phase angles with discontinuities +angles = np.array([0, np.pi/2, np.pi, -np.pi/2, -np.pi]) + +# Applying the unwrap function to correct discontinuities +unwrapped = np.unwrap(angles) + +print(unwrapped) +``` + +The above example code results in the following output: + +```shell +[0. 1.57079633 3.14159265 4.71238898 3.14159265] +``` + +> **Note:** NumPy outputs phase angles with high precision. For clarity, these examples use rounded values. + +## Example 2 + +This example shows how to adjust the discontinuity threshold by setting a custom discont value in `.unwrap()`: + +```py +# Importing the 'numpy' library as 'np' +import numpy as np + +# Creating an array of phase angles with large discontinuities +angles = np.array([0, np.pi/2, np.pi, 3*np.pi, -np.pi/2]) + +# Unwrapping with a custom discontinuity threshold of 2*pi +unwrapped = np.unwrap(angles, discont=2*np.pi) + +print(unwrapped) +``` + +The above example code results in the following output: + +```shell +[0. 1.57079633 3.14159265 3.14159265 4.71238898] +``` + +## Codebyte Example + +In this Codebyte example, the `.unwrap()` method corrects discontinuities in an array of phase angles: + +```codebyte/python +import numpy as np + +angles = np.array([0, np.pi, 2*np.pi, -np.pi]) + +unwrapped = np.unwrap(angles) + +print(unwrapped) +``` From edf8580beb43e0532169c2d4c0587cded81b9d4e Mon Sep 17 00:00:00 2001 From: Rashmit <163204184+RashmitTopG@users.noreply.github.com> Date: Tue, 8 Oct 2024 19:55:04 +0530 Subject: [PATCH 007/108] New thread branch (#5409) * Added two more examples of Threading in python with explaination * Added Two more Examples of Threading in Python * Added Two more Examples of Threading in Python * Update thread.md minor changes * Update thread.md minor changes * Update thread.md * Update thread.md * Update thread.md fixed issues --------- --- .../concepts/threading/terms/thread/thread.md | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/content/python/concepts/threading/terms/thread/thread.md b/content/python/concepts/threading/terms/thread/thread.md index 3f8b9562e2f..a6f6342d308 100644 --- a/content/python/concepts/threading/terms/thread/thread.md +++ b/content/python/concepts/threading/terms/thread/thread.md @@ -12,12 +12,12 @@ CatalogContent: - 'paths/computer-science' --- -The `.Thread()` method is a class constructor which returns a thread object that can run a function with zero or more arguments. +The **`.Thread()`** method is a class constructor that returns a thread object that can run a function with zero or more arguments. ## Syntax ```pseudo -threading.Thread(target=object, args=()) +threading.Thread(target=callable, args=()) ``` [Functions](https://www.codecademy.com/resources/docs/python/functions) are commonly passed as the `target` argument, but without parentheses. If any items are listed in the `args` tuple, they are passed as positional arguments to the `target`. @@ -43,7 +43,7 @@ Every thread object has a `name` attribute that, unless otherwise specified, def ``` -## Codebyte Example +## Codebyte Example 1 In the example below, a thread, `hello_thread`, targets the `say_hello()` function with supplied arguments. After the thread is created, the targeted `say_hello()` function is executed when the [`.start()`](https://www.codecademy.com/resources/docs/python/threading/start) method is run. @@ -58,3 +58,64 @@ hello_thread = threading.Thread(target=say_hello, args=("World",)) hello_thread.start() ``` + +## Codebyte Example 2 + +In the example below, two threads, `thread_1` and `thread_2`, target the `download_file()` function with supplied arguments. Each thread simulates downloading a file concurrently by running the `download_file()` function in the background. After the threads are created, the targeted `download_file()` functions are executed when the `.start()` method is run. + +```codebyte/python +import threading +import time + +def download_file(filename, duration): + print(f"Starting download: {filename}") + time.sleep(duration) + print(f"Finished downloading: {filename}") + +# Creating two threads to simulate downloading two files simultaneously +thread_1 = threading.Thread(target=download_file, args=("file1.txt", 2)) +thread_2 = threading.Thread(target=download_file, args=("file2.txt", 4)) + +# Starting the threads, both downloads begin concurrently +thread_1.start() +thread_2.start() + +# Ensuring the main program waits for both threads to finish +thread_1.join() +thread_2.join() + +print("Both downloads completed!") +``` + +## Codebyte Example 3 + +In the example below, two threads, `coffee_thread` and `toast_thread`, target the `make_coffee()` and `toast_bread()` functions, respectively. Each thread simulates the preparation of coffee and toast concurrently. After the threads are created, the targeted functions are executed when the `.start()` method is run. + +```codebyte/python +import threading +import time + +def make_coffee(): + print("Making coffee...") + time.sleep(3) # Simulating the time taken to make coffee + print("Coffee is ready!") + +def toast_bread(): + print("Toasting bread...") + time.sleep(2) # Simulating the time taken to toast bread + print("Bread is toasted!") + +# Creating threads for making coffee and toasting bread +coffee_thread = threading.Thread(target=make_coffee) +toast_thread = threading.Thread(target=toast_bread) + +# Starting both threads to make coffee and toast bread concurrently +coffee_thread.start() +toast_thread.start() + +# Ensuring the main program waits for both threads to finish +coffee_thread.join() +toast_thread.join() + +print("Breakfast is ready!") +``` From 24caba4621c47a9ead149449755da399a20e58b9 Mon Sep 17 00:00:00 2001 From: arisdelacruz <115809819+arisdelacruz@users.noreply.github.com> Date: Wed, 9 Oct 2024 00:35:51 +0800 Subject: [PATCH 008/108] Creation of the logspace entry (#5327) * Created linspace.md * Update linspace.md * Created logspace.md * Delete content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update logspace.md * Update content/pytorch/concepts/tensors/terms/logspace/logspace.md * Update content/pytorch/concepts/tensors/terms/logspace/logspace.md * Update content/pytorch/concepts/tensors/terms/logspace/logspace.md * Update logspace.md * Update logspace.md minor changes --------- --- .../tensors/terms/logspace/logspace.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/logspace/logspace.md diff --git a/content/pytorch/concepts/tensors/terms/logspace/logspace.md b/content/pytorch/concepts/tensors/terms/logspace/logspace.md new file mode 100644 index 00000000000..56ddefbbe6f --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/logspace/logspace.md @@ -0,0 +1,69 @@ +--- +Title: '.logspace()' +Description: 'Returns a one-dimensional tensor with values logarithmically spaced.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'py-torch-for-classification' +--- + +The **`.logspace()`** function returns a one-dimensional tensor with values logarithmically spaced. + +The function is useful for generating logarithmically spaced values for various applications, such as plotting data on a logarithmic scale or creating logarithmic scales for neural network hyperparameters. + +## Syntax + +```pseudo +torch.logspace(start, end, steps, base, dtype=None) +``` + +- `start`: The first number in the range expressed as a logarithm. +- `end`: The last number in the range expressed as a logarithm. +- `steps`: Number of elements to be returned in the tensor. +- `base`: The base of the logarithm used for calculating the values default value is 10. +- `dtype`: Specifies the data type of the returned tensor. + +## Example 1 + +In this example, the code generates a tensor containing 5 logarithmically spaced values between 1 and 1000: + +```py +import torch + +# Generate a tensor with 5 logarithmically spaced values between 1 and 1000 +tensor = torch.logspace(0, 3, steps=5) +print(tensor) +``` + +The code above generates the following output: + +```shell +tensor([ 1.0000, 5.6234, 31.6228, 177.8279, 1000.0000]) +``` + +## Example 2 + +In this example, the code generates a tensor containing 3 logarithmically spaced values between 1 and 10 using the `.logspace()` function: + +```py +import torch + +# Generate a tensor with 3 logarithmically spaced values between 0 and 10 +tensor = torch.logspace(0, 1, steps=3, dtype=torch.float64) +print(tensor) +``` + +Output: + +```shell +tensor([1.0000, 3.1623, 10.0000], dtype=torch.float64) +``` + +In this example, we created a tensor `tensor` containing 3 logarithmically spaced values between 0 and 1 using the `.logspace()` function with a data type of `torch.float64`. The tensor `tensor` contains the values `[1.0000, 3.1623, 10.0000]`. From ae4b69cd797c7f910e0d8c3814ee65c833c1d6ff Mon Sep 17 00:00:00 2001 From: John Rood Date: Wed, 9 Oct 2024 15:13:27 -0500 Subject: [PATCH 009/108] three Ws instead of 4 --- content/data-science/data-science.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/data-science/data-science.md b/content/data-science/data-science.md index 1b23c3e51f3..1d75663fbeb 100644 --- a/content/data-science/data-science.md +++ b/content/data-science/data-science.md @@ -22,7 +22,7 @@ Since the beginning of the 21st century, data science has been used in almost ev - Data Use - Data Visualization - Data Analytics - - [Data Mining](https://wwww.codecademy.com/resources/docs/data-science/data-mining) + - [Data Mining](https://www.codecademy.com/resources/docs/data-science/data-mining) - Business Intelligence and Strategy - [Artificial Intelligence](https://www.codecademy.com/resources/docs/ai) - [Machine Learning](https://www.codecademy.com/resources/docs/ai/machine-learning) From 1069c792551f2493f7e1e73e8c9bcd097464b5ee Mon Sep 17 00:00:00 2001 From: arisdelacruz <115809819+arisdelacruz@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:57:05 +0800 Subject: [PATCH 010/108] Created .linspace() entry (#5301) * Created linspace.md * Update linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update content/pytorch/concepts/tensors/terms/linspace/linspace.md * Update linspace.md fixed issues * Update linspace.md prettified * Update linspace.md prettified * Prettified content --------- --- .../tensors/terms/linspace/linspace.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/linspace/linspace.md diff --git a/content/pytorch/concepts/tensors/terms/linspace/linspace.md b/content/pytorch/concepts/tensors/terms/linspace/linspace.md new file mode 100644 index 00000000000..8d6bd3e69b1 --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/linspace/linspace.md @@ -0,0 +1,48 @@ +--- +Title: '.linspace()' +Description: 'Returns a one-dimensional tensor with a specified number of evenly spaced values between the given start and end points.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'py-torch-for-classification' +--- + +The **`.linspace()`** function in PyTorch is used to return a one-dimensional tensor with a specified number of evenly spaced values between the given start and end points. + +## Syntax + +```pseudo +torch.linspace(start, end, steps) +``` + +- `start`: The starting value to be used. +- `end`: The ending value to be used. +- `steps`: The number of steps to be taken between the starting and ending values. + +This function is particularly useful when there is a need to create a tensor of equally spaced points for plotting graphs or for performing other numerical computations. + +## Example + +The following example shows how to use the `.linspace()` function in PyTorch: + +```py +import torch + +# Create a tensor of 5 equally spaced points between 0 and 1 +x = torch.linspace(0, 1, 5) + +print(x) +``` + +The code above generates the following output: + +```shell +tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000]) +``` From 010793a130742ea9294ba8b673b5b485d135fcd3 Mon Sep 17 00:00:00 2001 From: ebikatsudon <99709771+ebikatsudon@users.noreply.github.com> Date: Thu, 10 Oct 2024 00:12:06 -0700 Subject: [PATCH 011/108] Python plotly funnel (#5298) * create new plotly express .funnel entry * minor edits to funnel() page * update funnel() * fixed trailing spaces and minor formatting * Update content/plotly/concepts/express/terms/funnel/funnel.md added backticks around method name * Update funnel.md minor changes * Update funnel.md --------- --- .../concepts/express/terms/funnel/funnel.md | 90 ++++++++++++++++++ media/plotly-express-funnel-example1.png | Bin 0 -> 21888 bytes media/plotly-express-funnel-example2.png | Bin 0 -> 26928 bytes 3 files changed, 90 insertions(+) create mode 100644 content/plotly/concepts/express/terms/funnel/funnel.md create mode 100644 media/plotly-express-funnel-example1.png create mode 100644 media/plotly-express-funnel-example2.png diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md new file mode 100644 index 00000000000..e73be5759ce --- /dev/null +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -0,0 +1,90 @@ +--- +Title: '.funnel()' +Description: 'Generates a funnel chart that visualizes the reduction of data in progressive stages.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Data' + - 'Graphs' + - 'Libraries' + - 'Methods' + - 'Plotly' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +The **`.funnel()`** method in Plotly Express creates a funnel chart, which visualizes the progressive reduction of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with each bar's length representing a value at a specific stage. This helps highlight changes, bottlenecks, or drop-offs in the process. + +## Syntax + +```pseudo +plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=None, facet_col=None, ...) +``` + +- `data_frame`: The dataset (typically a [Pandas DataFrame](https://www.codecademy.com/resources/docs/pandas/dataframe)) to be plotted. If this is not provided, Plotly Express will construct a DataFrame using the other arguments. +- `x`: The column in the DataFrame that specifies the values to determine the length of the bars, plotted along the x-axis. +- `y`: The column in the DataFrame that represents the stages of the funnel, plotted along the y-axis. +- `color`: The column in the DataFrame that assigns colors to the bars of the funnel. +- `facet_row`: Splits the funnel chart into vertically-stacked subplots based on a specified column from the DataFrame. +- `facet_col`: Splits the funnel chart into horizontally-arranged subplots based on a specified column from the DataFrame. + +> **Note:** The ellipsis (...) indicates there can be additional optional parameters beyond those listed here. + +## Example 1 + +The example below generates a funnel chart representing the job search process for an applicant: + +```py +import plotly.express as px +import pandas as pd + +# Create sample dictionary +data = { + 'Stage': ['Applications Sent', 'Phone Interview', 'Technical Interview', 'Onsite Interview', 'Offers Received', 'Offers Accepted'], + 'Job Applications': [500, 348, 92, 56, 10, 1] +} + +# Convert the dictionary into a DataFrame +df = pd.DataFrame(data) + +# Create the funnel chart with title "Job Search" +fig = px.funnel(df, x='Job Applications', y='Stage', title='Job Search') + +# Show the chart +fig.show() +``` + +The above example produces the following output: + +![Funnel Chart Illustrating Job Search](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotly-express-funnel-example1.png) + +## Example 2 + +As a variation of the previous example, this example adds subplots using the `facet_col` parameter to compare two different job applicants side by side: + +```py +import plotly.express as px +import pandas as pd + +# Create sample dictionary +data = { + 'Stage': ['Applications Sent', 'Phone Interview', 'Technical Interview', 'Onsite Interview', 'Offers Received', 'Offers Accepted'] * 2, + 'Job Applications': [500, 348, 92, 56, 10, 1, 500, 329, 290, 225, 167, 1], + 'Applicants': ['Candidate 1'] * 6 + ['Candidate 2'] * 6 +} + +# Convert the dictionary into a DataFrame +df = pd.DataFrame(data) + +# Create the funnel chart with title "Job Search Comparison" +fig = px.funnel(df, x='Job Applications', y='Stage', facet_col='Applicants', title='Job Search Comparison') + +# Show the chart +fig.show() +``` + +The above code will result in the following output: + +![Funnel Chart Comparing Two Applicants](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotly-express-funnel-example2.png) diff --git a/media/plotly-express-funnel-example1.png b/media/plotly-express-funnel-example1.png new file mode 100644 index 0000000000000000000000000000000000000000..b347877f3bf9bfbe99dfb9f470bbc085f775d09a GIT binary patch literal 21888 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 literal 0 HcmV?d00001 diff --git a/media/plotly-express-funnel-example2.png b/media/plotly-express-funnel-example2.png new file mode 100644 index 0000000000000000000000000000000000000000..24073624441ca30850590d8ad48d0ab453195263 GIT binary patch literal 26928 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 Date: Sat, 12 Oct 2024 02:08:28 -0500 Subject: [PATCH 012/108] [New Term for Existing Concept Entry] Pytorch Tensor .size() (#5088) * [New Term for Existing Concept Entry] Pytorch: .size() Add a new term entry about the .size() method for Tensors. * Add more detail to introduction * Changes for code review * Update size.md for code review * Update size.md minor changes * fized formatting and path * Update size.md minor changes * Update size.md fixed issues --------- --- .../concepts/tensors/terms/size/size.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/size/size.md diff --git a/content/pytorch/concepts/tensors/terms/size/size.md b/content/pytorch/concepts/tensors/terms/size/size.md new file mode 100644 index 00000000000..0f18794a6fd --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/size/size.md @@ -0,0 +1,48 @@ +--- +Title: '.size()' +Description: 'Returns the size of the self tensor as a tuple of integers.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Data Structures' + - 'Deep Learning' + - 'Methods' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +The **`size()`** method in PyTorch returns a `torch.Size` object containing the size (shape) information of a tensor. It serves as a fundamental function for dynamically obtaining the tensor's shape during operations. Specific dimensions can be accessed by indexing into the `torch.Size` object, which functions like a tuple. + +## Syntax + +```pseudo +tensor.size(dim=None) +``` + +- `tensor`: The PyTorch tensor on which the `.size()` method is called. +- `dim` (Optional): Specifies the dimension for which to retrieve the size. The default value is `None`. + - If `dim` is not provided, the returned value is a `torch.Size` object representing the size of all dimensions. + - If `dim` is specified, the returned value is an `int` representing the size of the given dimension. + +## Example + +The following example shows how to use the `.size()` method: + +```py +import torch + +t = torch.empty(3, 4, 5) + +print(t.size()) +print(t.size(dim=1)) +``` + +The code above generates the following output: + +```shell +torch.Size([3, 4, 5]) +4 +``` From 7caf8918f4782225de530d5c35554d5c5a236978 Mon Sep 17 00:00:00 2001 From: simin75simin <50899460+simin75simin@users.noreply.github.com> Date: Sat, 12 Oct 2024 15:33:06 +0800 Subject: [PATCH 013/108] AI A Star Search Edit (Added Code & Complexity) (#5412) * siminsimin: added a-star-search code block, complexity analysis * Minor changes * minor tag fix * Update a-star-search.md fixed lint issues and formatting --------- --- .../terms/a-star-search/a-star-search.md | 104 +++++++++++++++++- 1 file changed, 101 insertions(+), 3 deletions(-) diff --git a/content/ai/concepts/search-algorithms/terms/a-star-search/a-star-search.md b/content/ai/concepts/search-algorithms/terms/a-star-search/a-star-search.md index 7673cd2c82f..f1d7e46eb5c 100644 --- a/content/ai/concepts/search-algorithms/terms/a-star-search/a-star-search.md +++ b/content/ai/concepts/search-algorithms/terms/a-star-search/a-star-search.md @@ -88,14 +88,112 @@ Exploring **C**: ![a-star-6](https://raw.githubusercontent.com/Codecademy/docs/main/media/a-star-tree-6.png) -The next node in the open list is again **B**. However, because **B** has already been explored, meaning a shortest path to **B** has been found, it is not explored again and the algorithm continues to the next candidate. +The next node in the open list is again **B**. However, because **B** has already been explored, meaning the shortest path to **B** has been found, it is not explored again, and the algorithm continues to the next candidate. ![a-star-7](https://raw.githubusercontent.com/Codecademy/docs/main/media/a-star-tree-7.png) -The next node to be explored is the goal node **G**, meaning the shortest path to **G** has been found! The path is constructed by tracing the graph backward from **G** to **S**: +The next node to be explored is the goal node **G**, meaning the shortest path to **G** has been found! The path is constructed by tracing the graph backwards from **G** to **S**: ![a-star-8](https://raw.githubusercontent.com/Codecademy/docs/main/media/a-star-tree-8.png) ## Using the A\* Algorithm -This algorithm is guaranteed to find a shortest path if one exists. One of the main uses of this algorithm is route planning. However, there are many other uses. +This algorithm is guaranteed to find the shortest path if one exists. One of the main uses of this algorithm is route planning, but there are many other uses. + +## Example Code + +Here is an example of the A\* algorithm implemented in Python that solves the above example graph: + +```py +from heapq import heappop, heappush + +def a_star_search(graph: dict, start: str, goal: str, heuristic_values: dict) -> int: + ''' + A* search algorithm implementation. + + @param graph: The graph to search. + @param start: The starting node. + @param goal: The goal node. + @param heuristic_values: The heuristic values for each node. The goal node must be admissible, and the heuristic value must be 0. + @return: The path cost from the start node to the goal node. + ''' + + # A min heap is used to implement the priority queue for the open list. + # The heapq module from Python's standard library is utilized. + # Entries in the heap are tuples of the form (cost, node), ensuring that the entry with the lowest cost is always smaller during comparisons. + # The heapify operation is not required, as the heapq module maintains the heap invariant after every push and pop operation. + + # The closed list is implemented as a set for efficient membership checking. + + open_list, closed_list = [(heuristic_values[start], start)], set() + + while open_list: + cost, node = heappop(open_list) + + # The algorithm ends when the goal node has been explored, NOT when it is added to the open list. + if node == goal: + return cost + + if node in closed_list: + continue + + closed_list.add(node) + + # Subtract the heuristic value as it was overcounted. + cost -= heuristic_values[node] + + for neighbor, edge_cost in graph[node]: + if neighbor in closed_list: + continue + + # f(x) = g(x) + h(x), where g(x) is the path cost and h(x) is the heuristic. + neighbor_cost = cost + edge_cost + heuristic_values[neighbor] + heappush(open_list, (neighbor_cost, neighbor)) + + return -1 # No path found + +EXAMPLE_GRAPH = { + 'S': [('A', 4), ('B', 10), ('C', 11)], + 'A': [('B', 8), ('D', 5)], + 'B': [('D', 15)], + 'C': [('D', 8), ('E', 20), ('F', 2)], + 'D': [('F', 1), ('I', 20), ('H', 16)], + 'E': [('G', 19)], + 'F': [('G', 13)], + 'H': [('J', 2), ('I', 1)], + 'I': [('K', 13), ('G', 5), ('J', 5)], + 'J': [('K', 7)], + 'K': [('G', 16)] +} + +# Node heuristic values (admissible heuristic values for the nodes) +EXAMPLE_HEURISTIC_VALUES = { + 'S': 7, + 'A': 8, + 'B': 6, + 'C': 5, + 'D': 5, + 'E': 3, + 'F': 3, + 'G': 0, + 'H': 7, + 'I': 4, + 'J': 5, + 'K': 3 +} + +EXAMPLE_RESULT = a_star_search(EXAMPLE_GRAPH, 'S', 'G', EXAMPLE_HEURISTIC_VALUES) +print(EXAMPLE_RESULT) +``` + +The code above produces the following output: + +```shell +23 +``` + +## Complexity Analysis + +For time complexity, one might notice that each heappush corresponds to an edge, which would be the dominating complexity for most cases. Indeed, A\* is equivalent to Dijkstra's algorithm when the heuristic function is 0, and A\* is equivalent to Dijkstra's algorithm with reduced cost when the heuristic function is admissible i.e. `O(V+Elog(V))` time complexity. + +However, a good heuristic function can drastically decrease A*'s complexity. The idea here is we need to look at exponentially fewer nodes with a better heuristic. So the time and space complexity are actually `O(b1^d)`, where b1 is the effective branching factor, i.e., an empirical average of neighboring nodes not in the closed list, and d is the search depth, i.e., optimal path length. The large space complexity is the biggest disadvantage of the A* search, giving rise to other algorithm variations. From c3e997015a4e3cbfe530a3fcfe5ecbac381c01d0 Mon Sep 17 00:00:00 2001 From: Chloe Date: Sun, 13 Oct 2024 13:30:59 +0100 Subject: [PATCH 014/108] Update javascript concept of this entry (#5457) * updating javascript this entry * removed unnecessary marking styling * Update this.md minor changes --------- Co-authored-by: Mamta Wardhani --- content/javascript/concepts/this/this.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/javascript/concepts/this/this.md b/content/javascript/concepts/this/this.md index aa7b7d3677d..23c7a9d3882 100644 --- a/content/javascript/concepts/this/this.md +++ b/content/javascript/concepts/this/this.md @@ -1,6 +1,6 @@ --- Title: 'this' -Description: 'In JavaScript, the this keyword can have several meanings depending on the execution context. Most often it is used within a method of an object to return the instance of the object whose function is being executed, but what this returns can vary depending on the context.' +Description: 'It is often used within an object method, but what it refers to will vary depending on the execution context.' Subjects: - 'Web Development' - 'Computer Science' From 68146cf9ea0cda22fcef3c6c45a39d73d69db28e Mon Sep 17 00:00:00 2001 From: Manish Giri Date: Sun, 13 Oct 2024 07:52:19 -0500 Subject: [PATCH 015/108] Updating Python hash description (#5440) Co-authored-by: Mamta Wardhani Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- .../concepts/built-in-functions/terms/hash/hash.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/python/concepts/built-in-functions/terms/hash/hash.md b/content/python/concepts/built-in-functions/terms/hash/hash.md index 83b616ee996..e57df598390 100644 --- a/content/python/concepts/built-in-functions/terms/hash/hash.md +++ b/content/python/concepts/built-in-functions/terms/hash/hash.md @@ -14,7 +14,7 @@ CatalogContent: - 'paths/computer-science' --- -The built-in **`hash()`** function returns the hash value of an object as a fixed sized integer. The object can be of various types, including numbers, strings, tuples, or custom objects that have implemented the `__hash__()` method. The hash value is computed using a specific hashing algorithm based on the object's type. It's worth noting that the `hash()` function is a built-in function in Python and doesn't require any import statements. Hash values are useful for efficient comparison of dictionary keys during lookups. +The built-in **`hash()`** function returns a fixed-size integer hash value for an object, such as numbers, strings, tuples, or custom objects implementing the `__hash__()` method. Using type-specific algorithms, it facilitates efficient dictionary key comparisons during lookups. It can be used directly without requiring any imports. ## Syntax @@ -28,11 +28,11 @@ The `object` can be of any hashable type, such as numbers, strings, tuples, or c ## Example -The example below begins by defining a class called `MyClass` with an attribute called value. The `__hash__()` method is implemented to customize the hashing behavior based on the value attribute using the `hash()` function. +The example below defines a class called `MyClass`, with an attribute called `value`. The `__hash__()` method is implemented to customize the hashing behavior based on the `value` attribute. -Two instances of `MyClass` `obj1` and `obj2`, are created with different values. The `hash()` function is used to calculate the hash values of these objects. And these values are then printed to the console. +Two instances of `MyClass`, `obj1` and `obj2`, are created with different values. The `hash()` function is used to calculate the hash values of these objects. These values are then printed to the console. -This example demonstrates how to customize the hash function for a class using the `__hash__()` method. The `hash()` function allows us to obtain the hash value of an object, which is an integer used for quick comparison and dictionary key lookups. +This example demonstrates how to customize the hash function for a custom class using the `__hash__()` method. ```py # Define a class @@ -54,7 +54,7 @@ print(hash(obj2)) ## Codebyte Example -In the example below, we define `my_tuple` as "1, 2, 3". Subsequently, we use the `hash()` function to obtain the hash value of the input `my_tuple`. Followed by a call to print the output of the `hash()` function. +In the example below, we define `my_tuple` as `(1, 2, 3)`. Subsequently, we use the `hash()` function to obtain the hash value of the input `my_tuple`. Then, we print the output of the `hash()` function. ```codebyte/python my_tuple = (1, 2, 3) From f10103d437afc6de6bda6b3c8ae0c3bf3a907f7a Mon Sep 17 00:00:00 2001 From: codecademydev Date: Sun, 13 Oct 2024 13:07:09 +0000 Subject: [PATCH 016/108] =?UTF-8?q?=F0=9F=A4=96=20update=20concept=20of=20?= =?UTF-8?q?the=20week?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/concept-of-the-week.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/concept-of-the-week.txt b/bin/concept-of-the-week.txt index a71a382e779..a295dd39afa 100644 --- a/bin/concept-of-the-week.txt +++ b/bin/concept-of-the-week.txt @@ -1 +1 @@ -content/uiux/concepts/logo/logo.md \ No newline at end of file +content/java/concepts/priorityqueue/priorityqueue.md \ No newline at end of file From 56aa4f154218c7a10789e68d587a5ef412ffc817 Mon Sep 17 00:00:00 2001 From: ChinoUkaegbu <77782533+ChinoUkaegbu@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:14:38 +0100 Subject: [PATCH 017/108] edit: add Codebyte example to transpose.md (#5437) * add Codebyte example to transpose.md * Update transpose.md minor changes --------- Co-authored-by: Mamta Wardhani Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- .../terms/transpose/transpose.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/content/numpy/concepts/built-in-functions/terms/transpose/transpose.md b/content/numpy/concepts/built-in-functions/terms/transpose/transpose.md index 5438d324ebf..698658f0516 100644 --- a/content/numpy/concepts/built-in-functions/terms/transpose/transpose.md +++ b/content/numpy/concepts/built-in-functions/terms/transpose/transpose.md @@ -29,7 +29,7 @@ If possible, the `ndarray` returned will be a view of the original `ndarray`'s d ## Example -The below example creates an `ndarray` and then uses `.transpose()` on it. +The below example creates an `ndarray` and then uses `.transpose()` on it: ```py import numpy as np @@ -50,3 +50,16 @@ This produces the following output: [2 5] [3 6]] ``` + +## Codebyte Example + +The `axes` argument allows control over the specific reordering of dimensions in a tensor. Run the below codebyte example to see how `.transpose()` can be used to rearrange the three dimensions of a 3D array: + +```codebyte/python +import numpy as np + +array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + +print(array_3d) +print(np.transpose(array_3d)) +``` From de8a3a70e5852b89dcbc088bd4364b0deeab5d6c Mon Sep 17 00:00:00 2001 From: shantanu <56212958+cigar-galaxy82@users.noreply.github.com> Date: Sun, 13 Oct 2024 23:49:24 +0530 Subject: [PATCH 018/108] [New entry] UNHEX() function in MySQL (#5283) * added file for unhex in mysql * Update unhex.md * Update unhex.md * Update unhex.md * Update unhex.md * Update unhex.md --------- Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- .../built-in-functions/terms/unhex/unhex.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 content/mysql/concepts/built-in-functions/terms/unhex/unhex.md diff --git a/content/mysql/concepts/built-in-functions/terms/unhex/unhex.md b/content/mysql/concepts/built-in-functions/terms/unhex/unhex.md new file mode 100644 index 00000000000..3d9cda18139 --- /dev/null +++ b/content/mysql/concepts/built-in-functions/terms/unhex/unhex.md @@ -0,0 +1,48 @@ +--- +Title: 'UNHEX()' +Description: 'Converts a hexadecimal string to its corresponding binary string.' +Subjects: + - 'Computer Science' + - 'Code Foundations' +Tags: + - 'Functions' + - 'Database' + - 'MySQL' + - 'Strings' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +The **`UNHEX()`** [function](https://www.codecademy.com/resources/docs/mysql/built-in-functions) is a build-in function in MySQL that converts a hexadecimal string to its corresponding binary string. Useful when we have data stored in hexadecimal format we can use `UNHEX()` function to convert it to the original binary form making it usable and understandable. + +## Syntax + +```pseudo +UNHEX(val); +``` + +- `val`: A hexadecimal string to be converted to its corresponding binary form. + +## Example + +The below example shows how `UNHEX()` function works. + +```sql +CREATE TABLE documents ( + id INT PRIMARY KEY, + content BLOB +); + +INSERT INTO documents (id, content) VALUES (1, UNHEX('636F6465636164656D79')); + +SELECT HEX(content) AS 'hex-content', CAST(content AS CHAR) AS readable_content +FROM documents +WHERE id = 1; +``` + +The output of the above code will be: + +| hex-content | readable-content | +| -------------------- | ---------------- | +| 636F6465636164656D79 | codecademy | From f0bbbe849954e9d0a1fbd25ab86d278ef3bd944f Mon Sep 17 00:00:00 2001 From: Manish Giri Date: Mon, 14 Oct 2024 08:08:42 -0500 Subject: [PATCH 019/108] Revising JS Substring concept (#5418) * Revising JS Substring concept * Update substring.md minor changes --------- --- .../concepts/substring/substring.md | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/content/javascript/concepts/substring/substring.md b/content/javascript/concepts/substring/substring.md index fe1603f31b8..7feea0b3ab3 100644 --- a/content/javascript/concepts/substring/substring.md +++ b/content/javascript/concepts/substring/substring.md @@ -1,6 +1,6 @@ --- Title: 'Substring' -Description: 'The .substring() method returns part of a string. If given two arguments, they are the start and end indexes of the characters returned. If given one argument, it returns characters from that point to the end of the string. javascript // Returns characters from startIndex to end of string string.substring(startIndex); // Returns characters from startIndex to endIndex string.substring(startIndex, endIndex); ' +Description: 'Extracts a portion of a string between two given indices and returns a new string. If only one index is given, it goes to the end.' Subjects: - 'Web Development' - 'Computer Science' @@ -13,31 +13,33 @@ CatalogContent: - 'paths/create-a-back-end-app-with-javascript' --- -The `.substring()` method returns part of a string. If given two arguments, they are the start and end indexes of the characters returned. If given one argument, it returns characters from that point to the end of the string. +The **`substring()`** method in JavaScript extracts a portion of a string from one position to another (exclusive) and returns a new string. If the second position is omitted, it returns characters from the first position to the end of the string. ## Syntax -```javascript +```pseudo // Returns characters from startIndex to end of string string.substring(startIndex); +``` + +Or alternatively: +```pseudo // Returns characters from startIndex to endIndex string.substring(startIndex, endIndex); ``` ## Details -- `.substring()` returns characters at the start index up to, but not including, the character at the end index. - -- If the end index is omitted `.substring()` returns characters at the start index up through the end of the string. +- `.substring()` returns characters from the start index up to, but not including, the character at the end index. -- If the start and end indexes are equal, `.substring()` returns an empty string. +- If the end index is omitted, `.substring()` returns characters from the start index through the end of the string. -- Indexes less than zero are interpreted as zero. +- If the start and end indices are equal, `.substring()` returns an empty string. -- Indexes that are `NaN` are treated as zero. +- Indices that are less than zero or are `NaN` are interpreted as zero. -- Indexes that are greater than `string.length` are treated as `string.length`. +- Indices that are greater than `string.length` are treated as `string.length`. - If the first argument is greater than the second argument, the first argument is treated as the end index and the second argument is treated as the start index. @@ -45,7 +47,7 @@ string.substring(startIndex, endIndex); Using `.substring()` to display characters from a given string. -```javascript +```js const str = 'Codecademy'; console.log(str.substring(0, 4)); @@ -62,7 +64,7 @@ console.log(str.substring(4, 99)); Using `.substring()` to display the last `6` characters from a given string. -```javascript +```js const str = 'Codecademy'; console.log(str.substring(str.length - 6)); From 8e874bd578ad971178fe9b5718c53cdfc883c85f Mon Sep 17 00:00:00 2001 From: Voice <121782238+Cibiyanna26@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:59:24 +0530 Subject: [PATCH 020/108] [Term Entry] C++ Deque: .push_back() * Term Entry: C++ Deque Push_Back() * Update content/cpp/concepts/deque/terms/push_back/push_back.md Co-authored-by: Mamta Wardhani * Modify: modifications made in deque push_back term * Update package.json fixed package json file * Update yarn.lock fixed yarn lock * Update push_back.md minor changes * Rename push_back.md to push-back.md corrected file name * [Term Entry]: Added C++ insert under Deque * Delete content/cpp/concepts/deque/terms/insert/insert.md * Minor changes --------- --- .../deque/terms/push-back/push-back.md | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 content/cpp/concepts/deque/terms/push-back/push-back.md diff --git a/content/cpp/concepts/deque/terms/push-back/push-back.md b/content/cpp/concepts/deque/terms/push-back/push-back.md new file mode 100644 index 00000000000..975ea2dcdcd --- /dev/null +++ b/content/cpp/concepts/deque/terms/push-back/push-back.md @@ -0,0 +1,84 @@ +--- +Title: '.push_back()' +Description: 'Adds an element to the end of the deque.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Containers' + - 'OOP' + - 'Classes' + - 'Deques' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, the **`.push_back()`** [method](https://www.codecademy.com/resources/docs/cpp/methods) adds an element to the end of the deque. + +## Syntax + +```pseudo +dequeName.push_back(value); +``` + +- `value`: The element to be added to the back of the deque. It can be of any [data type](https://www.codecademy.com/resources/docs/cpp/data-types) that the `dequeName` holds. + +## Example + +The example below showcases the use of the `.push_back()` method: + +```cpp +#include +#include + +int main() { + // Create a deque of integers + std::deque numbers; + + // Use .push_back() to add elements to the deque + numbers.push_back(10); + numbers.push_back(20); + numbers.push_back(30); + + // Display the elements of the deque + std::cout << "Deque contents: "; + + for (int num : numbers) { + std::cout << num << " "; + } + + std::cout << std::endl; + + return 0; +} +``` + +The above code generates the following output: + +```shell +Deque contents: 10 20 30 +``` + +## Codebyte Example + +The following codebyte adds several values to `myDeque` with the `.push_back()` method: + +```codebyte/cpp +#include +#include +#include + +int main() { + std::deque myDeque; + + myDeque.push_back("A"); + myDeque.push_back("B"); + myDeque.push_back("C"); + myDeque.push_back("D"); + + for (const auto& value : myDeque) { + std::cout << ' ' << value; + } +} +``` From 82a905eaf7b8af76be6ae572844ed0541edfdf6f Mon Sep 17 00:00:00 2001 From: akhyarr <112689445+rrayhka@users.noreply.github.com> Date: Mon, 14 Oct 2024 22:48:13 +0700 Subject: [PATCH 021/108] [Edit] Python Regex: re.sub() * Update sub.md * Update content/python/concepts/regex/terms/sub/sub.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Minor changes --------- --- .../python/concepts/regex/terms/sub/sub.md | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/content/python/concepts/regex/terms/sub/sub.md b/content/python/concepts/regex/terms/sub/sub.md index 6d08e21c41d..5feec3c1641 100644 --- a/content/python/concepts/regex/terms/sub/sub.md +++ b/content/python/concepts/regex/terms/sub/sub.md @@ -21,17 +21,13 @@ The **`re.sub()`** function replaces matching substrings with a new string for a re.sub(, , string, , ) ``` -A `` is a [regular expression](https://www.codecademy.com/resources/docs/general/regular-expressions) that can include any of the following: - -- A string: `Jane Smith` -- A character class code: `/w`, `/s`, `/d` -- A regex symbol: `$`, `|`, `^` - -The other arguments include: - -- The replacement string (``): `foo` -- An integer value for the number of replacements (``): `10` -- ``: `IGNORECASE`, `VERBOSE`, `DOTALL` +- ``: A [regular expression](https://www.codecademy.com/resources/docs/general/regular-expressions) pattern used to match substrings. + - A string: `Jane Smith` + - Character class codes: `/w`, `/s`, `/d` + - Regex symbols: `$`, `|`, `^` +- ``: The replacement argument. This can either be a string or a function. +- ``: An integer specifying the number of occurrences to replace. The default is to replace all matches. +- ``: Specifies additional options such as `IGNORECASE`, `VERBOSE`, `DOTALL`, etc. ## Example @@ -40,11 +36,14 @@ The following example replaces all occurrences of "BI" with "business intelligen ```py import re -blurb = '''The analytics firm uses a range of BI tools to visualize data. Their internal data science team suggests +def replace_business_intelligence(match): + return 'business intelligence' + +blurb = '''The analytics firm uses a range of BI tools to visualize data. Their internal data science team suggests bi tools may be their most valuable resource.''' -match = re.sub(r'bi','business intelligence',blurb,flags=re.IGNORECASE) -# The IGNORECASE flag allows for matches regardless of the case +# Use the function `replace_bussines_intelligence` as the replacement argument in re.sub() +match = re.sub(r'bi', replace_business_intelligence, blurb, flags=re.IGNORECASE) print(match) ``` @@ -63,10 +62,12 @@ Replace all numerical values with "REDACTED": ```codebyte/python import re -confidential_str = '''The suspect's bank account (#333344444) and pin (#9999) were found in his cell''' +def redact_numbers(match): + return 'REDACTED' + +confidential_str = '''The suspect's bank account (#333344444) and pin (#9999) were found in his cell.''' -redacted = re.sub(r'\d+', 'REDACTED', confidential_str) -# \d matches any numerical character +redacted = re.sub(r'\d+', redact_numbers, confidential_str) print(redacted) ``` From 8f4730e87a4f003e7c1ad02e3d618284f8779d5a Mon Sep 17 00:00:00 2001 From: rladner678 Date: Tue, 15 Oct 2024 02:16:43 -0400 Subject: [PATCH 022/108] [Term Entry] SQL Commands: PIVOT * Create PIVOT term for SQL command * Update pivot.md * Update pivot.md * Update pivot.md * Update pivot.md * Minor changes --------- --- .../concepts/commands/terms/pivot/pivot.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 content/sql/concepts/commands/terms/pivot/pivot.md diff --git a/content/sql/concepts/commands/terms/pivot/pivot.md b/content/sql/concepts/commands/terms/pivot/pivot.md new file mode 100644 index 00000000000..50bc1ebb674 --- /dev/null +++ b/content/sql/concepts/commands/terms/pivot/pivot.md @@ -0,0 +1,46 @@ +--- +Title: 'PIVOT' +Description: 'Transforms rows of a table into columns.' +Subjects: + - 'Data Science' + - 'Computer Science' +Tags: + - 'Database' + - 'Queries' + - 'Aggregate Functions' + - 'SQL Server' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +In SQL, the **`PIVOT`** command transforms rows of a table into columns. + +## Syntax + +```pseudo +SELECT column1, column2, ... +FROM table +PIVOT + ( + aggregate_function(column_to_be_aggregated) + FOR pivot_column IN (pivot_column_values) + ) AS alias_name; +``` + +- `alias_name`: The temporary name for the newly created pivot table. + +## Example + +The below example shows a table `transactions` containing three columns `customer_name`, `book_genre`, and `price`. Each row represents a transaction at a bookstore. The query below creates a temporary pivot table named `pivot_table` with columns `customer_name`, `scifi`, and `romance`. In this table, each row represents the aggregate price that the customers paid for books in each of these genres: + +```sql +SELECT + customer_name, + scifi, + romance +FROM + transactions PIVOT ( + SUM(price) FOR book_genre IN (scifi, romance) + ) AS pivot_table; +``` From da1d7c976c96642d8364690e33dc81be77e4998a Mon Sep 17 00:00:00 2001 From: Animesh Kumar Date: Tue, 15 Oct 2024 16:55:00 +0530 Subject: [PATCH 023/108] [Edit] C++ User Input #5389 (#5441) * edit getline.md to add new code example * Update changes based on feedback (edit getline.md to add codebyte example) * Update getline.md minor changes --------- --- .../user-input/terms/getline/getline.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/content/cpp/concepts/user-input/terms/getline/getline.md b/content/cpp/concepts/user-input/terms/getline/getline.md index 591ba728b81..57de2c18570 100644 --- a/content/cpp/concepts/user-input/terms/getline/getline.md +++ b/content/cpp/concepts/user-input/terms/getline/getline.md @@ -91,3 +91,27 @@ int main() { // Output: My pet's name is Nimbus! } ``` + +## Codebyte Example + +Run the following codebyte to understand how the `getline()` function works: + +```codebyte/cpp +#include +#include + +using namespace std; + +int main() { + string myString; + + cout << "Enter your input: \n"; + // Input: Codeacademy is awesome + getline(cin, myString); + + cout << myString << "!"; + // Output: Codeacademy is awesome! +} +``` + +In the above example, using traditional `cin >> myString` would result in only capturing the first word, "Codeacademy." This is because `cin >>` reads input until it encounters a space or newline. To read an entire line, including spaces and tabs, we use `getline(cin, myString)`, which captures the full input line as a single string. From 738cfa44f5f269dde780f0d91b35b332e5712ed7 Mon Sep 17 00:00:00 2001 From: India Doria <60370426+clamquarter@users.noreply.github.com> Date: Tue, 15 Oct 2024 04:53:01 -0700 Subject: [PATCH 024/108] Kotlin map() doc added (#5339) * added map dir and 1st draft of map() doc * added syntax, example, and psuedo code to map.md * Update content/kotlin/concepts/arrays/map/map.md * added new directory terms * made requested changes from pull request * Update map.md minor changes * Update map.md prettified --------- --- .../kotlin/concepts/arrays/terms/map/map.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 content/kotlin/concepts/arrays/terms/map/map.md diff --git a/content/kotlin/concepts/arrays/terms/map/map.md b/content/kotlin/concepts/arrays/terms/map/map.md new file mode 100644 index 00000000000..5f3c95be2b7 --- /dev/null +++ b/content/kotlin/concepts/arrays/terms/map/map.md @@ -0,0 +1,58 @@ +--- +Title: '.map()' +Description: 'Transforms elements in a collection by applying a specified transformation function, resulting in a new collection with the transformed values.' +Subjects: + - 'Code Foundations' + - 'Mobile Development' +Tags: + - 'Android' + - 'Arrays' + - 'Map' + - 'Kotlin' +CatalogContent: + - 'learn-kotlin' + - 'paths/computer-science' +--- + +In Kotlin, the **`.map()`** method transforms elements in a collection (Array, List, or Set) using the provided logic. It does not modify the original collection, ensuring data permanence, which can be useful in scenarios where the original data must remain unchanged. + +## Syntax + +```pseudo +fun Iterable.map(transform: (T) -> R): List +``` + +Or alternatively: + +```pseudo +fun Array.map(transform: (T) -> R): List +``` + +- `T`: The type of the elements in the original collection (or array). +- `R`: The type of the elements in the resulting list after transformation. +- `transform`: A function that takes an element of type `T` and returns a transformed value of type `R`. + +It returns a `List` containing the transformed elements. + +## Example + +The following example uses the `.map()` function: + +```kotlin +fun main() { + // Initialize an Array of numbers. + val numbers = arrayOf(4, 12, 14, 17, 8) + + // Use .map() to multiply each element by 2 + val doubledNumbers = numbers.map { it * 2 } // Transforms each element by multiplying it by 2 + + // Print the transformed array + println(doubledNumbers) +} +``` + +The code above generates the following output: + +```shell +[8, 24, 28, 34, 16] +``` From 4dba766f7ec0aa7843b12dbea74d059c0aee484d Mon Sep 17 00:00:00 2001 From: Christopher DeMille <35157020+cjdemille@users.noreply.github.com> Date: Wed, 16 Oct 2024 04:27:54 -0400 Subject: [PATCH 025/108] add getrandbits entry (#5102) * add getrandbits entry * make first reference bold * make first reference bold * Update content/python/concepts/random-module/terms/getrandbits/getrandbits.md * Update getrandbits.md minor changes * Update getrandbits.md fixed formating and lint issues --------- --- .../terms/getrandbits/getrandbits.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 content/python/concepts/random-module/terms/getrandbits/getrandbits.md diff --git a/content/python/concepts/random-module/terms/getrandbits/getrandbits.md b/content/python/concepts/random-module/terms/getrandbits/getrandbits.md new file mode 100644 index 00000000000..4e56eacf6de --- /dev/null +++ b/content/python/concepts/random-module/terms/getrandbits/getrandbits.md @@ -0,0 +1,55 @@ +--- +Title: '.getrandbits()' +Description: 'Generates an integer with a specified number of random bits.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Functions' + - 'Methods' + - 'Random' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +The Python random module generates an integer with a specified number of random bits using the **`.getrandbits()`** method. This method produces an integer value that is uniformly distributed across the range of possible values that can be represented with the specified number of bits. + +## Syntax + +```pseudo +random.getrandbits(k) +``` + +- `k`: The number of bits in the generated integer, which must be a non-negative integer. The result will range from 0 to 2k - 1. + +## Example + +In the example below, `.getrandbits()` returns an integer with 256 bits: + +```py +import random + +random_bits = random.getrandbits(256) + +print(random_bits) +``` + +The above code generates the following output: + +```shell +10657559295629545859200648092091505165182082957984693304497110910582120092295 +``` + +> **Note:** The output will change every time the code is run because `.getrandbits()` generates a new random integer each time it's called. + +## Codebyte Example + +Run the following codebyte to understand how the `.getrandbits()` method works: + +```codebyte/python +import random + +get_random = random.getrandbits(8) +print(get_random) +``` From a3bfce5033a671fe504d06c3aef4f75ab443f580 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Wed, 16 Oct 2024 12:05:02 +0300 Subject: [PATCH 026/108] update contribution guide (#5494) Signed-off-by: Emmanuel Ferdman --- documentation/content-standards.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/content-standards.md b/documentation/content-standards.md index b79ee50af9c..d71335317b9 100644 --- a/documentation/content-standards.md +++ b/documentation/content-standards.md @@ -115,4 +115,4 @@ Review the [Docs Style Guide](https://github.com/Codecademy/docs/blob/main/docum Check out the [concept entry template](https://github.com/Codecademy/docs/blob/main/documentation/concept-entry-template.md) and [term entry template](https://github.com/Codecademy/docs/blob/main/documentation/term-entry-template.md) in this folder. And take a look at [GitHub Issues](https://github.com/Codecademy/docs/issues) to see where help is needed! -For a refresher on how to make a Pull Request, head back to the [Contribution Guide](https://github.com/Codecademy/docs/blob/main/.github/CONTRIBUTING.md). 🎒 +For a refresher on how to make a Pull Request, head back to the [Contribution Guide](https://github.com/Codecademy/docs/blob/main/CONTRIBUTING.md). 🎒 From 01ba96514f06b75ea69bc10df7c66ea0c5005a5e Mon Sep 17 00:00:00 2001 From: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> Date: Wed, 16 Oct 2024 19:53:10 +0530 Subject: [PATCH 027/108] [Term Entry] PyTorch Tensors .full() (#5503) * New file has been added. * Update user-input.md * Update user-input.md * File has been added. * Update full.md fixed lint and format issues * Update full.md added output --------- --- .../concepts/tensors/terms/full/full.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/full/full.md diff --git a/content/pytorch/concepts/tensors/terms/full/full.md b/content/pytorch/concepts/tensors/terms/full/full.md new file mode 100644 index 00000000000..bd602ff4e24 --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/full/full.md @@ -0,0 +1,51 @@ +--- +Title: '.full()' +Description: 'Creates a tensor filled with a specified value, with the shape defined by the given dimensions.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Alias' + - 'Algorithms' + - 'Data' + - 'Data Structures' +CatalogContent: + - 'learn-python-3' + - 'intro-to-py-torch-and-neural-networks' +--- + +The **`.full()`** function creates a tensor of a specified shape, filled with a constant value. This function is particularly useful in machine learning and data science for efficiently managing tensors, as it allows the creation of tensors with predefined values. Additionally, it accepts several parameters that allow users to specify the shape, fill value, and other optional attributes like data type and device allocation. + +## Syntax + +```pseudo +torch.full(size, fill_value, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) +``` + +- `size`: A list or tuple that specifies the desired shape of the output tensor. +- `fill_value`: A scalar value that fills the tensor. +- `out` (optional): An existing tensor where the result will be stored, it must have the same shape as the output. +- `dtype` (optional): The desired data type of the output tensor. +- `layout` (optional): Desired layout of the returned tensor. Default value is `torch.strided`. +- `device` (optional): The device on which the tensor is to be allocated. +- `requires_grad (optional)`: A boolean value that indicates whether to track the operations on the tensor for gradient computation. By default this is `False`. + +## Example + +The below example code creates a _2x3_ tensor where all elements are set to _5_: + +```py +import torch + +# Create a 2x3 tensor filled with the value 5 +tensor = torch.full((2, 3), 5) +print(tensor) +``` + +The code above produces the following output: + +```shell +tensor([[5, 5, 5], + [5, 5, 5]]) +``` From dbf641e32cf626a6477d6937713d77278e4f1c37 Mon Sep 17 00:00:00 2001 From: AlexFernandes04 <83237575+AlexFernandes04@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:59:23 -0400 Subject: [PATCH 028/108] [Edit] JavaScript: Type Coercion * added content on primitive type coercion * Corrected implicit type coercion description Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/javascript/concepts/type-coercion/type-coercion.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/javascript/concepts/type-coercion/type-coercion.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * clarified implicit number coercion * added codebyte * Minor changes --------- --- .../concepts/type-coercion/type-coercion.md | 131 ++++++++++++++++-- 1 file changed, 122 insertions(+), 9 deletions(-) diff --git a/content/javascript/concepts/type-coercion/type-coercion.md b/content/javascript/concepts/type-coercion/type-coercion.md index 23bc5867d4e..f1daf442ad5 100644 --- a/content/javascript/concepts/type-coercion/type-coercion.md +++ b/content/javascript/concepts/type-coercion/type-coercion.md @@ -1,6 +1,6 @@ --- Title: 'Type Coercion' -Description: 'The modification of types in an expression in order to yield a result.' +Description: 'The process of converting a value from one data type to another.' Subjects: - 'Web Development' - 'Computer Science' @@ -14,25 +14,138 @@ CatalogContent: - 'paths/front-end-engineer-career-path' --- -**Type coercion** is the modification of a type within an expression in order to yield a result. In JavaScript expressions of mixed types are evaluated by default through type coercion. When strict type comparisons are required they should be implemented with the `===` and `!==` operators. +**Type coercion** is the process of converting a value from one data type to another (such as a string to number). It works on both primitive data types and objects. However, it always results in a primitive data type. -JavaScript is a relatively permissive language, and in many situations, such as mixed type expressions or function arguments the default behavior is to return a value, rather than an error. +Type coercion can be done both implicitly and explicitly. Explicit type coercion is the intentional conversion of a value from one data type to another and is typically done using native constructors such as `String()` without the `new` keyword in front of them. There is also implicit type coercion, in which values are converted from one data type to another by JavaScript. -## Mixed Type Expressions +## String Type Coercion -Expressions of mixed types are evaluated by changing one of the elements to match the other. For example, in the code below the string `6` is changed to a `number` type and will yield `true` and the product `36`. However, the use of values that have been evaluated in such an expression may lead to unintended results when this behavior is not expected. It is a best practice to use the alternative, strict comparison operators to avoid errors from this form of evaluation. +To coerce a value into a primitive string value explicitly, the `String()` function is used. To implicitly coerce a value into a string, the value simply needs to be added to an empty string. When coercing a string, the result is as expected, with the value staying the same, but the data type becomes a string. + +Here is an example: ```js -console.log(6 == '6'); -console.log(6 * '6'); +var a = 54.1; + +console.log(String(a)); +console.log(a + ''); -console.log(6 === '6'); +console.log(String(true)); +console.log(String(null)); ``` The code above will output: ```shell +54.1 +54.1 true -36 +null +``` + +## Number Type Coercion + +To explicitly coerce a value into a number, the `Number()` function is used. A value can be coerced implicitly by using it in a mathematical operation, such as subtracting 0 from it or multiplying it by 1 to not change its value. Implicit coercion will also occur if the value is used with a comparison operator such as `<`, a bitwise operator such as `|`, the unary `+` operator, or with any of the arithmetic operators. It's important to note that using a comparison operator to coerce a value to a number depends on the type of the operands. For example, if two strings are compared with a comparison operator, they will simply be compared lexicographically, and no type coercion will occur. + +Using `Number()` on booleans gives the expected results of `true` becoming `1` and `false` becoming `0`. When using `Number()` on a string, if the string's value is a valid number, it will successfully be converted into a number. If the string contains any non-numeric characters, the result will be `NaN`. An empty string returns `0`. + +Here is an example: + +```js +var a = '-76.2'; + +console.log(Number(a)); +console.log(a * 1); + +console.log(Number(true)); +console.log(Number(null)); +console.log(Number(undefined)); +console.log(Number('7km')); +``` + +The code above will output: + +```shell +-76.2 +-76.2 +1 +0 +NaN +NaN +``` + +## Boolean Type Coercion + +To explicitly coerce a value into a boolean, the `Boolean()` function is used. A value undergoes implicit coercion when used in a test expression for an `if` statement, `for` loop, `while` loop, or a ternary expression. A value can also undergo implict coercion when used as the left-hand operand to the logical operators (`||`, `&&`, and `!`). + +Nearly all possible values will convert into `true`, but only a handlful will convert into `false`. The values that will become false are: + +- `undefined` +- `null` +- `false` +- `0` +- `NaN` +- `""` + +All other values, including objects, when coerced to a boolean, will be converted into `true`. + +Here is an example: + +```js +var a = 'lamp'; + +console.log(Boolean(a)); +console.log(!!a); + +console.log(Boolean('')); +console.log(Boolean(null)); +``` + +The code above will output: + +```shell +true +true +false false ``` + +## Loose vs Strict Equals + +When using loose equals `==`, only the values of the operands are compared. If the values are of different types, one or both of the values will be implicitly coerced. On the other hand, strict equals `===` will not allow coercion and compares both the value and type of the operands. + +Here is an example: + +```js +var a = '12'; +var b = 12; + +console.log(a == b); +console.log(a === b); +``` + +The code above will output: + +```shell +true +false +``` + +## Codebyte Example + +The example below shows how type coercion works between a string and number with both loose and strict equals: + +```codebyte/javascript +var num = 5; +var str = "10"; + +var result1 = num + str; +var result2 = num * str; +var result3 = num == "5"; +var result4 = num === "5" + +console.log(result1); +console.log(result2); +console.log(result3); +console.log(result4); +``` From bacbe8bf9d7c4fb7f10114f4ee5b0c68932cd352 Mon Sep 17 00:00:00 2001 From: Sriparno Roy <89148144+Sriparno08@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:37:55 +0530 Subject: [PATCH 029/108] [Term Entry] PyTorch Tensor Operations: .mm() (#5328) * [Term Entry] PyTorch Tensors: .mm() * Update path * Update mm.md --------- Co-authored-by: shantanu <56212958+cigar-galaxy82@users.noreply.github.com> --- .../concepts/tensor-operations/terms/mm/mm.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/mm/mm.md diff --git a/content/pytorch/concepts/tensor-operations/terms/mm/mm.md b/content/pytorch/concepts/tensor-operations/terms/mm/mm.md new file mode 100644 index 00000000000..d29aff253c8 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/mm/mm.md @@ -0,0 +1,81 @@ +--- +Title: '.mm()' +Description: 'Calculates the matrix product of two given tensors.' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Arrays' + - 'Data Structures' + - 'Deep Learning' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +In PyTorch, the **`.mm()`** method calculates the matrix product of two given tensors. + +## Syntax + +```pseudo +torch.mm(ten1, ten2, *, out=None) +``` + +- `ten1`: The first tensor to be multiplied. +- `ten2`: The second tensor to be multiplied. +- `out` (Optional): The output tensor to be used. The default value is `None`. + +> **Note:** If `ten1` is a `(m x n)` tensor and `ten2` is a `(n x p)` tensor, then `out` will be a `(m x p)` tensor. + +## Example + +The following example demonstrates the usage of the `.mm()` method: + +```py +import torch + +# Define two tensors +ten1 = torch.tensor([[1, 2, 3], + [4, 3, 8], + [1, 7, 2]]) + +ten2 = torch.tensor([[2, 4, 1], + [1, 3, 6], + [2, 6, 5]]) + +# Multiply the tensors +out = torch.mm(ten1, ten2) + +print(out) +``` + +The above code produces the following output: + +```shell +tensor([[10, 28, 28], + [27, 73, 62], + [13, 37, 53]]) +``` + +## Codebyte Example + +The following codebyte example shows the use of the `.mm()` method: + +```codebyte/python +import torch + +# Define two tensors +ten1 = torch.tensor([[6, 8, 1], + [5, 2, 4], + [9, 3, 7]]) + +ten2 = torch.tensor([[9, 2, 3], + [7, 8, 4], + [6, 1, 5]]) + +# Multiply the tensors +out = torch.mm(ten1, ten2) + +print(out) +``` From 36c604cbf526519d6647839b760ac8e74b906157 Mon Sep 17 00:00:00 2001 From: Brahim Anjjar <61018662+braanj@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:09:43 +0100 Subject: [PATCH 030/108] [Edit] JavaScript: Bitwise Operators * Docs: Edit the javascript bitwise operators entry Rewrite the description and shorten it to less than 160 character. Modify and add operators definitions Add new examples * Docs: update the PR with the suggestions * Update the c# variables concept entry * Revert "Update the c# variables concept entry" This reverts commit 42f045e45d48c059cf0d7e858f01ba5dad78f653. * Fix typo * Minor changes --------- --- .../bitwise-operators/bitwise-operators.md | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/content/javascript/concepts/bitwise-operators/bitwise-operators.md b/content/javascript/concepts/bitwise-operators/bitwise-operators.md index cbaf3a57846..f441ed1227e 100644 --- a/content/javascript/concepts/bitwise-operators/bitwise-operators.md +++ b/content/javascript/concepts/bitwise-operators/bitwise-operators.md @@ -1,6 +1,6 @@ --- Title: 'Bitwise Operators' -Description: 'Bitwise operators in JavaScript operate on 32-bit operands. Internally, JavaScript converts 64-bit floating point numbers into 32-bit signed integers before performing the operation, it then converts back to 64-bit numbers to return the result. JavaScript uses the following bitwise operators: &, |, ^, ~, <<, >>, >>>.' +Description: 'Bitwise operators in JavaScript perform operations on binary representations of integers. They manipulate bits directly using AND, OR, XOR, NOT, shifts, etc.' Subjects: - 'Web Development' - 'Computer Science' @@ -8,10 +8,10 @@ Tags: - 'Operators' CatalogContent: - 'introduction-to-javascript' - - 'paths/create-a-back-end-app-with-javascript' + - 'paths/front-end-engineer-career-path' --- -Bitwise operators in JavaScript operate on 32-bit operands. Internally, JavaScript converts 64-bit floating point numbers into 32-bit signed integers before performing the operation, it then converts back to 64-bit numbers to return the result. +Bitwise operators in JavaScript perform operations on binary representations of integers. They manipulate bits directly using AND, OR, XOR, NOT, shifts, etc. JavaScript uses the following bitwise operators: @@ -25,11 +25,11 @@ JavaScript uses the following bitwise operators: | `>>` | Signed right shift | Pushes copies of leftmost bit in from left, rightmost bit falls off (preserves sign). | | `>>>` | Zero fill right shift | Pushes zeros in from left, rightmost bits fall off. | -## Examples +## AND -### AND +The AND (`&`) operator performs a bitwise AND on two numbers. The result is 1 only when both bits are 1: -```javascript +```js console.log(19 & 7); // Output: 3 // 10011 = 19 @@ -37,9 +37,11 @@ console.log(19 & 7); // Output: 3 // 00011 = 3 ``` -### OR +## OR -```javascript +The OR (`|`) operator performs a bitwise OR on two numbers. The result is 1 if either of the bits is 1: + +```js console.log(19 | 7); // Output: 23 // 10011 = 19 @@ -47,9 +49,11 @@ console.log(19 | 7); // Output: 23 // 10111 = 23 ``` -### XOR +## XOR + +The XOR (`^`) operator performs a bitwise XOR on two numbers. The result is 1 if the bits are different: -```javascript +```js console.log(19 ^ 7); // Output: 20 // 10011 = 19 @@ -57,33 +61,38 @@ console.log(19 ^ 7); // Output: 20 // 10100 = 20 ``` -### NOT +## NOT -Because integers are stored in two's complement -(to change the sign, invert the binary digits and add one) -a `~` operation will change the sign of the number and change the absolute value by one. +Because integers are stored in two's complement (to change the sign, the binary digits are first inverted and then `1` is added), a NOT (`~`) operation will change the sign of the number and change the absolute value by one: -```javascript +```js console.log(~19); // Output: -20 // 00000000000000000000000000010011 = 19 // 11111111111111111111111111101100 = -20 ``` -### Zero fill left shift +## Zero Fill Left Shift + +The zero fill left shift (`<<`) operator shifts the bits of a number to the left, pushing zeros in from the right. The leftmost bits fall off and are discarded: -```javascript +```js console.log(19 << 3); // Output: 152 // 00000000000000000000000000010011 = 19 // 00000000000000000000000010011000 = 152 + +console.log(5 << 2); // Output: 20 + +// 00000000000000000000000000000101 = 5 +// 00000000000000000000000000010100 = 20 ``` -### Signed right shift +## Signed Right Shift -The `>>` operator preserves the sign of the operand by pushing copies of the leftmost bit in from the left. +The signed right shift (`>>`) operator shifts the bits of a number to the right, pushing zeros in from the left. The rightmost bits fall off and are discarded: -```javascript +```js console.log(19 >> 3); // Output: 2 // 00000000000000000000000000010011 = 19 @@ -95,11 +104,11 @@ console.log(-20 >> 3); // Output: -3 // 11111111111111111111111111111101 = -3 ``` -### Zero fill right shift +## Zero Fill Right Shift -The `>>>` operator does not preserve the sign. It pushes zeros in from the left, pushing the sign bit out of its leftmost position. +The zero fill right shift (`>>>`) operator does not preserve the sign. It pushes zeros in from the left, pushing the sign bit out of its leftmost position: -```javascript +```js console.log(19 >>> 3); // Output: 2 // 00000000000000000000000000010011 = 19 From 9773f04342e1bbe4f2d9ecd0632adf420ec213bf Mon Sep 17 00:00:00 2001 From: ozearkhan Date: Thu, 17 Oct 2024 12:46:50 +0530 Subject: [PATCH 031/108] [Edit] CSS Position: left --- content/css/concepts/position/terms/left/left.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/css/concepts/position/terms/left/left.md b/content/css/concepts/position/terms/left/left.md index 5dff9085d9c..0ed30e7ff6e 100644 --- a/content/css/concepts/position/terms/left/left.md +++ b/content/css/concepts/position/terms/left/left.md @@ -43,7 +43,7 @@ Set the position of `.box` element `40px` off the left edge of the nearest relat } ``` -![Example of position being absolute](<(https://raw.githubusercontent.com/Codecademy/docs/main/media/example-css-left()-absolute.png)>) +![Example of position being absolute](https://raw.githubusercontent.com/Codecademy/docs/main/media/example-css-left%28%29-absolute.png) ## Example 2 @@ -59,4 +59,4 @@ Set the position of `.box` element `40px` from the elements left edge. } ``` -![Example of position being relative](<(https://raw.githubusercontent.com/Codecademy/docs/main/media/example-css-left()-relative.png)>) +![Example of position being relative](https://raw.githubusercontent.com/Codecademy/docs/main/media/example-css-left%28%29-relative.png) From d7e296e85f42e5cffdcb71659c0b7d2a5563ad6c Mon Sep 17 00:00:00 2001 From: Akriti Sengar <85075827+Tashuuuu@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:53:03 +0530 Subject: [PATCH 032/108] [Edit] AI: Machine Learning * Update machine-learning.md * Update machine-learning.md minor changes --------- --- .../concepts/machine-learning/machine-learning.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/ai/concepts/machine-learning/machine-learning.md b/content/ai/concepts/machine-learning/machine-learning.md index 5483d546047..887f6a2e80d 100644 --- a/content/ai/concepts/machine-learning/machine-learning.md +++ b/content/ai/concepts/machine-learning/machine-learning.md @@ -1,6 +1,6 @@ --- Title: 'Machine Learning' -Description: 'Machine learning (ML) is a discipline of computer science that relates to using data and algorithms to develop computer programs that improve their performance at tasks without being explicitly programmed to do so.' +Description: 'Machine learning is a branch of computer science that uses data and algorithms to create programs that enhance performance at tasks without explicit programming.' Subjects: - 'Machine Learning' - 'Data Science' @@ -16,7 +16,7 @@ CatalogContent: - 'paths/data-science' --- -**Machine learning (ML)** is a discipline of computer science that relates to using data and algorithms to develop computer programs that improve their performance at tasks without being explicitly programmed to do so. Machine Learning is considered a branch of Artificial Intelligence as some machine learning algorithms are designed to imitate the way that humans learn and interact with their environment. +**Machine learning (ML)** is a discipline of computer science that uses data and algorithms to develop computer programs that improve their performance at tasks without being explicitly programmed to do so. Machine Learning is considered a branch of Artificial Intelligence, as some machine learning algorithms are designed to imitate the way that humans learn and interact with their environment. ## Branches of Machine Learning @@ -38,13 +38,13 @@ Machine Learning algorithms that receive unlabeled data as input and produce a g - Clustering: Recognize patterns and structures in unlabeled data by grouping them into clusters. - K-Means: Categorizes data points into clusters based on their proximity to cluster centroids. - - Hierarchical Agglomerative Clustering: Groups data points into clusters based on various measures of similarity such as smallest average distance between all points, minimal variance between data points, or smallest maximum distance between data points. -- Dimensionality Reduction: Scale down the dimensions in the dataset from a high-dimensional space into a low-dimensional space, while maintaining the maximum amount of relevant information. + - Hierarchical Agglomerative Clustering: Groups data points into clusters based on various measures of similarity, such as the smallest average distance between all points, minimal variance between data points, or smallest maximum distance between data points. +- Dimensionality Reduction: Scale down the dimensions in the dataset from a high-dimensional space into a low-dimensional space while maintaining the maximum amount of relevant information. - Principal Component Analysis (PCA): Reduces the dimensionality of a dataset to the 'n' number of principal dimensions that contain the most valuable information. ### Reinforcement Learning -Machine learning algorithms that act as agents in an environment, which receive a current state, environment, reward, and goal as input and produce a policy of best action relative to the stated goal as output. +Machine learning algorithms that act as agents in an environment receive a current state, environment, reward, and goal as input and produce a policy of best action relative to the stated goal as output. - Model-Free: Act as trial-and-error algorithms that use only real samples of the environment to calculate optimal actions instead of the transition probability distribution to create a model of the environment. - Model-Based: Create models of the environment to generate predictions of the next state and reward to calculate optimal actions. @@ -52,7 +52,7 @@ Machine learning algorithms that act as agents in an environment, which receive Some methods used in reinforcement learning include: - Markov Decision Processes (MDPs): Use a model of the environment based on their state transition probability and reward functions to create a policy of optimal action and satisfy the Markov property. -- Monte-Carlo methods: Model-Free randomized algorithms that learn from episodes of experience whether continuous or terminal to calculate the value for a state based on the average return from those experiences. +- Monte-Carlo methods: Model-Free randomized algorithms that learn from episodes of experience, whether continuous or terminal, to calculate the value for a state based on the average return from those experiences. - Q-Learning/Deep Q-Learning: Model-Free algorithms that focus on maximizing the expected value of reward using q-tables, or artificial neural networks. ## Machine Learning vs. Deep Learning @@ -70,6 +70,6 @@ Based on the evaluation results, the model's user might modify the model's hyper ## Evaluation -There are several methods to accurately evaluate the performance of ML algorithms. Methods vary based on which algorithm is being evaluated, and for which purpose. For classifiers such as Logistic Regression, confusion matrices inform analysts of the number of true and false positives as well as negatives to calculate values such as recall, precision, and F1 scores. +There are several methods to accurately evaluate the performance of ML algorithms. Methods vary based on which algorithm is being evaluated and for which purpose. For classifiers such as Logistic Regression, confusion matrices inform analysts of the number of true and false positives as well as negatives to calculate values such as recall, precision, and F1 scores. These values help analysts understand if their models are underfitting or overfitting, which is critical to improving and maintaining their performance. From 3e914de54f46c2015bebb84a1770b9fd9d795611 Mon Sep 17 00:00:00 2001 From: Voice <121782238+Cibiyanna26@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:14:06 +0530 Subject: [PATCH 033/108] [Term Entry] C++ Deque: .insert() * Term Entry: C++ Deque Push_Back() * Update content/cpp/concepts/deque/terms/push_back/push_back.md Co-authored-by: Mamta Wardhani * Modify: modifications made in deque push_back term * Update package.json fixed package json file * Update yarn.lock fixed yarn lock * Update push_back.md minor changes * Rename push_back.md to push-back.md corrected file name * [Term Entry]: Added C++ insert under Deque * Modify: Changes made in c++ deque insert * Update insert.md minor changes * Update package.json * Update yarn.lock * Update insert.md alphabetical tags * Minor changes --------- --- .../cpp/concepts/deque/terms/insert/insert.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 content/cpp/concepts/deque/terms/insert/insert.md diff --git a/content/cpp/concepts/deque/terms/insert/insert.md b/content/cpp/concepts/deque/terms/insert/insert.md new file mode 100644 index 00000000000..699c899fa4f --- /dev/null +++ b/content/cpp/concepts/deque/terms/insert/insert.md @@ -0,0 +1,97 @@ +--- +Title: '.insert()' +Description: 'Inserts an element at a specified position in the deque.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Classes' + - 'Containers' + - 'Deques' + - 'OOP' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, the **`.insert()`** [method](https://www.codecademy.com/resources/docs/cpp/methods) inserts an element at a specified position in the deque. + +## Syntax + +There are some variations in the syntax for the `.insert()` method: + +```pseudo +dequeName.insert(iterator position, const value_type& val) +deque_name.insert(iterator position, size_type n, const value_type& val) +deque_name.insert(iterator position, InputIterator first, InputIterator last) +``` + +- `position`: An iterator pointing to the location where the new element(s) should be inserted. +- `val`: The element to be added to the deque. It can be of any [data type](https://www.codecademy.com/resources/docs/cpp/data-types) that `deque_name` holds. +- `n`: Specifies the number of elements to insert into the deque, each initialized to a copy of `val`. +- `first`: An iterator pointing to the beginning of a range of elements to be inserted into the deque. +- `last`: An iterator pointing to one past the last element in the range to be inserted, indicating that all elements from `first` (inclusive) to `last` (exclusive) will be added. + +## Example + +The example below showcases the use of the `.insert()` method: + +```cpp +#include +#include + +int main() { + // Create a deque of integers + std::deque numbers; + + // Add elements to the deque + numbers.push_back(10); + numbers.push_back(30); + + // Insert 20 at index 1 using .insert() + numbers.insert(numbers.begin() + 1, 20); + + // Display the elements of the deque + std::cout << "Deque contents: "; + + for (int num : numbers) { + std::cout << num << " "; + } + + std::cout << std::endl; + + return 0; +} +``` + +The above code generates the following output: + +```shell +Deque contents: 10 20 30 +``` + +## Codebyte Example + +Run the following codebyte example to understand the use of the `.insert()` method: + +```codebyte/cpp +#include +#include +#include + +int main() { + std::deque myDeque; + + myDeque.push_back("A"); + myDeque.push_back("C"); + + // Insert B at index 1 + myDeque.insert(myDeque.begin() + 1, "B"); + + myDeque.push_back("D"); + + for (const auto& value : myDeque) { + std::cout << ' ' << value; + } +} +``` From c1756023c27a156d0a87a38b9ed7e99b48c326ed Mon Sep 17 00:00:00 2001 From: Deepak Saldanha Date: Thu, 17 Oct 2024 15:56:47 +0530 Subject: [PATCH 034/108] [Concept Entry] SIMILAR TO in SQL (#5209) * Add concept entry doc for similar to * Update markdown linting issues for similar-to.md * changes post review-1 * changes post review-1 * Update similar-to.md * Minor changes * fix linting --------- --- .../operators/terms/similar-to/similar-to.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 content/sql/concepts/operators/terms/similar-to/similar-to.md diff --git a/content/sql/concepts/operators/terms/similar-to/similar-to.md b/content/sql/concepts/operators/terms/similar-to/similar-to.md new file mode 100644 index 00000000000..cb7d52e8f2a --- /dev/null +++ b/content/sql/concepts/operators/terms/similar-to/similar-to.md @@ -0,0 +1,95 @@ +--- +Title: 'SIMILAR TO' +Description: 'Used to compare a string to a regular expression' +Subjects: + - 'Data Science' + - 'Computer Science' +Tags: + - 'Operators' + - 'Database' + - 'Queries' + - 'PostgreSQL' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +The **`SIMILAR TO`** operator is primarily found in `PostgreSQL`. It returns `TRUE` if its pattern matches the given string; otherwise, it returns `FALSE`. This operator is similar to the `LIKE` operator used in other databases, such as SQL Server, MySQL, and Oracle SQL, and supports pattern matching via the use of [wildcards](https://www.codecademy.com/resources/docs/sql/wildcards). + +## Syntax + +`SIMILAR TO` is typically used conditionally with a `WHERE` clause to select rows based on a column matching a given string pattern. + +```pseudo +SELECT * +FROM table_name +WHERE column_name SIMILAR TO pattern; +``` + +The `pattern` here constitutes a string that includes the following wildcards: + +- `%`: Matches zero or more arbitrary characters. +- `_`: Matches exactly one arbitrary character. + +## Example 1 + +The following example selects every country from the `countries` table where the name starts with "M": + +```sql +SELECT * +FROM countries +WHERE country_name SIMILAR TO 'M%'; +``` + +Explanation: + +- `M`: The name must start with the letter "M". +- `%`: Matches zero or more characters after "M". + +Example Matches: + +- Mexico +- Malaysia + +## Example 2 + +The following example selects every `employee` from the `employees` table whose name starts with either `John` or `Jane`: + +```sql +SELECT * +FROM employees +WHERE name SIMILAR TO '(John|Jane)%'; +``` + +Explanation: + +- `(John|Jane)`: The name must start with either "John" or "Jane". +- `%`: Matches zero or more characters after "John" or "Jane". + +Example Matches: + +- Johnathan +- John Smith + +## Example 3 + +The following example selects `employees` whose name is either `John` or `Jane`, followed by a middle initial and a period: + +```sql +SELECT * +FROM employees +WHERE name SIMILAR TO '(John|Jane)_[A-Z].%'; +``` + +Explanation: + +- `(John|Jane)`: The name must start with either "John" or "Jane". +- `_`: Matches exactly one arbitrary character (in this case, a space or any other single character). +- `[A-Z]`: Matches a single uppercase letter, representing a middle initial. +- `.`: Matches a literal period (used after the middle initial). +- `%`: Matches zero or more characters after the period, such as a last name or other additional characters. + +Example Matches: + +- John A. Smith +- Jane B. Doe From c72720ee1bcb16d7fd1d1ebaed6c660f87528803 Mon Sep 17 00:00:00 2001 From: Aditya Jindal Date: Thu, 17 Oct 2024 18:23:55 +0530 Subject: [PATCH 035/108] Added Term Entry Position absolute (#5455) * Added Term Entry Position absolute * changes updated * Update absolute.md * Update absolute.md * Update absolute.md * updated the metadata * Update absolute.md * Update absolute.md * Update absolute.md * Update absolute.md * Update absolute.md minor changes * Update absolute.md prettified * Update absolute.md minor changes --------- --- .../position/terms/absolute/absolute.md | 129 ++++++++++++++++++ media/css-position-absolute-ex1.png | Bin 0 -> 54696 bytes media/css-position-absolute-ex2.png | Bin 0 -> 123248 bytes 3 files changed, 129 insertions(+) create mode 100644 content/css/concepts/position/terms/absolute/absolute.md create mode 100644 media/css-position-absolute-ex1.png create mode 100644 media/css-position-absolute-ex2.png diff --git a/content/css/concepts/position/terms/absolute/absolute.md b/content/css/concepts/position/terms/absolute/absolute.md new file mode 100644 index 00000000000..13d57a83466 --- /dev/null +++ b/content/css/concepts/position/terms/absolute/absolute.md @@ -0,0 +1,129 @@ +--- +Title: 'absolute' +Description: 'Places an element relative to its nearest positioned ancestor or the browser window.' +Subjects: + - 'Web Design' + - 'Web Development' +Tags: + - 'CSS' + - 'Positioning' +CatalogContent: + - 'learn-css' + - 'paths/front-end-engineer-career-path' +--- + +Places an element relative to its nearest positioned ancestor or the browser window. If an element has `position: absolute`; declared, it is removed from the normal document flow, so it does not affect the layout of surrounding elements. + +## Syntax + +```css +position: absolute; +``` + +When an element is set to `position: absolute`, the `top`, `right`, `bottom`, and `left` properties can be used to offset it from its normal position: + +```css +selector { + position: absolute; + top: ; + right: ; + bottom: ; + left: ; +} +``` + +- A `` is a measurable property it can have values such as `2px`, `30em`, and `10pt`. + +## Example 1 + +This example shows how absolute positioning works when the element is positioned relative to its parent container. By setting `top: 0` and `left: 0`, the `.box` sticks to the top-left corner of its parent. The `top`, `left`, `right`, or `bottom` can be adjusted to move it anywhere within the parent. + +```html +
+
Absolutely Positioned
+
+``` + +```css +.container { + position: relative; /* Important: This makes .box position relative to .container */ + + /* Optional styles for the example */ + width: 500px; + height: 300px; + background-color: #e9ecef; + border-radius: 8px; + border: 1px solid #dee2e6; + margin: 100px auto; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.box { + position: absolute; + top: 0px; + left: 0px; + + /* Optional styles for the example */ + width: 200px; + height: 120px; + background-color: #495057; + color: #f8f9fa; + display: flex; + justify-content: center; + align-items: center; + font-size: 18px; + border-radius: 4px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +} +``` + +Here's what the above example's output would look like: + +![Box at top-left of parent](https://raw.githubusercontent.com/Codecademy/docs/main/media/css-position-absolute-ex1.png) + +## Example 2 + +In the below example the parent container doesn't have `position: relative` (or any positioning), so the element with `position: absolute` will stick to the browser window. + +```html +
+
Absolutely Positioned
+
+``` + +```css +.container { + /* position: relative; */ + + /* Optional styles for the example */ + width: 500px; + height: 300px; + background-color: #e9ecef; + border-radius: 8px; + border: 1px solid #dee2e6; + margin: 100px auto; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.box { + position: absolute; + top: 0px; + left: 0px; + + /* Optional styles for the example */ + width: 200px; + height: 120px; + background-color: #495057; + color: #f8f9fa; + display: flex; + justify-content: center; + align-items: center; + font-size: 18px; + border-radius: 4px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +} +``` + +Here's what the above examples look like: + +![Box at top-left of the window](https://raw.githubusercontent.com/Codecademy/docs/main/media/css-position-absolute-ex2.png) diff --git a/media/css-position-absolute-ex1.png b/media/css-position-absolute-ex1.png new file mode 100644 index 0000000000000000000000000000000000000000..78092f507f8d7089686b78fe163774fe1285f95c GIT binary patch literal 54696 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 YxmA-FG~bhAz`ylt1K-bI9eMD-0I$rMH~;_u literal 0 HcmV?d00001 From bf89c06a41505b2533689de31f61b684326dcffa Mon Sep 17 00:00:00 2001 From: Deepak Saldanha Date: Thu, 17 Oct 2024 18:46:30 +0530 Subject: [PATCH 036/108] [Concept Entry]: Add codebyte example - sklearn concepts (#5335) * add codebyte example - sklearn concepts * remove space --------- Co-authored-by: shantanu <56212958+cigar-galaxy82@users.noreply.github.com> Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- .../multitask-classification.md | 25 +++++++ .../concepts/naive-bayes/naive-bayes.md | 68 +++++++++++++++++++ .../support-vector-machines.md | 25 +++++++ 3 files changed, 118 insertions(+) diff --git a/content/sklearn/concepts/multitask-classification/multitask-classification.md b/content/sklearn/concepts/multitask-classification/multitask-classification.md index e317c4673cd..2d84c48bc80 100644 --- a/content/sklearn/concepts/multitask-classification/multitask-classification.md +++ b/content/sklearn/concepts/multitask-classification/multitask-classification.md @@ -65,3 +65,28 @@ Predicted labels (Quality, Demand): [[0 1]] ``` In the above output, `0` indicates _low quality_ and `1` indicates _high demand_. + +## Codebyte Example + +The following codebyte example trains a Random Forest classifier for multilabel classification on synthetic data and +predicts the quality and demand for a new product. + +```codebyte/python +from sklearn.ensemble import RandomForestClassifier +from sklearn.datasets import make_multilabel_classification + +# Generate example data for multitask classification +X, y = make_multilabel_classification(n_samples=100, n_features=10, n_classes=2, n_labels=1, random_state=42) + +# Create and train the model +model = RandomForestClassifier(random_state=42) +model.fit(X, y) + +# New product data to predict +new_product = [[0.6, 1.5, -0.2, 0.9, 2.0, -1.1, 1.3, 0.6, 1.2, -0.8]] + +# Predict the quality and demand for the new product +predictions = model.predict(new_product) + +print("Predicted labels (Quality, Demand):", predictions) +``` diff --git a/content/sklearn/concepts/naive-bayes/naive-bayes.md b/content/sklearn/concepts/naive-bayes/naive-bayes.md index 451da49d28b..30ffdc8f22c 100644 --- a/content/sklearn/concepts/naive-bayes/naive-bayes.md +++ b/content/sklearn/concepts/naive-bayes/naive-bayes.md @@ -23,3 +23,71 @@ Typically, a preprocessed dataset is divided into training and testing sets. The - **Categorical Naive Bayes**: Designed for features that can be separated into distinct categories (e.g., predicting a person’s favorite sport based on gender and preferred weather). - **Gaussian Naive Bayes**: Designed for continuous features. It assumes that features follow a Gaussian distribution curve and determines the most likely class for an instance by calculating the probability of each class. - **Complement Naive Bayes**: Designed to address the limitations of the standard Multinomial Naive Bayes classifier when dealing with imbalanced datasets. Imbalanced datasets are those where some classes have significantly more examples than others. + +## Example + +```py +import numpy as np +from sklearn.naive_bayes import GaussianNB +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score + +# Create random dataset for classification +n = 100 # 100 data points +X = 6 * np.random.rand(n, 2) - 3 # 2 features +y = (X[:, 0] + X[:, 1] > 1).astype(int) # Class labels based on sum of features + +# Split the dataset into training and testing sets +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Instantiate the Naive Bayes model +model = GaussianNB() + +# Fit the model to the training data +model.fit(X_train, y_train) + +# Predict the labels for the test data +y_prediction = model.predict(X_test) + +# Print predicted values +print("Predicted Labels: ", y_prediction) +``` + +Here is the output for the above example: + +```shell +Predicted Labels: [1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0] +``` + +## Codebyte Example + +The following codebyte example demonstrates the use of a random dataset for classification using the Naive-Bayes model: + +```codebyte/python +import numpy as np +from sklearn.naive_bayes import GaussianNB +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score + +# Create random dataset for classification +n = 100 # 100 data points +X = 6 * np.random.rand(n, 2) - 3 # 2 features +y = (X[:, 0] + X[:, 1] > 1).astype(int) # Class labels based on sum of features + +# Split the dataset into training and testing sets +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Instantiate the Naive Bayes model +model = GaussianNB() + +# Fit the model to the training data +model.fit(X_train, y_train) + +# Predict the labels for the test data +y_prediction = model.predict(X_test) + +# Print predicted values and accuracy +print("Predicted Labels: ", y_prediction) +``` + +> Note: The output predictions will vary due to the random generation of training data and noise in the model. diff --git a/content/sklearn/concepts/support-vector-machines/support-vector-machines.md b/content/sklearn/concepts/support-vector-machines/support-vector-machines.md index 7d0f9a1a490..0bbcd69cf40 100644 --- a/content/sklearn/concepts/support-vector-machines/support-vector-machines.md +++ b/content/sklearn/concepts/support-vector-machines/support-vector-machines.md @@ -82,3 +82,28 @@ The output of the above code will be: ```shell Predicted class: 1 ``` + +## Codebyte Example + +This codebyte example demonstrates the use of a Support Vector Classifier (SVC) with a +linear kernel on a synthetic two-class dataset and predicts the class of a new data point: + +```codebyte/python +from sklearn.svm import SVC +from sklearn.datasets import make_blobs + +# Generate sample data with two classes +X, y = make_blobs(n_samples=500, centers=2, random_state=0, cluster_std=0.6) + +# Define and train the SVC model +model = SVC(kernel='linear', C=1.0) +model.fit(X, y) + +# New data point to predict +new_data = [[5, 1.5]] + +# Predict the class of the new data +prediction = model.predict(new_data) + +print("Predicted class:", prediction[0]) +``` From 50a87acdc17f4559ad601f295793477433037d31 Mon Sep 17 00:00:00 2001 From: PaSchue <126733208+PaSchue@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:13:08 +0200 Subject: [PATCH 037/108] Virtual Environments with pip (#5300) * Add Section about Virtual Environments * Review venv section * Correct spelling errors * Minor changes --------- Co-authored-by: Sriparno Roy <89148144+Sriparno08@users.noreply.github.com> Co-authored-by: Sriparno Roy Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- content/python/concepts/pip/pip.md | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/content/python/concepts/pip/pip.md b/content/python/concepts/pip/pip.md index 55ed036ecc6..15523989466 100644 --- a/content/python/concepts/pip/pip.md +++ b/content/python/concepts/pip/pip.md @@ -73,3 +73,61 @@ Finally, it is now possible to start installing packages from PyPI. In the follo ```shell py -m pip install ACoolPackage ``` + +## Virtual Environments with `pip` + +Managing dependencies effectively is crucial when working on multiple Python projects. Without isolation, different projects might require different versions of the same package, which can lead to conflicts. This is where virtual environments come in. They allow users to create isolated environments for each project, ensuring that dependencies do not interfere with one another. + +### Setting Up a Virtual Environment + +The step-by-step process of setting up a virtual environment is described below. + +Step 1: Create a virtual environment + +```shell +python -m venv venv_name +``` + +This creates a new directory (`venv_name`) that contains a standalone Python installation and a local copy of `pip`. + +Step 2: Activate the virtual environment + +```shell +# Windows +venv_name\Scripts\activate + +# Linux/macOS +source venv_name/bin/activate +``` + +After activation, any `pip` commands will install packages only within the virtual environment, ensuring isolation. + +Step 3: Install dependencies + +Once the environment is activated, the project's dependencies can be installed: + +```shell +pip install -r requirements.txt +``` + +Step 4: Deactivate the virtual environment + +When the usage is complete, the virtual environment can be deactivated by simply running: + +```shell +deactivate +``` + +### Generating a `requirements.txt` File + +To help others reproduce the environment, a `requirements.txt` file can be generated. This file lists all the installed packages and their versions: + +```shell +pip freeze > requirements.txt +``` + +This file can then be used to create the same environment by running: + +```shell +pip install -r requirements.txt +``` From 6a6645731245fa48e22f5663e95b1a12aa9690c2 Mon Sep 17 00:00:00 2001 From: Brahim Anjjar <61018662+braanj@users.noreply.github.com> Date: Fri, 18 Oct 2024 05:40:58 +0100 Subject: [PATCH 038/108] Edit csharp deque entry (#5454) * Update the c# variables concept entry * Revert "Update the c# variables concept entry" This reverts commit 42f045e45d48c059cf0d7e858f01ba5dad78f653. * Update: edit the c# deque entry by adding new description and examples * Update entry * Update deque.md * removed output from codebyte --------- --- content/c-sharp/concepts/deque/deque.md | 55 ++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/content/c-sharp/concepts/deque/deque.md b/content/c-sharp/concepts/deque/deque.md index dad1bd08dc8..3f8b76227da 100644 --- a/content/c-sharp/concepts/deque/deque.md +++ b/content/c-sharp/concepts/deque/deque.md @@ -1,6 +1,6 @@ --- Title: 'Deque' -Description: 'A deque is a type of data structure that allows insert and delete elements at both ends.' +Description: 'Deque is a type of data structure that allows insertion and removal of elements from both the front and rear.' Subjects: - 'Computer Science' - 'Code Foundations' @@ -13,9 +13,11 @@ CatalogContent: - 'paths/computer-science' --- -A **deque** is a data structure that allows elements to be added or removed from both ends, making it more versatile than a traditional queue or stack. In `C#` there is no build-in `deque` but it can be impleted using `LinkedList` and `List` classes `C#`. +`Deque` (Double-Ended Queue) is a type of data structure that allows insertion and removal of elements from both the front and rear. In `C#`, it can be implemented using `LinkedList` and `List`. -## Implementing using LinkedList Class +## Creating a Deque using LinkedList Class + +To create a deque in `C#`, use `LinkedList`, where `T` defines the type of elements stored. ```pseudo LinkedList deque = new LinkedList(); @@ -23,7 +25,7 @@ LinkedList deque = new LinkedList(); - `T`: Specifies the element type. -## Example 1 +### Example The below example shows how to implement deque using `LinkedList`. @@ -65,7 +67,9 @@ Output: 3 ``` -## Implementing using List Class +## Creating a Deque using List Class + +To create a deque in `C#`, use `List`, where `T` defines the type of elements stored. ```pseudo List deque = new List(); @@ -73,7 +77,7 @@ List deque = new List(); - `T`: Specifies the element type. -## Example 2 +### Example The below example shows how to implement deque using `List`. @@ -107,3 +111,42 @@ class Program { } } ``` + +Output: + +```shell +1 +3 +``` + +## Codebyte Example + +Use this example to experiment with implementing a `Deque` using `LinkedList`. Enjoy coding! + +```codebyte/csharp +using System; +using System.Collections.Generic; + +public class Example +{ + public static void Main() + { + LinkedList deque = new LinkedList(); + + // Add elements to the front and rear + deque.AddLast(10); // Rear + deque.AddFirst(5); // Front + deque.AddLast(15); // Rear + + // Remove elements from front and rear + deque.RemoveFirst(); // Removes 5 (Front) + deque.RemoveLast(); // Removes 15 (Rear) + + // Display the remaining element + foreach (var item in deque) + { + Console.WriteLine(item); + } + } +} +``` From 00eb5173063747cad36cf54622d97dd0167f2a38 Mon Sep 17 00:00:00 2001 From: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:00:42 +0530 Subject: [PATCH 039/108] [Term Entry] C++ vector .back() (#5505) * New file has been added. * Update user-input.md * Update user-input.md * File has been modified. * Update content/cpp/concepts/vectors/terms/back/back.md * Errors Fixed --------- --- .../cpp/concepts/vectors/terms/back/back.md | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 content/cpp/concepts/vectors/terms/back/back.md diff --git a/content/cpp/concepts/vectors/terms/back/back.md b/content/cpp/concepts/vectors/terms/back/back.md new file mode 100644 index 00000000000..71e62e0dcb0 --- /dev/null +++ b/content/cpp/concepts/vectors/terms/back/back.md @@ -0,0 +1,64 @@ +--- +Title: '.back()' +Description: 'Used to access the last element in a vector.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Vectors' + - 'Programming' + - 'Data Structures' + - 'Methods' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +The C++ **`.back()`** method is used to access the last element in a vector. It views or modifies the element without removing it from the vector. This method is primarily used to access the most recently added element. + +## Syntax + +```pseudo +vectorName.back(); +``` + +## Example + +The below example shows the use of `.back()` method in c++ vectors, here `numbers` is a vector which has 5 elements in it and it displays the last element in the vector with the help of the `.back()` method, then the last element in the vector is modifies and the modified value is displayed. + +```cpp +#include +#include +//This is compulsory to include vectors while using vectors. + +int main(){ + std::vectornumbers = {10,20,40,50,60}; + std::cout<<"The last element in the vector is: "<< numbers.back()<< std::endl; + numbers.back() = 80; + std::cout <<"The last element in the vector after modification is: "< +#include +int main() { + std::vector numbers = {100, 90, 80, 70, 60}; + std::cout << numbers.back() << std::endl; + numbers.back() = 10; + std::cout << numbers.back() << std::endl; + return 0; +} +``` From 45475325f304d988730fa0aa9a5581f81bb92e17 Mon Sep 17 00:00:00 2001 From: ozearkhan Date: Fri, 18 Oct 2024 15:15:06 +0530 Subject: [PATCH 040/108] made the description below 150 characters (#5507) * made the description below 150 characters * Update exceptions.md minor changes --------- --- content/cpp/concepts/exceptions/exceptions.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/cpp/concepts/exceptions/exceptions.md b/content/cpp/concepts/exceptions/exceptions.md index 2414351fe40..08f02f785bf 100644 --- a/content/cpp/concepts/exceptions/exceptions.md +++ b/content/cpp/concepts/exceptions/exceptions.md @@ -1,20 +1,20 @@ --- Title: 'Exceptions' -Description: 'An Exception in C++ is the computers response to a problem that occurs while executing a programs code. If the code does not handle the exception, the program will stop running due to the error.' +Description: 'Exception is a runtime error that occurs during the execution of a program. If not handled, it stops the program execution.' Subjects: - 'Computer Science' - 'Game Development' Tags: - - 'Exceptions' - - 'Try' - 'Catch' - 'Errors' + - 'Exceptions' + - 'Try' CatalogContent: - 'learn-c-plus-plus' - 'paths/computer-science' --- -In C++, an **exception** is the computer's response to a problem that occurs while executing a program's code. The computer will create an exception, and if the code does not have a way to handle it, then the program will stop executing due to the error. +In C++, an **exception** is a runtime error that occurs during the execution of a program. If not handled, it stops the program execution. The computer will create an `exception`, and if the code does not have a way to handle it, then the program will stop executing due to the error. ## Catching an Exception From 801555f8da20dcdf0705a8612938ac92ba2ad927 Mon Sep 17 00:00:00 2001 From: Rashmit <163204184+RashmitTopG@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:28:22 +0530 Subject: [PATCH 041/108] Summarized the description of JS Modules (#5459) * Summarized the description of JS Modules * Summarized the description of JS Modules * Summarized the description of JS Modules * Updated file as per review * Update modules.md * Update modules.md minor changes * Update modules.md minor changes --------- --- content/javascript/concepts/modules/modules.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/content/javascript/concepts/modules/modules.md b/content/javascript/concepts/modules/modules.md index 77a52fd2b9b..8edcf5776f3 100644 --- a/content/javascript/concepts/modules/modules.md +++ b/content/javascript/concepts/modules/modules.md @@ -1,6 +1,6 @@ --- Title: 'Modules' -Description: 'As the program grows bigger, it may contain many lines of code. Instead of putting everything in a single file, modules can be used to separate codes in separate files as per their functionality. This makes the code more organized and easier to maintain. A module is a file that contains code that performs a specific task. A module may contain variables, functions, classes, etc. Suppose, a file named greetPerson.js contains the following code: js // Exporting a function export function greetPerson(name) { return Hi, ${name};' +Description: 'Modules organize code by separating related functions, classes, and variables into distinct files, making management and reuse easier in larger projects.' Subjects: - 'Web Development' - 'Computer Science' @@ -11,11 +11,9 @@ CatalogContent: - 'paths/front-end-engineer-career-path' --- -As the program grows bigger, it may contain many lines of code. Instead of putting everything in a single file, modules can be used to separate codes in separate files as per their functionality. This makes the code more organized and easier to maintain. +Modules divide large programs into separate files based on tasks, grouping related functions, variables, or classes for easier management and reuse. -A module is a file that contains code that performs a specific task. A module may contain variables, functions, classes, etc. - -Suppose, a file named **greetPerson.js** contains the following code: +Suppose a file named **greetPerson.js** contains the following code: ```js // Exporting a function @@ -87,9 +85,7 @@ Here, both the `name` variable and the `difference()` function from the **module ## Renaming Imports and Exports -If the objects (variables, functions, etc.) that you want to import are already present in your main file, the program may not behave as you want. In this case, the program takes value from the main file instead of the imported file. - -To avoid naming conflicts, you can rename these objects during the export or during the import. +To prevent naming conflicts, it is important to rename variables or functions when exporting or importing. This ensures the program uses the correct values from the intended file. ### Rename in the export file (the module) @@ -103,7 +99,7 @@ export { function1 as newName1, function2 as newName2 }; import { newName1, newName2 } from './module.js'; ``` -Here, while exporting the function from **module.js** file, new names (here, `newName1` & `newName2`) are given to the function. Hence, when importing that function, the new name is used to reference that function. +When exporting from module.js, new names (`newName1`, `newName2`) are assigned to functions, the new names must be used when importing and referencing them. ### Rename in the import file (the main file) @@ -117,7 +113,7 @@ export { function1, function2 }; import { function1 as newName1, function2 as newName2 } from './module.js'; ``` -Here, while importing the function, the new names (here, `newName1` & `newName2`) are used for the function name. Now you use the new names to reference these functions. +When importing the function, new names (`newName1`, `newName2`) are used. These new names are then used to reference the functions in the code. ## Default Export From aa355c2b1aee4e6d2ce66688cbb68621f6c13482 Mon Sep 17 00:00:00 2001 From: selena Date: Fri, 18 Oct 2024 03:44:07 -0700 Subject: [PATCH 042/108] [Edit] Python numpy - Added Codebyte example to append function (#5509) * Added Codebyte example to np append file * lint? * Update append.md minor changes --------- --- .../built-in-functions/terms/append/append.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/content/numpy/concepts/built-in-functions/terms/append/append.md b/content/numpy/concepts/built-in-functions/terms/append/append.md index 20069ca8e0a..ae1bc35378d 100644 --- a/content/numpy/concepts/built-in-functions/terms/append/append.md +++ b/content/numpy/concepts/built-in-functions/terms/append/append.md @@ -52,3 +52,26 @@ This produces the following output: [4 5 6] [7 8 9]] ``` + +## Codebyte Example + +The following example creates two arrays and demonstrates appending them using `.append()`, both without specifying an axis (resulting in a 1D array) and along specified axes (rows and columns): + +```codebyte/python +import numpy as np + +nd1 = np.array([[0,0,0,0], [1,1,1,1]]) +print("First array: \n", nd1) + +nd2 = np.arange(8).reshape(2, 4) +print("Second array: \n", nd2) + +nd3 = np.append(nd1, nd2) +print("Appended array with no axis specified:\n", nd3); + +nd4 = np.append(nd1, nd2, axis = 0) +print("Appended array on axis 0:\n", nd4); + +nd5 = np.append(nd1, nd2, axis = 1) +print("Appended array on axis 1:\n", nd5); +``` From 5638538488efa74e818aa717a7a52fa36b5f8245 Mon Sep 17 00:00:00 2001 From: Rashmit <163204184+RashmitTopG@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:16:51 +0530 Subject: [PATCH 043/108] Cpp variables (#5499) * Summarized the description of JS Modules * Summarized the description of JS Modules * Summarized the description of JS Modules * Modified Comments and added Definitions and CodeBlocks * Modified Comments and added Definitions and CodeBlocks * Fixed comments documentation and added definitions and codeblocks * Added Description for cpp variables * Fixed Documentation for cpp variables * Fixed Documentation for cpp variables * Fixed Documentation for cpp variables * Fixed Changes * Update variables.md minor changes * Update variables.md added output --------- --- content/cpp/concepts/variables/variables.md | 73 ++++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/content/cpp/concepts/variables/variables.md b/content/cpp/concepts/variables/variables.md index 7427b131431..21e0e7df5b0 100644 --- a/content/cpp/concepts/variables/variables.md +++ b/content/cpp/concepts/variables/variables.md @@ -1,6 +1,6 @@ --- Title: 'Variables' -Description: 'A variable refers to a storage location in the computer’s memory that one can set aside to save, retrieve, and manipulate data. To create a variable, the type must be specified and a value must be assigned to it.' +Description: 'A variable refers to a storage location in the computer’s memory that one can set aside to save, retrieve, and manipulate data.' Subjects: - 'Computer Science' - 'Game Development' @@ -12,11 +12,11 @@ CatalogContent: - 'paths/computer-science' --- -A **variable** refers to a storage location in the computer’s memory that one can set aside to save, retrieve, and manipulate data. +A **variable** refers to a storage location in the computer’s memory that one can set aside to save, retrieve, and manipulate data. Variables act as containers for storing information that can be changed or updated during the execution of a program. ## Declare a Variable -To create a variable, the type must be specified and a value must be assigned to it: +To declare a variable, the type of data the variable will hold must be specified, followed by the variable name. Optionally, a value can be assigned to the variable at the time of declaration: ```pseudo type name = value; @@ -46,8 +46,75 @@ The output would be: I am 30 years old. ``` +## Data Types in Variables + +Each variable in programming has a type, which defines the kind of data it can hold. Here are some common data types: + +- **int**: for integers (whole numbers), e.g., + +```cpp +int score = 10; +``` + +- **float**: A single-precision floating-point number, typically occupying 4 bytes (32 bits). It offers less precision and is used when memory efficiency is more important than accuracy, e.g., + +```cpp +float pi = 3.14159; +``` + +- **double**: A double-precision floating-point number, typically occupying 8 bytes (64 bits). It provides more precision and is the default choice when you need to store decimal numbers in C++. + +```cpp +double pi = 3.14159265358979323846; +``` + +- **char**: A single character, e.g., + +```cpp +char letter = 'A'; +``` + +- **bool**: for boolean values (true or false), e.g., + +```cpp +bool isAdmin = true; +``` + +## Example + +The below example shows the usage of variables: + +```cpp +#include + +int main() { + int age = 25; + double temperature = 36.6; + char initial = 'R'; + bool isSunny = true; + + std::cout << "Age: " << age << std::endl; + std::cout << "Temperature: " << temperature << "°C" << std::endl; + std::cout << "Initial: " << initial << std::endl; + std::cout << "Is it sunny? " << (isSunny ? "Yes" : "No") << std::endl; + + return 0; +} +``` + +The code above generates the following output: + +```shell +Age: 25 +Temperature: 36.6°C +Initial: R +Is it sunny? Yes +``` + ## Codebyte Example +Run the codebyte to understand how variables work: + ```codebyte/cpp #include From f3c054592521013927e5bfb27b2855144c6b286f Mon Sep 17 00:00:00 2001 From: Luca Arisci Date: Fri, 18 Oct 2024 17:48:33 +0200 Subject: [PATCH 044/108] Feat: [Term Entry] Python NumPy - Math functions .floor() #5239 (#5508) * Feat: [Term Entry] Python NumPy - Math functions .floor() #5239 * Update floor.md minor changes * minor fixes --------- --- .../math-methods/terms/floor/floor.md | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 content/numpy/concepts/math-methods/terms/floor/floor.md diff --git a/content/numpy/concepts/math-methods/terms/floor/floor.md b/content/numpy/concepts/math-methods/terms/floor/floor.md new file mode 100644 index 00000000000..3c3a57afc57 --- /dev/null +++ b/content/numpy/concepts/math-methods/terms/floor/floor.md @@ -0,0 +1,75 @@ +--- +Title: '.floor()' +Description: 'Rounds down a number or an array of numbers to the nearest smallest integer.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Arrays' + - 'Math' + - 'NumPy' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +In the NumPy library, the **`.floor()`** method rounds down a number or an array of numbers to the nearest smallest integer. It returns an array without commas separating the elements. To view the output with commas, use the [`.repr()`](https://www.codecademy.com/resources/docs/python/built-in-functions/repr) function. + +## Syntax + +```psuedo +numpy.floor(array, out=None) +``` + +- `array`: Represents a single number or an array of numbers. Each element, whether a float or integer, will be rounded down. +- `out` (Optional): An output array where the rounded results will be stored. A new array will be created to store the rounded-down values if not provided. + +## Example + +The below example shows different use cases of the `.floor()` method: + +```py +import numpy as np + +# Case 1: np.floor() returns a single number rounded down. +number = 5.64 +rounded_number = np.floor(number) +print("# Case 1") +print(rounded_number) + +# Case 2: np.floor() accepts arrays as a parameter and will return the elements of the array rounded down. +array_unrounded = [4.734, 3.141, 9.567] +array_rounded = np.floor(array_unrounded) +print("# Case 2") +print(array_rounded) + +# Case 3: np.floor() accept arrays as a second parameter and will store the round down values in it. +array_unrounded = [2.5, 1.5, 3.55] +array_rounded = np.zeros_like(array_unrounded) +np.floor(array_unrounded, out=array_rounded) +print("# Case 3") +print(array_rounded) +``` + +The above use cases produce the following output: + +```shell +# Case 1 +5.0 +# Case 2 +[4. 3. 9.] +# Case 3 +[2. 1. 3.] +``` + +## Codebyte Example + +Run the following codebyte example to understand how the `.floor()` method works: + +```codebyte/python +import numpy as np + +unrounded_list = [23.89, 54.843, 17.478] +rounded_list = np.floor(unrounded_list) +print(rounded_list) +``` From a0d21f496f2395338289f5d79d56ff6a2b467c6f Mon Sep 17 00:00:00 2001 From: Gourab Dasgupta Date: Sat, 19 Oct 2024 16:26:21 +0530 Subject: [PATCH 045/108] Python NumPy - Math functions .nanprod() (#5293) * Created new file docs/content/numpy/concepts/math-methods/terms/nanprod/nanprod.md * Update content/numpy/concepts/math-methods/terms/nanprod/nanprod.md * Update content/numpy/concepts/math-methods/terms/nanprod/nanprod.md * Update content/numpy/concepts/math-methods/terms/nanprod/nanprod.md * Update content/numpy/concepts/math-methods/terms/nanprod/nanprod.md * Update nanprod.md * Update nanprod.md minor changes --------- --- .../math-methods/terms/nanprod/nanprod.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 content/numpy/concepts/math-methods/terms/nanprod/nanprod.md diff --git a/content/numpy/concepts/math-methods/terms/nanprod/nanprod.md b/content/numpy/concepts/math-methods/terms/nanprod/nanprod.md new file mode 100644 index 00000000000..95e24254eac --- /dev/null +++ b/content/numpy/concepts/math-methods/terms/nanprod/nanprod.md @@ -0,0 +1,90 @@ +--- +Title: '.nanprod()' +Description: 'Calculates the product of array elements.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Arrays' + - 'Functions' + - 'Math' + - 'NumPy' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +In NumPy, the **`.nanprod()`** function calculates the product of array elements over a specified axis, treating `NaN` (Not a Number) values as 1. This is useful when working with arrays that contain missing or undefined values represented as `NaN`. + +## Syntax + +```pseudo +numpy.nanprod(a, axis=None, dtype=None, out=None, keepdims=) +``` + +- `a`: An array for which the product is calculated. +- `axis`: An optional parameter used to specify the axis along which the product is computed. If not specified, the product of all elements in the array is calculated. +- `dtype` : An optional parameter used to specify the data type of the result. If not specified, it defaults to the data type of the input array, or the default platform integer if the input contains integers. +- `out`: An optional parameter specifying the array to store the result. If not provided, a new array is created. +- `keepdims`: An optional parameter. If set to `True`, the reduced axes are retained in the result as dimensions with size one, allowing the result to broadcast correctly. + +## Example 1 + +This example demonstrates using `.nanprod()` function to calculate the product of an array containing `NaN` values: + +```py +import numpy as np + +# Creating a numpy array with NaN values +arr = np.array([1, 2, np.nan, 4, 5]) + +# Computing the product of the array, treating NaN as 1 +result = np.nanprod(arr) + +print(result) +``` + +The above example code results in the following output: + +```shell +40.0 +``` + +## Example 2 + +This example shows how to use `.nanprod()` function along a specific axis: + +```py +import numpy as np + +# Creating a 2D numpy array with NaN values +arr = np.array([[1, 2, np.nan], [4, 5, 6]]) + +# Computing the product along axis 0 (columns) +result = np.nanprod(arr, axis=0) + +print(result) +``` + +The above example code results in the following output: + +```shell +[4. 10. 6.] +``` + +## Codebyte Example + +In this codebyte example, the `.nanprod()` method computes the product of the elements in the array along both axes, demonstrating the use of the `keepdims` parameter: + +```codebyte/python +import numpy as np + +arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [7, 8, 9]]) + +result = np.nanprod(arr, axis=(0, 1), keepdims=True) + +print("Original array:") +print(arr) +print("\nResult:") +print(result) +``` From cf10e706cf4c2d4fad0c6bcc5eb3dc132e581d09 Mon Sep 17 00:00:00 2001 From: giwpypatents Date: Sat, 19 Oct 2024 21:31:13 +0100 Subject: [PATCH 046/108] Add code example for conditionals in C# and fix typos in conditionals.md (#5498) * Add code example for conditionals in C# and fix typos in conditionals.md * Update conditionals.md minor changes * added backticks at the end * Update conditionals.md --------- --- .../concepts/conditionals/conditionals.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/content/c-sharp/concepts/conditionals/conditionals.md b/content/c-sharp/concepts/conditionals/conditionals.md index c093a0cad55..d0da743053a 100644 --- a/content/c-sharp/concepts/conditionals/conditionals.md +++ b/content/c-sharp/concepts/conditionals/conditionals.md @@ -132,3 +132,33 @@ string getInput1(int input1) => input1 === 10 ? "I returned true" : "I returned Console.WriteLine(getInput1(10)); // Output: "I returned true" Console.WriteLine(getInput1(5)); // Output: "I returned false" ``` + +## Codebyte Example + +Run the following codebyte example to understand how conditionals work in C#: + +```codebyte/csharp +using System; + +class Program +{ + static void Main() + { + int number = 10; + + // Using if-else conditional statements + if (number > 0) + { + Console.WriteLine("The number is positive."); + } + else if (number < 0) + { + Console.WriteLine("The number is negative."); + } + else + { + Console.WriteLine("The number is zero."); + } + } +} +``` From 94f1017a4c1d50aba8b006acf57f1ff95af5153e Mon Sep 17 00:00:00 2001 From: bpicoCode <107274436+bpicoCode@users.noreply.github.com> Date: Sun, 20 Oct 2024 05:35:53 -0400 Subject: [PATCH 047/108] [Term Entry] Adding SQL's IIF function (#4990) * iff-sql * Mod Term Entry * Update content/sql/concepts/operators/terms/iff/iff.md * Update content/sql/concepts/operators/terms/iff/iff.md * Prettier formatting --------- --- .../sql/concepts/operators/terms/iff/iff.md | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 content/sql/concepts/operators/terms/iff/iff.md diff --git a/content/sql/concepts/operators/terms/iff/iff.md b/content/sql/concepts/operators/terms/iff/iff.md new file mode 100644 index 00000000000..15b967ae942 --- /dev/null +++ b/content/sql/concepts/operators/terms/iff/iff.md @@ -0,0 +1,70 @@ +--- +Title: 'IIF' +Description: ' Performs inline conditional checks within SELECT statements to return different values based on a condition.' +Subjects: + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Operators' + - 'Database' + - 'Data' + - 'Conditionals' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +The **`IFF`** function in SQL is used to perform a conditional evaluation and return one of two values based on the result of a specified condition. It is similar to the ternary operator (condition ? true_value : false_value) found in many programming languages. + +## Syntax + +```pseudo +IIF(condition, value_if_true, value_if_false) +``` + +- `condition`: The condition to be evaluated. +- `value_if_true`: The value to be returned if the condition is true. +- `value_if_false`: The value to be returned if the condition is false. + +## Usage + +The **`IFF`** function is particularly useful for inline conditional logic within SQL queries. It allows you to embed simple conditional checks directly within SELECT, WHERE, ORDER BY, and other clauses. + +## Example + +The following example demonstrates the use of the `IF` function to label stock prices as `High` or `Low`: + +```sql +# Create a table named 'employees' and categorize their salaries as high or moderate using the 'IIF' function + +CREATE TABLE employees ( + employee_id INT PRIMARY KEY, + name VARCHAR(100), + salary DECIMAL(10, 2) +); + +INSERT INTO employees (employee_id, name, salary) VALUES +(1, 'Alice', 45000), +(2, 'Bob', 55000), +(3, 'Charlie', 70000), +(4, 'Diana', 30000), +(5, 'Edward', 85000); + +SELECT + name, + salary, + IIF(salary > 60000, 'High Salary', 'Moderate Salary') AS salary_category +FROM + employees; +``` + +The output of the `SELECT` statement will be: +| name | salary | salary_category | +| --------- | ------- | -------------- | +| Alice | 45000 | Moderate Salary | +| Bob | 55000 | Moderate Salary | +| Charlie | 70000 | High Salary | +| Diana | 30000 | Moderate Salary | +| Edward | 85000 | High Salary | + +The `IIF` function checks if the salary is greater than `60000`. If true, it assigns `High Salary` to the `salary_category`. Otherwise, it assigns `Moderate Salary`. From c5904256bee72b03571a9bc45e9824949558b07e Mon Sep 17 00:00:00 2001 From: Mandip Bhattarai <97532160+Mandipbhattarai@users.noreply.github.com> Date: Sun, 20 Oct 2024 15:25:34 +0530 Subject: [PATCH 048/108] Added Utility Types in Typescript (#5093) * Added Utility Types in Typescript * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Daksha Deep * Added tags and Applied Changes * Update utility-types.md * Changes from my side * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Update content/typescript/concepts/utility-types/utility-types.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Prettier Formatting --------- --- .../concepts/utility-types/utility-types.md | 224 ++++++++++++++++++ documentation/tags.md | 1 + 2 files changed, 225 insertions(+) create mode 100644 content/typescript/concepts/utility-types/utility-types.md diff --git a/content/typescript/concepts/utility-types/utility-types.md b/content/typescript/concepts/utility-types/utility-types.md new file mode 100644 index 00000000000..71cf9db7435 --- /dev/null +++ b/content/typescript/concepts/utility-types/utility-types.md @@ -0,0 +1,224 @@ +--- +Title: 'Utility Types' +Description: 'Helps in working with data types more efficiently.' +Subjects: + - 'Web Development' + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Utility Types' + - 'Data Types' + - 'TypeScript' +CatalogContent: + - 'learn-typescript' + - 'paths/full-stack-engineer-career-path' +--- + +TypeScript consists of several predefined generic types known as **Utility Types**. These utility types are useful for manipulating or creating new types more efficiently. + +## Partial + +Partial is a utility type that is used to create a type where all properties are marked as optional. + +### Syntax + +A partial is written as: + +```pseudo +Partial; +``` + +Where `T` is the typo you want to make all the properties optional. + +### Partial Example + +In this example, all the properties of the `User` interface are optional: + +```ts +interface User { + name: string; + age: number; + email: string; +} + +const partialUser: Partial = { + name: 'John', +}; +``` + +## Required + +`Required` is a utility type that is used to create a type with all properties of `T` marked as `Required`. It is the opposite of `Partial`. + +### Syntax + +`Required` in Typescript is written as: + +```pseudo +Required; +``` + +Where `T` is the typo you want to make all the properties mandatory. + +### Required Example + +In this example, all the properties of the `User` interface (including the optional properties) are made mandatory: + +```ts +interface User { + name: string; + age?: number; +} + +const requiredUser: Required<{ name: string; age: number }> = { + name: 'John', + age: 25, +}; +``` + +## Readonly + +`Readonly` is a utility type that marks all the properties in `T` as `readonly`, preventing any reassignment. + +### Syntax + +`Readonly` is written as: + +```pseudo +Readonly; +``` + +Where properties of `T` is marked as `Readonly`. + +### Readonly Example + +In this example, attempting to reassign the value of `readonlyUser.age` generates an error: + +```ts +interface User { + name: string; + age: number; +} + +const readonlyUser: Readonly = { + name: 'John', + age: 30, +}; + +readonlyUser.age = 31; // Error: Cannot assign to 'age' because it is a read-only property. +``` + +## Pick + +Pick allows you to create a new type by selecting a set of properties `K` from an existing type `T`. + +### Syntax + +Pick is written as: + +```pseudo +Pick; +``` + +where `K` are the properties you want to include from `T`. + +### Pick Example + +In this example, `Pick` is used to create a type from `User` that includes only the `name` and `email` fields, omitting `age`, without needing to declare a new interface: + +```ts +interface User { + name: string; + age: number; + email: string; +} + +const pickedUser: Pick = { + name: 'John', + email: 'john@example.com', +}; +``` + +## Omit + +Omit allows you to create a new type by excluding a set of properties `K` from an existing type `T`. + +### Syntax + +Omit is written as: + +```pseudo +Omit; +``` + +where `K` properties are omitted from `T`. + +### Omit Example + +In this example, we removed the `age` property from the `User` interface: + +```ts +interface User { + name: string; + age: number; + email: string; +} + +const omittedUser: Omit = { + name: 'John', + email: 'john@example.com', +}; +``` + +## Record + +Record helps you give cleaner type to `objects`. + +### Syntax + +Record is written as: + +```pseudo +Record; +``` + +where `K` represents the keys and `T` represents the values. + +### Record Example + +In this example, it ensures that the keys are `strings` and the values are `numbers`. + +```ts +type Users = Record; + +const userRoles: Users = { + admin: 1, + user: 2, + guest: 3, +}; +``` + +## Exclude + +Excludes from `T` those types that are assignable to `U`. + +### Syntax + +Exclude is written as: + +```pseudo +Exclude; +``` + +where `U` represents the types you want to exclude from the union type`T`. + +### Exclude Example + +In this example, we exclude `apple` and `banana` from the union type, resulting in just `orange`: + +```ts +type fruits = 'apple' | 'banana' | 'orange'; +type ExcludedFruits = Exclude; // "orange" +``` + +These utility types make managing and transforming types easier, helping you write cleaner and safer code. diff --git a/documentation/tags.md b/documentation/tags.md index 0f10830b744..91dc120814d 100644 --- a/documentation/tags.md +++ b/documentation/tags.md @@ -356,6 +356,7 @@ Units Unix Unsupervised Learning URL +Utility Types UX Validation Values From c44e7ca82e0782ef0abbf94c2c10c4fd492b0ab7 Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:18:34 +0530 Subject: [PATCH 049/108] [Concept Entry] Sklearn: Label Propagation (#5333) * files added * Update content/sklearn/concepts/label-propagation/label-propagation.md * Prettier Formatting --------- --- .../label-propagation/label-propagation.md | 76 ++++++++++++++++++ media/sklearn-label-propagation.png | Bin 0 -> 10263 bytes 2 files changed, 76 insertions(+) create mode 100644 content/sklearn/concepts/label-propagation/label-propagation.md create mode 100644 media/sklearn-label-propagation.png diff --git a/content/sklearn/concepts/label-propagation/label-propagation.md b/content/sklearn/concepts/label-propagation/label-propagation.md new file mode 100644 index 00000000000..83779bec16c --- /dev/null +++ b/content/sklearn/concepts/label-propagation/label-propagation.md @@ -0,0 +1,76 @@ +--- +Title: 'Label Propagation' +Description: 'A semi-supervised learning algorithm that spreads labels from a small set of labeled data points to the unlabeled data using a graph-based approach.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'Classification' + - 'Scikit-learn' +CatalogContent: + - 'learn-python-3' + - 'paths/data-science' +--- + +**Label Propagation** is a semi-supervised learning algorithm used in classification problems where a small portion of the data is labeled, and the remaining data is unlabeled. The algorithm spreads the label information from the labeled instances to the unlabeled ones by propagating labels across the graph built from the input data. In Scikit-learn, this is implemented as part of the `sklearn.semi_supervised` module. + +Scikit-learn provides two closely related semi-supervised algorithms: + +- **Label Propagation**: Propagates labels through the graph using a probabilistic transition matrix. +- **Label Spreading**: A variant of Label Propagation that uses a normalized graph Laplacian to reduce noise sensitivity. + +## Syntax + +```pseudo +from sklearn.semi_supervised import LabelPropagation + +# Create a LabelPropagation object with desired parameters +model = LabelPropagation(kernel='rbf', gamma=1, max_iter=1000) + +# Fit the model to your data +model.fit(X, y) + +# Predict labels for unlabeled data +y_pred = model.predict(X_unlabeled) +``` + +- `kernel`: The kernel function used for label propagation. Common options are `rbf` (radial basis function), `knn` (k-nearest neighbors), and `poly` (polynomial). +- `gamma`: The kernel coefficient for the `rbf` kernel. +- `max_iter`: The maximum number of iterations for the label propagation algorithm. +- `X`: The input data, where each row is a sample and each column is a feature. +- `y`: The corresponding labels for the labeled samples. +- `X_unlabeled`: The input data for the unlabeled samples. + +## Example + +In the following example, a small set of labeled points (`y = 0, 1`) and unlabeled points (`y = -1`) is given. The Label Propagation algorithm spreads the known labels to the unlabeled data points based on their proximity. + +```python +import numpy as np +from sklearn.semi_supervised import LabelPropagation +import matplotlib.pyplot as plt + +# Create synthetic data +X = np.array([[1, 1], [2, 1], [3, 2], [5, 5], [6, 5], [7, 6]]) +y = np.array([0, 0, 1, -1, -1, -1]) # -1 represents unlabeled data + +# Initialize Label Propagation model +model = LabelPropagation() +model.fit(X, y) + +# Predict labels for unlabeled data +predicted_labels = model.transduction_ +print("Predicted labels:", predicted_labels) + +# Plotting the data +plt.scatter(X[:, 0], X[:, 1], c=predicted_labels, cmap='viridis', s=100) +plt.show() +``` + +The output of the above code will be: + +```shell +Predicted labels: [0 0 1 1 1 1] +``` + +![Label Propagation Example](https://raw.githubusercontent.com/Codecademy/docs/main/media/sklearn-label-propagation.png) diff --git a/media/sklearn-label-propagation.png b/media/sklearn-label-propagation.png new file mode 100644 index 0000000000000000000000000000000000000000..5c23d5fdb19a4269f00c717eaedd19d9a389a096 GIT binary patch literal 10263 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 SOa2x>==xQ|D`l7NKK&od*Cves literal 0 HcmV?d00001 From 684598a6849b4d2b997850aa2ef4219083ee353e Mon Sep 17 00:00:00 2001 From: Ragul <67683723+ragul1697@users.noreply.github.com> Date: Sun, 20 Oct 2024 16:49:55 +0530 Subject: [PATCH 050/108] Javascript Concept Entry update - Callbacks (#5415) * JS Callback doc update * JS Callbacks Doc updated * Update callbacks.md --------- --- .../concepts/callbacks/callbacks.md | 116 +++++++++++++++++- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/content/javascript/concepts/callbacks/callbacks.md b/content/javascript/concepts/callbacks/callbacks.md index 3cd2c0eafca..0faa355c197 100644 --- a/content/javascript/concepts/callbacks/callbacks.md +++ b/content/javascript/concepts/callbacks/callbacks.md @@ -1,6 +1,6 @@ --- Title: 'Callbacks' -Description: 'Callback functions are functions that are passed as arguments in other functions. A callback function can then be invoked during the execution of that higher order function (that it is an argument of). In JavaScript, functions can be passed as arguments because functions are objects. Suppose there are two functions, functionA() and functionB(): js function functionA(num1, num2) { return num1 + num2; }' +Description: 'A callback is a function passed as an argument to another function.' Subjects: - 'Web Development' - 'Computer Science' @@ -11,9 +11,11 @@ CatalogContent: - 'paths/front-end-engineer-career-path' --- -Callback functions are functions that are passed as arguments in other functions. A callback function can then be invoked during the execution of that higher order function (that it is an argument of). +A callback is a function passed as an argument to another function. In JavaScript, functions can be passed as arguments because functions are objects. -In JavaScript, functions can be passed as arguments because functions are objects. +A callback function gets invoked during the execution of the higher order function (that it is an argument of). They are used in asynchronous operations like network requests or DOM events to avoid waiting for the response until the async process is completed. + +## Example Suppose a function is created which makes a calculation and doubles the results of that calculation: @@ -72,3 +74,111 @@ console.log(createNewArray(array, double)); console.log(createNewArray(array, divide)); console.log(createNewArray(array, increment)); ``` + +## Callbacks in Asynchronous JavaScript + +Callbacks are often used in asynchronous operations like fetching data from an API or listening for a DOM Event, where users don’t want to block the main thread while waiting for the response. + +### Example + +The following example demonstrates how to make an API call using callbacks: + +```js +function fetchData(url, callback) { + var xhr = new XMLHttpRequest(); // Create a new XMLHttpRequest object + xhr.open('GET', url, true); // Initialize a request + + xhr.onload = function () { + if (xhr.status === 200) { + // Check if the request was successful + callback(null, xhr.responseText); // Call the callback function with data + } else { + callback('Error: ' + xhr.status, null); // Pass error message if request failed + } + }; + + xhr.onerror = function () { + callback('Request failed', null); // Handle network errors + }; + + xhr.send(); // Send the request +} + +// Callback function to handle the response +function handleResponse(error, data) { + if (error) { + console.error(error); // Handle error case + } else { + console.log('Data received:', data); // Handle success case + } +} + +// Usage +var url = 'https://jsonplaceholder.typicode.com/posts/1'; // Sample API endpoint +fetchData(url, handleResponse); // Call the fetch function and pass the callback +``` + +In the code above, the `fetchData` function takes two arguments `url` and `handleResponse`. `url` is the API url from which we have to get the data. `handleResponse` is the callback funtion that gets executed when the network request returns either data or an error. + +The output will look like this: + +```shell +Data received: { + "userId": 1, + "id": 1, + "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", + "body": "quia et suscipit..." +} +``` + +### Codebyte Example + +The following codebyte example shows how to make an API call using callbacks: + +```codebyte/javascript +const https = require('https'); + +function fetchData(url, callback) { + https.get(url, res => { + let data = ''; + res.on('data', chunk => { + data += chunk; + }); + res.on('end', () => { + data = JSON.parse(data); + handleResponse(null, data); + }) + }).on('error', err => { + handleResponse(err, null); + }); +} + +// Callback function to handle the response +function handleResponse(error, data) { + if (error) { + console.error('Error', error.message); // Handle error case + } else { + console.log('Data received:', data); // Handle success case + } +} + +// Usage +var url = 'https://jsonplaceholder.typicode.com/posts/1'; // Sample API endpoint +fetchData(url, handleResponse); // Call the fetch function and pass the callback +``` + +## Callback Hell + +When multiple asynchronous operations are nested using callbacks, it can lead to complex code and might lead to errors and difficult to debug, often referred to as _callback hell_: + +```js +doSomethingFirst(function () { + doSomethingSecond(function () { + doAnotherThird(function () { + // and so on... + }); + }); +}); +``` + +To avoid this, **promises** or **async/await** can be used, which make the code more readable and maintainable. From 1a0af19b5958df19f553b069d60c3313de2df715 Mon Sep 17 00:00:00 2001 From: codecademydev Date: Sun, 20 Oct 2024 13:06:42 +0000 Subject: [PATCH 051/108] =?UTF-8?q?=F0=9F=A4=96=20update=20concept=20of=20?= =?UTF-8?q?the=20week?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/concept-of-the-week.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/concept-of-the-week.txt b/bin/concept-of-the-week.txt index a295dd39afa..310bf96da85 100644 --- a/bin/concept-of-the-week.txt +++ b/bin/concept-of-the-week.txt @@ -1 +1 @@ -content/java/concepts/priorityqueue/priorityqueue.md \ No newline at end of file +content/general/concepts/jit-compilation/jit-compilation.md \ No newline at end of file From c0bd59131aae51eb0035cbd6d9f1b6cd81098568 Mon Sep 17 00:00:00 2001 From: akhyarr <112689445+rrayhka@users.noreply.github.com> Date: Mon, 21 Oct 2024 17:03:44 +0700 Subject: [PATCH 052/108] update: built-in-functions.md (#5436) * update: built-in-functions.md * Update content/python/concepts/built-in-functions/built-in-functions.md * update built-in-functions.md * Update built-in-functions.md * Update built-in-functions.md minor changes --------- --- .../built-in-functions/built-in-functions.md | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/content/python/concepts/built-in-functions/built-in-functions.md b/content/python/concepts/built-in-functions/built-in-functions.md index 13c672c4301..cc24b35082d 100644 --- a/content/python/concepts/built-in-functions/built-in-functions.md +++ b/content/python/concepts/built-in-functions/built-in-functions.md @@ -1,6 +1,6 @@ --- Title: 'Built-in Functions' -Description: 'The Python interpreter has a set of functions and types built into it (pre-defined). They are always ready at your disposal; you can use them without needing to import a library. There are 68 built-in functions and they are listed here in alphabetical order.' +Description: 'Python includes over 60 pre-defined built-in functions and types, which can be used without importing libraries.' Subjects: - 'Computer Science' - 'Data Science' @@ -13,6 +13,27 @@ CatalogContent: - 'paths/computer-science' --- -The Python interpreter has a set of functions and types built into it (pre-defined). They are always ready at your disposal; you can use them without needing to import a library. +**Built-in functions** in Python are a collection of pre-defined functions readily available for use without requiring the import of any external libraries. These functions provide essential functionality for performing common tasks, such as manipulating data types, handling input/output, and more. Python includes over 60 built-in functions, which are categorized and listed alphabetically for easy reference. -There are 68 built-in functions and they are listed here in alphabetical order. +## Example + +The example below uses a built-in function `len()` that returns the length of an object: + +```py +# Creating a list of states +states = ["Idaho", "Kansas", "Louisiana"] + +# A string +text = "Hello, World!" + +# Calculating the length using len() +print(len(states)) +print(len(text)) +``` + +The output of the above code is as follows: + +```shell +3 +13 +``` From 011255421920d92c62c42625359917487209fcb7 Mon Sep 17 00:00:00 2001 From: Zubair Khan <126254020+Zubair576335@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:38:39 +0530 Subject: [PATCH 053/108] shorten the description of cpp-polymorphism (#5513) * shorten the description of cpp-polymorphism * Update polymorphism.md minor changes --------- --- content/cpp/concepts/polymorphism/polymorphism.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/cpp/concepts/polymorphism/polymorphism.md b/content/cpp/concepts/polymorphism/polymorphism.md index 1e2b121b011..aeb232bfd40 100644 --- a/content/cpp/concepts/polymorphism/polymorphism.md +++ b/content/cpp/concepts/polymorphism/polymorphism.md @@ -1,6 +1,6 @@ --- Title: 'Polymorphism' -Description: 'Polymorphism is an important concept in object-oriented programming. It means more than one form — the same entity (function or operator) can behave differently in different scenarios.' +Description: 'Polymorphism allows a single function or operator to behave differently based on the context.' Subjects: - 'Computer Science' - 'Game Development' From edec14df5e864ef1961b8f43dc91a9f0cbc7f558 Mon Sep 17 00:00:00 2001 From: Ragul <67683723+ragul1697@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:54:02 +0530 Subject: [PATCH 054/108] Doc update - Javascript Errors (#5463) * Doc update - Javascript Errors * Update errors.md minor changes --------- --- content/javascript/concepts/errors/errors.md | 48 ++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/content/javascript/concepts/errors/errors.md b/content/javascript/concepts/errors/errors.md index 4be70c07809..56cc4bf54de 100644 --- a/content/javascript/concepts/errors/errors.md +++ b/content/javascript/concepts/errors/errors.md @@ -1,6 +1,6 @@ --- Title: 'Errors' -Description: 'When JavaScript throws an error it throws an error object that consists of a name and a message property. The name is the general type of the error, and the message is a human-readable description of the specific error that happened. Thrown errors are caught by the next outer catch block of a try...catch...finally statement. They can also be thrown intentionally by the throw statement. The error object holds information about the exception that was thrown in its two properties: - name Sets or returns an error name. (Type of Error) - message Sets or returns an error message. (Description of specific instance.) The following types of error can be returned by the name property: - "EvalError" An error has occurred in the eval() function (Note: Depreciated in newer versions of JavaScript)' +Description: 'The JavaScript Error object represents runtime errors, providing information for throwing exceptions and handling them with try-catch blocks.' Subjects: - 'Web Development' - 'Computer Science' @@ -15,16 +15,19 @@ CatalogContent: - 'paths/create-a-back-end-app-with-javascript' --- -When JavaScript throws an error it throws an error object that consists of a `name` and a `message` property. The `name` is the general type of the error, and the `message` is a human-readable description of the specific error that happened. +**Errors** in JavaScript are issues that occur during runtime, represented by the `Error` object. This object provides information about the error type and message and can be used to throw exceptions or handle them in a `try-catch` block. + +When JavaScript throws an error, it throws an error object that consists of a `name` and a `message` property. The `name` is the general type of the error, and the `message` is a human-readable description of the specific error that happened. Thrown errors are caught by the next outer `catch` block of a `try...catch...finally` statement. They can also be thrown intentionally by the `throw` statement. ## The Error Object -The error object holds information about the exception that was thrown in its two properties: +The error object holds information about the exception that was thrown in its three properties: - `name` Sets or returns an error name. (Type of Error) - `message` Sets or returns an error message. (Description of specific instance.) +- `stack` Returns a string representing the point in the code where the error was instantiated. The following types of error can be returned by the `name` property: @@ -40,14 +43,53 @@ These are some example messages for various types of errors: - RangeError - invalid array length - invalid date + +```js +let arr = new Array(-1); // RangeError: Invalid array length +``` + - ReferenceError - "x" is not defined - assignment to undeclared variable "x" + +```js +console.log(x); // ReferenceError: x is not defined +``` + - SyntaxError - "x" is a reserved identifier - a declaration in the head of a for-of loop can't have an initializer + +```js +// SyntaxError: 'for-of' loop variable can't be initialized +try { + for (let i = 0 of [1, 2, 3]) { + console.log(i); + } +} catch (err) { + console.log(err.name); // "SyntaxError" + console.log(err.message); // "'for-of' loop variable can't have an initializer" +} +``` + - TypeError - "x" is not a function - "x" is read-only + +```js +let num = 42; +num.toUpperCase(); // TypeError: num.toUpperCase is not a function +``` + - URIError - malformed URI sequence + +```js +// This is an invalid percent encoding (notice '%E0%' is incomplete). +try { + let badURI = decodeURIComponent('%E0%'); +} catch (err) { + console.log(err.name); // "URIError" + console.log(err.message); // "malformed URI sequence" +} +``` From 06b9991ed97bf8d32a6131847b1b7efb24d656e4 Mon Sep 17 00:00:00 2001 From: Shaeeb <99033846+shaeebali@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:01:51 +0100 Subject: [PATCH 055/108] [Edit] Lua Remove #5388 (#5502) * re-write syntax and label as lua, rephrase/edit syntax description, add note and lua syntax to example * Update content/lua/concepts/tables/terms/remove/remove.md * Update content/lua/concepts/tables/terms/remove/remove.md * Update remove.md minor fixes * Update remove.md --------- --- .../lua/concepts/tables/terms/remove/remove.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/content/lua/concepts/tables/terms/remove/remove.md b/content/lua/concepts/tables/terms/remove/remove.md index a28f743c670..c7b2653ef43 100644 --- a/content/lua/concepts/tables/terms/remove/remove.md +++ b/content/lua/concepts/tables/terms/remove/remove.md @@ -1,6 +1,6 @@ --- -Title: 'remove()' -Description: 'Removes a value from a table.' +Title: '.remove()' +Description: 'Removes and returns the element at a specified position from a table (array).' Subjects: - 'Computer Science' - 'Game Development' @@ -12,20 +12,19 @@ CatalogContent: - 'paths/computer-science' --- -The **`remove()`** function in Lua removes the value of the specified index and clears the index from the table (reducing the length of the table by 1). +The **`.remove()`** function in Lua removes the value of the specified index and clears the index from the table (reducing the length of the table by 1). ## Syntax ```pseudo -table.remove(tableName,pos) - +table.remove(tableName, pos) ``` -`remove()` returns the value that was removed from the `tableName`. The `pos` parameter has a default value of `n`, which is the length of the table. This causes the last element of the table to be removed if the `pos` parameter is not provided. +The `.remove()` method removes and returns the element at the specified position `pos` from the given table `tableName`. If `pos` is not provided, it defaults to the length of the table, meaning the last element will be removed by default. ## Example -In the following example `remove()` is used to remove the element at the `pos` position from the table. This causes other elements to shift down. +In the following example `.remove()` is used to remove the element at the `pos` position from the table. This causes other elements to shift down: ```lua local fruit = { @@ -50,3 +49,5 @@ This example results in the following output: 🍎, 🍇, 🍓, 🍉 ``` + +> **Note:** In Lua, indices start from 1. Therefore the banana was removed from the table as it was at index 2. From c289266657078c34170213d62dc805efa7704130 Mon Sep 17 00:00:00 2001 From: JMendez Date: Wed, 23 Oct 2024 06:26:20 -0400 Subject: [PATCH 056/108] [Term Entry] SQL Commands: ROLLBACK * First commit, adds concept md template and includes metadata. * Adds first draft of description, syntax, and example * Adds first draft of description, syntax, and example * Adds savepoint rollback to example * updates text to consistently use 2nd person * updates using yarn format path * puts keywords in inline code format Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * Applies style and wording suggestions from code review Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * fixes misspelling found in code review Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * changes all syntax codeblocks to pseudo blocks * fixes indentation in codeblock * Minor changes --------- --- .../commands/terms/rollback/rollback.md | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 content/sql/concepts/commands/terms/rollback/rollback.md diff --git a/content/sql/concepts/commands/terms/rollback/rollback.md b/content/sql/concepts/commands/terms/rollback/rollback.md new file mode 100644 index 00000000000..70034e81ca8 --- /dev/null +++ b/content/sql/concepts/commands/terms/rollback/rollback.md @@ -0,0 +1,133 @@ +--- +Title: 'ROLLBACK' +Description: 'Undoes any work performed in the current transaction. It can also be used to undo work performed by in-doubt transactions.' +Subjects: + - 'Data Science' +Tags: + - 'Database' + - 'Documentation' + - 'Functions' + - 'Queries' +CatalogContent: + - 'learn-sql' + - 'paths/analyze-data-with-sql' +--- + +In SQL, the **`ROLLBACK`** command undoes work performed in the current transaction to a savepoint or to the last commit to the database. A SQL transaction is a series of one or more SQL statements in the current session. + +Therefore, the rollback procedure allows a user to undo the work to a previous point without applying these statements to the database. + +> Note: To learn more about how to start and commit a transaction, check out the [MySQL documentation](https://dev.mysql.com/doc/refman/8.4/en/commit.html). + +## Syntax + +```pseudo +ROLLBACK [WORK] [TO SAVEPOINT savepoint_name]; +``` + +- `TO SAVEPOINT savepoint_name`: Resets the database to an established savepoint `savepoint_name` within the current transaction. These savepoint names can be created using the command `SAVEPOINT savepoint_name`. + +### Rollback Current Transaction + +The following syntax can be used to undo any changes in the current transaction: + +```pseudo +ROLLBACK; +-- Or, for compatibility with some SQL standards: +ROLLBACK WORK; +``` + +### Rollback Current Transaction to Savepoint + +To rollback to a specific savepoint, the following syntax can be used: + +```pseudo +ROLLBACK [WORK] TO SAVEPOINT savepoint_name; +``` + +> Note: Certain statements cannot be rolled back once performed, such as creating, dropping, or altering tables and databases. For more info, check out the [MySQL documentation](https://dev.mysql.com/doc/refman/8.4/en/cannot-roll-back.html). + +## Example + +Here is a table `table_1` containing the following data: + +| id | dob | name | +| --- | ---------- | ---------------- | +| 1 | 11/16/2001 | Jolly Old Chap | +| 2 | 1/12/2000 | Jolly Young Chap | + +Next, the following code is used to fix Young Chap's birthday and make him younger than Old Chap: + +```sql +UPDATE table_1 +SET dob = "1/21/2024"; +SELECT * FROM table_1; +``` + +This gives the following as the output: + +| id | dob | name | +| --- | --------- | ---------------- | +| 1 | 1/21/2024 | Jolly Old Chap | +| 2 | 1/21/2024 | Jolly Young Chap | + +However, the above output suggests that everyone's birthday has been accidentally set to `1/21/2024`. + +To fix that, the following code is used to rollback the transaction and update the birthday correctly: + +```sql +ROLLBACK; +UPDATE table_1 +SET dob = "1/21/2024" +WHERE id = 2; +SELECT * FROM table_1; +``` + +This gives the following as the output: + +| id | dob | name | +| --- | ---------- | ---------------- | +| 1 | 11/16/2001 | Jolly Old Chap | +| 2 | 1/21/2024 | Jolly Young Chap | + +Finally, the following code adds another chap to the database and then rolls back the addition: + +```sql +-- Create a savepoint, in case another error is made +SAVEPOINT first; + +-- Add a new chap +INSERT INTO table_1 (name,dob) + VALUES ("Jolly Medium Chap","3/22/2012"); +SELECT name FROM table_1 WHERE id=3; + +-- Gives "Jolly Medium Chap" + +-- Create a new savepoint +SAVEPOINT second; + +-- Change the name +UPDATE table_1 + SET name = "Jolly Rancher" + WHERE id=3; +SELECT name FROM table_1 WHERE id=3; + +-- Gives "Jolly Rancher" + +-- The original name feels better. So, let's go ahead and rollback. +ROLLBACK TO SAVEPOINT second; +SELECT name FROM table_1 WHERE id=3; + +-- Gives "Jolly Medium Chap" + +-- There is no need of the new chap anymore. Let's just go back to the save with just two chaps. +ROLLBACK TO SAVEPOINT first; +SELECT * FROM table_1; +``` + +This would output the following table: + +| id | dob | name | +| --- | ---------- | ---------------- | +| 1 | 11/16/2001 | Jolly Old Chap | +| 2 | 1/21/2024 | Jolly Young Chap | From 7756eb3c2d2167ab2a7290830a8fd40e0bb01f75 Mon Sep 17 00:00:00 2001 From: Jack Race <165810906+Jack-Race@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:06:58 +0100 Subject: [PATCH 057/108] [Concept Entry] C++: Unordered Sets * Table and Introduction added * examples added * table added * Preview edits * opening table fixes * more opening table fixes * Fixed Formatting and ran scripts * Update unordered-set.md minor changes * Update unordered-set.md minor changes * Update yarn.lock update yarn.lock * Update unordered-set.md * format:verify fixes * Minor changes --------- --- .../concepts/unordered-set/unordered-set.md | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 content/cpp/concepts/unordered-set/unordered-set.md diff --git a/content/cpp/concepts/unordered-set/unordered-set.md b/content/cpp/concepts/unordered-set/unordered-set.md new file mode 100644 index 00000000000..1b4e4614cce --- /dev/null +++ b/content/cpp/concepts/unordered-set/unordered-set.md @@ -0,0 +1,107 @@ +--- +Title: 'Unordered Sets' +Description: 'Unordered sets are associative containers that store unique elements in no specific order, offering fast retrieval through a hash-based implementation.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Data Types' + - 'Elements' + - 'Hash Maps' + - 'Sets' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, **unordered sets** are associative containers that store unique elements in no particular order, offering fast look-ups, insertions, and deletions through a hash table. Unlike [`std::set`](https://www.codecademy.com/resources/docs/cpp/sets), which maintains elements in sorted order using a binary tree, unordered sets provide better performance with average constant time complexity for key operations. If elements are needed in a sorted order, `std::set` can be used, although it comes with higher overhead due to its tree-based structure. + +## Syntax + +```pseudo +#include +std::unordered_set set_name; +``` + +- `data_type`: The [data type](https://www.codecademy.com/resources/docs/cpp/data-types) of the elements to be stored in the unordered set (e.g., `int`, `string`). Each element in the unordered set will be of this type. +- `set_name`: The name of the unordered set being defined. + +## Example + +In this example, an unordered set is initiated and elements are inserted using the [`.insert()`](https://www.codecademy.com/resources/docs/cpp/sets/insert) method. The elements are then printed: + +```cpp +#include +#include + +int main() { + // Initiate an unordered set of elements (integers in this example) + std::unordered_set numSet; + + // Insert the elements + numSet.insert(10); + numSet.insert(20); + numSet.insert(30); + numSet.insert(40); + + // Print out the set elements + std::unordered_set :: iterator iter; + for (iter = numSet.begin(); iter != numSet.end(); iter++) { + std::cout<< *iter << " "; + } +} +``` + +The output would be: + +```shell +20 40 30 10 +``` + +> **Note**: The element order is not guaranteed to be consistent across executions. + +## Ordered vs Unordered Sets + +| Feature | Ordered Set (`std::set`) | Unordered Set (`std::unordered_set`) | +| ----------- | ----------------------------------------------- | ------------------------------------------------------------- | +| Order | Elements in sorted order | No particular order | +| Structure | Tree-based | Hash table | +| Time | O(log n) | O(1) | +| Memory | More efficient memory usage | Higher memory usage as a result of hashing | +| Performance | Consistent performance across all cases | Can degrade to O(n) if hashing is poor | +| Usage | Use when element ordering is useful or required | Use when efficiency is required and ordering is not important | + +> **Note**: Neither `std::set` nor `std::unordered_set` allows duplicate elements. + +## Codebyte Example + +This example builds on the previous example, adding a duplicate element to show it won't be included, and then checking if an element exists: + +```codebyte/cpp +#include +#include + +int main() { + // Initiate an unordered set of elements (integers in this example) + std::unordered_set numSet = {10, 20, 30, 40}; + + // Add a duplicate element + numSet.insert(20); + + // Print out the set elements + std::unordered_set :: iterator iter; + for (iter = numSet.begin(); iter != numSet.end(); iter++) { + std::cout<< *iter << " "; + } + + // Add a line break + std::cout << "\n"; + + // Check if an element exists + if (numSet.find(20) != numSet.end()) { + std::cout << "20 is in the set."; + } else { + std::cout << "20 is not in the set."; + } +} +``` From dafaef5cb36ca6d560435d0a56ea5f7ff61fb702 Mon Sep 17 00:00:00 2001 From: ozearkhan Date: Wed, 23 Oct 2024 19:56:00 +0530 Subject: [PATCH 058/108] [Term Entry] CSS Position: relative * added css position: relative * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/relative/relative.md Co-authored-by: Mamta Wardhani * Update relative.md minor changes * Minor changes --------- --- .../position/terms/relative/relative.md | 128 ++++++++++++++++++ media/css-position-relative-ex1.png | Bin 0 -> 9020 bytes media/css-position-relative-ex2.png | Bin 0 -> 4469 bytes 3 files changed, 128 insertions(+) create mode 100644 content/css/concepts/position/terms/relative/relative.md create mode 100644 media/css-position-relative-ex1.png create mode 100644 media/css-position-relative-ex2.png diff --git a/content/css/concepts/position/terms/relative/relative.md b/content/css/concepts/position/terms/relative/relative.md new file mode 100644 index 00000000000..fad4ade56d2 --- /dev/null +++ b/content/css/concepts/position/terms/relative/relative.md @@ -0,0 +1,128 @@ +--- +Title: 'relative' +Description: 'Positions an element relative to its normal document flow placement, allowing for improved styling control.' +Subjects: + - 'Web Design' + - 'Web Development' +Tags: + - 'CSS' + - 'Elements' + - 'Positioning' + - 'Values' +CatalogContent: + - 'learn-css' + - 'paths/front-end-engineer-career-path' +--- + +In CSS, the **`relative`** value of the `position` property allows an element to be positioned relative to its normal position in the document flow, enabling adjustments without affecting the layout of surrounding elements. + +## Syntax + +```pseudo +position: relative; +``` + +When an element is set to `position: relative`, the [`top`](https://www.codecademy.com/resources/docs/css/position/top), [`right`](https://www.codecademy.com/resources/docs/css/position/right), [`bottom`](https://www.codecademy.com/resources/docs/css/position/bottom), and [`left`](https://www.codecademy.com/resources/docs/css/position/left) properties can be used to offset it from its normal position as follows: + +```pseudo +selector { + position: relative; + top: ; + right: ; + bottom: ; + left: ; +} +``` + +- ``: A value that can be specified in pixels (px), ems (em), rems (rem), percentages (%), or other [CSS units](https://www.codecademy.com/resources/docs/css/units). Positive values move the element away from the specified edge and negative values move it towards the specified edge. + +## Example 1 + +This example demonstrates basic relative positioning of a single element. Here is the HTML code: + +```html +
+
+
+``` + +Here is the CSS code: + +```css +.container { + position: relative; /* Enables child elements to be positioned absolutely within this container */ + width: 600px; + height: 360px; +} + +.box { + position: relative; /* Shifts this box relative to its normal position */ + top: 50px; /* Moves the box 50px down from its original position */ + left: 100px; /* Moves the box 100px to the right from its original position */ + width: 200px; + height: 200px; +} +``` + +Here's what the above example's output looks like: + +![CSS Relative Position Example Output](https://raw.githubusercontent.com/Codecademy/docs/main/media/css-position-relative-ex1.png) + +In this example, the blue box is moved 50 pixels down and 100 pixels to the right from its original position within the container. + +## Example 2 + +This example covers additional aspects of relative positioning, including [`z-index`](https://www.codecademy.com/resources/docs/css/position/z-index) and percentage-based positioning. Here is the HTML code: + +```html +
+
Z-index: 2
+
50% left
+
Z-index: 3
+
+``` + +Here is the CSS code: + +```css +.container { + position: relative; /* Enables absolute positioning for its child elements */ + width: 300px; + height: 300px; +} + +.box { + position: relative; /* Shifts this box relative to its normal position */ + width: 100px; + height: 100px; +} + +#box1 { + z-index: 2; /* Stacks this box above others with lower z-index */ +} + +#box2 { + top: -50px; /* Moves this box 50px up from its original position */ + left: 50%; /* Moves this box 50% to the right from its original position */ + z-index: 1; /* Stacks this box below others with higher z-index */ +} + +#box3 { + top: -100px; /* Moves this box 100px up from its original position */ + left: 25%; /* Moves this box 25% to the right from its original position */ + z-index: 3; /* Stacks this box above others with lower z-index */ +} +``` + +The above code produces the following output: + +![CSS z-index and Percentage-Based Positioning Example Output](https://raw.githubusercontent.com/Codecademy/docs/main/media/css-position-relative-ex2.png) + +This advanced example demonstrates: + +1. The `z-index` usage to control stacking order of relatively positioned elements. +2. Percentage-based positioning (50% and 25% left). +3. Negative values for top positioning to move elements upwards. +4. The way relatively positioned elements interact with each other in the same container. + +The green box (`#box3`) appears on top due to its higher `z-index`, even though it is declared last in the HTML. The orange box (`#box2`) is positioned 50% from the left edge of the container, while the green box is 25% from the left. diff --git a/media/css-position-relative-ex1.png b/media/css-position-relative-ex1.png new file mode 100644 index 0000000000000000000000000000000000000000..80c5f4d434a0a67d46367ddb583f091c0a1dd044 GIT binary patch literal 9020 zcmeHMX;f2Lw!RnyN@NmSQ4lDoGS#h+FeQW`IDnSLq$L)mObHMm5E4iNiG)ExR79n# zc@7xHrg28PLWtyi6G+>sCW|5atRX~PD-M>L!qlI)zI6iR5CvNBRY{{i+$gd zw4`DSP8x=dq`>TK;Y+V&Y3a5s@3K9TveaBQvLBcDzOmdQ;NM$Hz>+DrfWrwmcj)&x z3Mq*kfqRdzq@)JfNycHRxJa};+}_c~4sK&-=LY+4LrXS(Rq&!y_e7%M2pkS&kF~Qw zA>b$*N5?3njdKJJWfS3qL^wD)+o2E$`;S1&Dxbpa3I|b~?49fpPAEG^J0!}<8U9h> z{otqa0i>jen5C(pf5rW^@4c)WY{|O>{IXNtH`HGF2)yjFWx?Ns<$oTk$cT?&N=PCT z-lsrh1Pn*O#p8(7r6Ad|u3YTTcnqm^2nE5=kzcU9iI$1x=}Jp{b0|3{pGc|y#XLYoIQkVa;&b6lo`-tcIp%x!k7PL# zJ@+J=RugUGQ<*-MJJACHNIaV`t}-xvVtwaT9i>Ou;tN?#{NUPx)Tpml)x90y$?Eql ze66u9tP@@RPM9w8$iWQ$&GDgWh`hMEt4Tg3xrO9Gp-ai+WR?V2sc^OsLTg-vazm8SbXl%2v zGI=%f(~xXh5~@ktZ7$r%ElfKAbmi-4rMPa+)WGQHU`mljtM4`%^R|(!OpY9eW*!~z zgadE=G$EWE3@}y%N*eQkN3KSz-+>AjX&|7lCIl|_gm*D@v@iqz768|;jT8@J6y^IC z!t{=OcM?;|Vy)qw*fpYkd?c$m>JDnYyr%6+;AYlMk-O_WKbFxR&Y1sRezc`+{SU2q z`og1c6uF=e-sm?eb$|nFz^QVqWiypyx8{;nrS1&u!o7kU>+%|h5~}OdD&65RQjuHI zM7RT=9u!CyMlt4|jPBnu5}4;wcgJr2!E0GgAaAhK-+j* z>g0n-U?%iOA>Z@ zBJY?PLkHNdSyqMYu6DNpMhU5kH9om{_FZSLR;!)~WUq}HY(x8Zj*~$bgISJE85Hp` ze0_48TwvYS*WX~wqunZ*b}t!-g}u?rYVABd+!}?m4sTc-d}0@kwmN6BrJH2=Ts(VNUzU? znb+j~vOh?a?W%3z`g)LuH9L(RA%5c`e+n6-T7o$}(1GR&n)FXT|I zy`wZ*@#4D&Os>EDXwlH9Y2al$L8xO4tT28@BMWkf<;|bh6)Cf4vZ{{`jSUoCGtyqS zH4m~4T)lIr2HP$KGArAAFB`(nG!#AT5S?#5W6%+0??VioIG$b=d`XhX3gN$-S(#Oi zJWL;9afs0y`W>^Sv~d;}eK9ri+Cg{wGxXVOMD3h%v3JiIi;TLyTXa~i#?|v6E4(q{ zok)&)S&Y1hm>L~J#)P4{cz4ZRzF>ah)Y0+I+T)SA~$>t;`^Vl#L6+zLXcSfA`gWi&D(a=q6v z&$ai6zgDCOe&9XTQSN6KYfS&J!~z49Oasu#o01*Oid|+R`zQ8yp7v8F6Z2tJO>H5s zfWh`9WLCZFFRtOUCtQ)w;4Fzgp-0n^E#<^O!n^y7oeL3QHxYO*2(dU&ks;MslY^NJsg(?}i7AEivow$Sm<6ZlWFIbVLYQ{M)9PZX zmB|BeOM2-EpO;w4NEt7$acOO?xaV%fix2SNau|G`(4A zv>LvSSE%m^Uker!nL3+GbdHC6!nYanMvZxUPwQyuyvIFd!~?c#=KE{zw6ij?Jc*gj z!F&S-T+_%0ZM3@OB<6@^W*aoK%*1H5A!z+G*itM$`|NXSd|pofA6TQX&8UAhvd>^E zLMZ%J^w!BXPZrrmi>vfe?jh(n*cC zgMqiw_G<3b0NJ<@Z{$||ld8LZVsO&&cmyJm3V~QXMV7dKJHY0M)KF~J#|n2%qeAbt&TS8*PBve;uOO%is=OM z!$Y(VuPkfp8UvD(w`s^68u@y7?o`W!s}H)Gd{3AZ^Q@oM+s_&3uaEeL)M zDpCAuYGZO7W8rwUb?cd(<3?%^%QkhV(#qq6c$_k?1z%R%vo)#yu+Wc)b|X|BB1mmc zmk3Vfm+xh^2;4YjOkKNq1#u2t^W6N^K(yk4sX;G77(x;{yf7sdqe$?2JWla$$~$zR zSkXatbE;3QsE?*dWDjplsOBXn)%(3dKkhtob66O&|91DeH`PHRT&{q6lKc8PEu~Sn z%X?j3VX8ERF@u@q(ymLpV)(5g#s&z9-%?>L@G!A(3mF2FYLLy2?cN!~6|wyvn6x=bj^a*bc8v5x2WHx0BeEbgHFjj3st-GH1QdM+Y< zAvhXwTjty@Fcti%0g@G=uTM)^K%RA{OBa4h92SOxHw24AW?t&*XmI~TP9^cL_p~nz zw@R)T{WKWV4SGNkiu5k4=eXK$>A`D?eFJ0smVt6HHGKQ>As(^!VtgmcxQl z@lRgl49*{_Pp}Up2HMt)Z}lM}peC_jE!Ah}?5GgN+}2E}g=pQ?O$Vh2-{*_EqWP@e z+x6PVs|y7oh@O6a`7n$q|eIq zm=~e^GkcIsQ|SD9)bkHj8#?=vD|>@ZzOdlHvh$DqOWj%@4u4&?_s zl)W9t1b8cMRnVL6RF&`kxu3CHue?EAl1+b)>}O!2?=?4NM@7^^_@i+*L@3b1S)3q} zV@6{)=k-qS35$InC_=XOlHSYoWW-GA!Ty3d#?(F8L?y9bswm=EPC1iJb4^N%Qt>r? zJ(Kr~7R_vf+-|ouo2JCxNKm46sa&>;!dR}`GyMPhn*w-yp^scCB6IYt0k#fhF?6@9@SaFzFS}%nPI*04` zUEsP>OdB4h4eOon^38ZSYH+qh13cNBwQvuSoc#Fm0Sy_|L0Zz`eFY3L0jOhRXDj1c z1%gUbpeg-uEmKT_ZQ9VDW(+&a_ts_v8Fl{gLqU`)pNUb7c0b0YHgX4EU*6W3LKY{} z*=${bW2S#&)-Mwu3hlxAp7g7IhvP|)``pxaqAD_q0URyijr?~j*&S4irCqu}iXc%A6ely}-( zCJ#$r`wf19bK z&&hy-Sj#S(R;7*(xdOnT=M-C78@34JQg?YxcPejWD08{fRT|)cQqZZI>{Pt-a482r zGXj23`gc!{qbbc9s+zEsz>$2~kh0nUeaETQNby8BPxY$c1gJIYuIjh0;>w#O;Emu0z1S60|+iL0$?Hzh!$)UBC@mb=mv@RnwzEH9{dfy#>7l~$UU zRLteI1WZjxP^rxD5?WqhDFT`bCZVPx0RqR)(|$SU+uwOO-(C;%o8N!VhcV`yV~qKm z^Nu&d&2ZiJbpQas(EWtV8314z=0{tzYH7s8wK8$3TNZo9%?Uv3+VN#ctO!4T>No&U zld*m=XyuY#`}+yMSO8#S%a68Rr&RA1|4lOADR zTzTWhF>m^Bk55EQ))t%X85q9xNOP=*d;JOOrFRE23pM}8fxXe-n-4l|ZVvwX3iRM2 z)xtC&>z}{exbgJusyR2?qQ^^D3dYpgtF{hr9}}XVLI`}z?RO3#zlwyGwrN_nRc(& zS^it*{o-)4=CWik@GNTjO63MF(nlG+WFPFgAOwoPOjKg1)b0hLf3rt?pQBNr)0 z*HBJ?WPu%KoN5#VHC>-x5!+3$DukV#UT%e`^!1Vp^2;Z6M|?DdBC^_Cj3Vr&KI5Fr z>PC41fm3pXTvMs6Bg~v0Y@{Z9{cH;gnO&VNdiO4gOIBV^S;g3yJek%?Px}H(w(o{$Qo-4{_omN#I^2|QB2&%P8s^vxHm?BfI*TJ?<~c#uHL$)ECi)<Vz?;ZddThGq`n?ZkSE}Of_Iek2g8x;eYE!banjKD; zG)u9oji=~M3OuKGT)ZLMxqP7>yMfc&+R{{=Kd785Zhz&{qy)`sR9edTDXL!JL@@Y1 z@&UXp@M7*O-<+}=I;Py(V`T}ZHI^9{DR7Q0Sh9!V^M&tky?5S7(a(t#6!>F;ccU@M2!2Z;sul1+s!{blxkD_hxQ|emuDP4tet= z9x-<8$baW4O|!lhr%mgIr+7IUOZ6OuDV{2JUbM)8Y1pGV0%43Y(bFjoQZwwnWLR;@Wk zS+?BhKUi-2^08_!H7V$W96o9M{I1?{@q5CY_Oy_{UHQFc@yU3N^ZChZf(f>$t>J^a zZkL!U?GdH-lR9MSFnD%`Z_6*K^QVOkH@6I&+VjSm!+c|< z4_=2Zo&U@f6_3YFh*w8PITZA~Z&XF6FMPyDyWO_4c1`CMGc_{4&yy)p%-z8 zg{XT6CJ9Kfx4|O50GqLu69e&ZKnn&~M9vtPB$2jDQNdhc&1Lob@h?oa zxj$n%ivBMb2P$PL_#)}x>4BarInI8Amp~E+94gl$Oe+nwn25x5-nig|Uaq^KQ`f%q z2Js{iJnL^_abAf|wxcu5{WCCz;&DU(z6QC3u3H7x^c=zf>`40-WAgbXdkMY`YMm zle`FXyf#>WE?C263wi<$Y2T?DkcI~la|Q8K77|Otv^i(=OEb136Ug$8tZ0g#ts{oF z|4vL>2eA4|N~lq5{C!qo?p;#FWY_JVeQ-!DAvzX+n221v=#aCIDeXaNkXie|y-BPc zZ{Hp8^LiRzOZZ&8gaE;K(jRB^Lg z{ZoIBtV{i|;R02|qb_*rFUaT0utSQW(FhIAP9eJ8ZCjcNhvv{ELc`UB2fGG(V2zhL z70mVVj!5VX0ZOEcxY?f@McVHb+y#kaf_C+WNCm%19~3pk=3O~|otiNfNw4tQ6+xd1 zs+E{s4y(NDv06lq-T=DhOWYHAa?=Otww`rDn#ts=Vikyb0g6AMEatq?Oj3q zefhmzQXeQd>gUk0#g6>;1%`davn1O>#~cEF*r^WY+x(@OpjqsynbmH*a=zSG>=u+!WTB-?7c`m1==ZtEKVuP+0#*R3kHp_R_Tp$~0R zQPcJ^$sUglkXM{r*8?6Kbsr&*B6&gqUod-2Ur^orEn;p+=GGkt8dZ^SlMN#5Mz4i5 zf(7!DQ=$9o8!f@;GWcND)_QDDGo zTT@?7PJRl<(*_iQgWk$yT17RYf2|z}>qGn}I%ikAnAkSZjcJ?_j>L{NNpWZ?Jv*v!@Qy zFN|JW79)P|@V4eu{f zPvv#R4kz$t(9n;_o@?#qJgYNz#DO~#_wt@uzLla&ZJ|EXW%1Y1zodz`&`ND}e1*B^ zwi?tmTJr&4GaHZ1`B+?@D5fKG&U?05Ee!PAd->4bed{iix(>58b>r z5N|`mFGeO$vE5()Y9!lQp7IJDSLWKVt^|pi5S=WA@_m$8XUyyMH6S62+U%+mNz>^K zUA=^Gzw(-ksl-Q)#5g1FZ1JVobd^f`X97NCT>`ZIeg;Fkm!NGc;y;|${t`&}Z#Ws)KYzco7e_o!j}jx5fZV&imKl9b v4Tt;;R=k*K-+pyGy!QWw&UbQp^alEvWxE`iF;z=nB>?xoBV1@sf!F^Fh_f;{ literal 0 HcmV?d00001 From 9660a385dcf41c46a0b158ea4bfdeaf7caa4efba Mon Sep 17 00:00:00 2001 From: jkayk Date: Thu, 24 Oct 2024 00:00:42 +0900 Subject: [PATCH 059/108] [Edit] AI Neural Networks: Gaussian Activation Function --- .../gaussian-activation-function.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/content/ai/concepts/neural-networks/terms/gaussian-activation-function/gaussian-activation-function.md b/content/ai/concepts/neural-networks/terms/gaussian-activation-function/gaussian-activation-function.md index 02a5e15055e..dc12b2e2718 100644 --- a/content/ai/concepts/neural-networks/terms/gaussian-activation-function/gaussian-activation-function.md +++ b/content/ai/concepts/neural-networks/terms/gaussian-activation-function/gaussian-activation-function.md @@ -1,6 +1,6 @@ --- Title: 'Gaussian Activation Function' -Description: 'The Gaussian activation function takes the input and transforms it into a Gaussian or Normal Distribution curve, with the output values varying depending on the specific implementation and parameters.' +Description: 'The Gaussian activation function shapes the output of a neuron into a bell-shaped curve that is symmetric about its unique peak.' Subjects: - 'Machine Learning' - 'Data Science' @@ -19,7 +19,7 @@ A **Gaussian activation function** is a mathematical function known as the norma ## Gaussian Function -Characterized by its bell-shaped graph, where most data points are near the middle (average), and the likelihood of getting values decreases as you move away from the average. This curve is symmetric, meaning that the probabilities of getting values above the average are the same as getting values below the average. +The Gaussian function is characterized by its bell-shaped graph, where most data points are near the middle (average), and the likelihood of getting values decreases as you move away from the average. This curve is symmetric, meaning that the probabilities of getting values above the average are the same as getting values below the average. ![Gaussian function](https://raw.githubusercontent.com/Codecademy/docs/main/media/gaussian-function-1d.png) @@ -27,21 +27,21 @@ Characterized by its bell-shaped graph, where most data points are near the midd ### Advantages -- Smooth and Continuous: The Gaussian activation function is smooth and continuous everywhere, making it fully differentiable with a consistent gradient. This property simplifies the process for optimization algorithms to find the best solution. -- Non-Linear Properties: It introduces non-linearity to the neural network, enabling the network to capture complex relationships between inputs and outputs. +- **Smooth and Continuous**: The Gaussian activation function is smooth and continuous everywhere, making it fully differentiable with a consistent gradient. This property simplifies the process for optimization algorithms to find the best solution. +- **Non-Linear Properties**: It introduces non-linearity to the neural network, enabling the network to capture complex relationships between inputs and outputs. ### Disadvantages -- Risk of Overfitting: A more complex network can lead to overfitting, where the model overly specializes in the training data and fails to generalize to new, unseen data. -- Increased Network Complexity: Implementing the Gaussian function can add complexity to the neural network, often requiring more computational power and time for training. -- Potential for Local Minima Traps: The Gaussian function may increase the likelihood of the network getting trapped in local minima during the optimization process. This can hinder the achievement of the most optimal solutions. +- **Risk of Overfitting**: A more complex network can lead to overfitting, where the model overly specializes in the training data and fails to generalize to new, unseen data. +- **Increased Network Complexity**: Implementing the Gaussian function can add complexity to the neural network, often requiring more computational power and time for training. +- **Potential for Local Minima Traps**: The Gaussian function may increase the likelihood of the network getting trapped in local minima during the optimization process. This can hinder the achievement of the most optimal solutions. -## Practical Uses for Gaussian Activation Functions +## Practical Uses for the Gaussian Activation Function -Gaussian activation function plays a pivotal role in various AI and machine learning applications across different industries, such as: +The Gaussian activation function plays a pivotal role in various AI and machine learning applications across different industries, such as: -- Image Processing and Computer Vision: In image processing, Gaussian functions are used for smoothing or blurring images. This is crucial in pre-processing steps to reduce noise and improve the quality of feature extraction, which is vital in computer vision tasks like object detection, face recognition, and image segmentation. Additionally, Gaussian functions are used for applications like earth observation, weather forecasting, and environmental monitoring. -- Regression Analysis: Gaussian functions are foundational in Gaussian Processes, a powerful tool for regression analysis in machine learning. They provide a probabilistic approach to modeling uncertainties in predictions, which is important in fields like financial modeling, environmental modeling, and robotics. For instance, they help in modeling stock price variations and market trends, allowing financial analysts to predict future movements and manage risks more effectively. -- Pattern Recognition and Classification: Gaussian functions are often used in algorithms for pattern recognition and classification tasks. In these scenarios, they help to model the distribution of data points, allowing the system to differentiate between various categories or classes effectively. For example, in retail and e-commerce, Gaussian functions aid in customer behavior analysis and sales forecasting in the retail sector. By modeling customer purchase patterns, businesses can predict future sales trends, optimize inventory management, and enhance personalized marketing strategies. -- Natural Language Processing (NLP): In NLP, Gaussian distributions can be used in probabilistic models like Gaussian Mixture Models (GMMs) for clustering or classifying text data. They help in understanding the underlying structure of language data, which is essential for applications like sentiment analysis, topic modeling, and language generation. -- Reinforcement Learning: In reinforcement learning, especially in continuous action spaces, Gaussian functions are used to model the probability distribution of actions. This assists in the exploration-exploitation trade-off, where the algorithm needs to decide between exploring new actions and exploiting known rewarding actions. +- **Image Processing and Computer Vision**: In image processing, Gaussian functions are used for smoothing or blurring images. This is crucial in pre-processing steps to reduce noise and improve the quality of feature extraction, which is vital in computer vision tasks like object detection, face recognition, and image segmentation. Additionally, Gaussian functions are used for applications like earth observation, weather forecasting, and environmental monitoring. +- **Regression Analysis**: Gaussian functions are foundational in Gaussian Processes, a powerful tool for regression analysis in machine learning. They provide a probabilistic approach to modeling uncertainties in predictions, which is important in fields like financial modeling, environmental modeling, and robotics. For instance, they help model stock price variations and market trends, allowing financial analysts to predict future movements and manage risks more effectively. +- **Pattern Recognition and Classification**: Gaussian functions are often used in algorithms for pattern recognition and classification tasks. In these scenarios, they help to model the distribution of data points, allowing the system to differentiate between various categories or classes effectively. For example, in retail and e-commerce, Gaussian functions aid customer behavior analysis and sales forecasting. By modeling customer purchase patterns, businesses can predict future sales trends, optimize inventory management, and enhance personalized marketing strategies. +- **Natural Language Processing (NLP)**: In NLP, Gaussian distributions can be used in probabilistic models like Gaussian Mixture Models (GMMs) for clustering or classifying text data. They help in understanding the underlying structure of language data, which is essential for applications like sentiment analysis, topic modeling, and language generation. +- **Reinforcement Learning**: In reinforcement learning, especially in continuous action spaces, Gaussian functions are used to model the probability distribution of actions. This assists in the exploration-exploitation trade-off, where the algorithm needs to decide between exploring new actions and exploiting known rewarding actions. From 28df2e870cb4d213ad49fe84cef2cdafcb10f2d7 Mon Sep 17 00:00:00 2001 From: codecademydev Date: Sun, 27 Oct 2024 13:06:46 +0000 Subject: [PATCH 060/108] =?UTF-8?q?=F0=9F=A4=96=20update=20concept=20of=20?= =?UTF-8?q?the=20week?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/concept-of-the-week.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/concept-of-the-week.txt b/bin/concept-of-the-week.txt index 310bf96da85..42bb1a2ef3b 100644 --- a/bin/concept-of-the-week.txt +++ b/bin/concept-of-the-week.txt @@ -1 +1 @@ -content/general/concepts/jit-compilation/jit-compilation.md \ No newline at end of file +content/git/concepts/reset/reset.md \ No newline at end of file From 63456341c0cf274eae1bbbcf1c08beaf53538e31 Mon Sep 17 00:00:00 2001 From: SaiTeja-002 <95877599+SaiTeja-002@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:55:45 +0530 Subject: [PATCH 061/108] Feat: [Term Entry] PyTorch Tensor Operations .split() (#5551) * [Term Entry] PyTorch Tensor Operations .split() * Update split.md * Fix Linting Issue * Update split.md minor changes --------- --- .../tensor-operations/terms/split/split.md | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/split/split.md diff --git a/content/pytorch/concepts/tensor-operations/terms/split/split.md b/content/pytorch/concepts/tensor-operations/terms/split/split.md new file mode 100644 index 00000000000..a168064da07 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/split/split.md @@ -0,0 +1,136 @@ +--- +Title: '.split()' +Description: 'Splits a tensor into chunks of specified sizes along a given dimension.' +Subjects: + - 'Computer Science' + - 'Machine Learning' + - 'Data Science' +Tags: + - 'Python' + - 'Machine Learning' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +In PyTorch, the **`.split()`** function is used to split a tensor into chunks of specified sizes along a specified dimension and returns a tuple of tensors. It is useful for processing smaller segments of data independently. + +## Syntax + +```pseudo +torch.split(tensor, split_size_or_sections, dim=0) +``` + +- `tensor`: The tensor to be split. This is a required parameter. +- `split_size_or_sections`: Specifies the size of each chunk. If an integer, it defines the number of elements in each chunk. If a list of integers, it specifies the exact size of each chunk in order. +- `dim`(Optional): The dimension along which to split the tensor. The default value is 0. + +## Example + +The following example illustrates the usage of `.split()` in various scenarios: + +```py +import torch + +# a 1D tensor and a 2D tensor +tensor_1d = torch.arange(1, 13) +tensor_2d = tensor_1d.reshape(2, 6) + +print(f"Input 1D Tensor - {tensor_1d}") + +# Case 1: Splitting into equal chunks of size 3 +equal_chunks = torch.split(tensor_1d, 3) +print("\nCase 1: Equal Chunks (Size = 3)") +for chunk in equal_chunks: + print(chunk) + +# Case 2: Splitting into unequal chunks of sizes [4, 3, 5] +unequal_chunks = torch.split(tensor_1d, [4, 3, 5]) +print("\nCase 2: Unequal Chunks (Sizes = [4, 3, 5])") +for chunk in unequal_chunks: + print(chunk) + +# Case 3: Attempting to split with non-divisible chunk size +non_divisible_split = torch.split(tensor_1d, 5) +print("\nCase 3: Non-Divisible Chunk Size (Size = 5)") +for chunk in non_divisible_split: + print(chunk) + +print(f"\nInput 2D Tensor - {tensor_2d}") + +# Case 4: Splitting a 2D tensor along rows (dim=0) +row_split = torch.split(tensor_2d, 1, dim=0) +print("\nCase 4: Split Along Rows (dim=0, size=1)") +for chunk in row_split: + print(chunk) + +# Case 5: Splitting a 2D tensor along columns (dim=1) +col_split = torch.split(tensor_2d, 3, dim=1) +print("\nCase 5: Split Along Columns (dim=1, size=3)") +for chunk in col_split: + print(chunk) + +# Case 6: Splitting a 2D tensor into unequal sizes along columns (dim=1) +uneven_split_2d = torch.split(tensor_2d, [1, 3, 2], dim=1) +print("\nCase 6: Unequal Split Sizes on 2D Tensor ([1, 3, 2], dim=1)") +for chunk in uneven_split_2d: + print(chunk) + +# Case 7: Unequal split with sizes that do not sum up to the tensor size +# In this case, .split() raises an error when the sizes don't add up correctly. +print("\nCase 7: Unequal Split Sizes That Do Not Sum Upto the 2D Tensor Size ([1, 3, 3], dim=1)") +try: + error_split = torch.split(tensor_2d, [1, 3, 3], dim=1) + + for chunk in error_split: + print(chunk) + +except RuntimeError as e: + print(f"RuntimeError - {e}") +``` + +The above program gives the following output: + +```shell +Input 1D Tensor - tensor([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) + +Case 1: Equal Chunks (Size = 3) +tensor([1, 2, 3]) +tensor([4, 5, 6]) +tensor([7, 8, 9]) +tensor([10, 11, 12]) + +Case 2: Unequal Chunks (Sizes = [4, 3, 5]) +tensor([1, 2, 3, 4]) +tensor([5, 6, 7]) +tensor([ 8, 9, 10, 11, 12]) + +Case 3: Non-Divisible Chunk Size (Size = 5) +tensor([1, 2, 3, 4, 5]) +tensor([ 6, 7, 8, 9, 10]) +tensor([11, 12]) + +Input 2D Tensor - tensor([[ 1, 2, 3, 4, 5, 6], + [ 7, 8, 9, 10, 11, 12]]) + +Case 4: Split Along Rows (dim=0, size=1) +tensor([[1, 2, 3, 4, 5, 6]]) +tensor([[ 7, 8, 9, 10, 11, 12]]) + +Case 5: Split Along Columns (dim=1, size=3) +tensor([[1, 2, 3], + [7, 8, 9]]) +tensor([[ 4, 5, 6], + [10, 11, 12]]) + +Case 6: Unequal Split Sizes on 2D Tensor ([1, 3, 2], dim=1) +tensor([[1], + [7]]) +tensor([[ 2, 3, 4], + [ 8, 9, 10]]) +tensor([[ 5, 6], + [11, 12]]) + +Case 7: Unequal Split Sizes That Do Not Sum Upto the 2D Tensor Size ([1, 3, 3], dim=1) +RuntimeError - split_with_sizes expects split_sizes to sum exactly to 6 (input tensor's size at dimension 1), but got split_sizes=[1, 3, 3] +``` From e21903bad6677d70815021d709f97c07dbc3621d Mon Sep 17 00:00:00 2001 From: ozearkhan Date: Mon, 28 Oct 2024 16:08:57 +0530 Subject: [PATCH 062/108] Added C++ docs for map .upper_bound() with examples (#5510) * Added C++ docs for map .upper_bound() with examples * added example in cpp upper-bound * Update upper-bound.md * Update upper-bound.md minor fixes --------- --- .../maps/terms/upper-bound/upper-bound.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 content/cpp/concepts/maps/terms/upper-bound/upper-bound.md diff --git a/content/cpp/concepts/maps/terms/upper-bound/upper-bound.md b/content/cpp/concepts/maps/terms/upper-bound/upper-bound.md new file mode 100644 index 00000000000..9bbcdc57fc1 --- /dev/null +++ b/content/cpp/concepts/maps/terms/upper-bound/upper-bound.md @@ -0,0 +1,95 @@ +--- +Title: '.upper_bound()' +Description: 'Returns an iterator to the first element that is greater than the specified key.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Classes' + - 'Objects' + - 'OOP' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +The **`.upper_bound()`** function in a map returns an iterator pointing to the first element whose key is greater than the given key. If no such key exists, the iterator points to the map's `.end()`. + +## Syntax + +```pseudo +mapName.upper_bound(key); +``` + +- `key`: The key whose upper bound is needed. + +## Example + +The example below demonstrates using `.upper_bound()` to find the first student with a roll number greater than a specified value: + +```cpp +#include +#include + +int main() { + // Map with roll numbers as keys and student names as values + std::map students; + + students[101] = "John"; + students[103] = "Alice"; + students[105] = "Bob"; + + // Find the first student with a roll number greater than 102 + auto it = students.upper_bound(102); + + if (it != students.end()) { + std::cout << "The student with roll number greater than 102 is: " << it->second << " (Roll No: " << it->first << ")" << std::endl; + } else { + std::cout << "No student found with roll number greater than 102." << std::endl; + } + + return 0; +} +``` + +The code above produces the following output: + +```shell +The student with a roll number greater than 102 is: Alice (Roll No: 103) +``` + +## Codebyte Example + +The following codebyte example demonstrates how `.upper_bound()` works by returning iterators to keys greater than 11, 13, and 17 in a map of integers: + +```codebyte/cpp +#include +#include + +int main() { + // Initializing map + std::map mp; + + // Adding elements + mp.insert({12, 30}); + mp.insert({11, 10}); + mp.insert({15, 50}); + mp.insert({14, 40}); + + // Upper bound when the key is present + auto it = mp.upper_bound(11); + std::cout << "The upper bound of key 11 is " << it->first << " " << it->second << std::endl; + + // Upper bound when the key is absent + it = mp.upper_bound(13); + std::cout << "The upper bound of key 13 is " << it->first << " " << it->second << std::endl; + + // Upper bound when key exceeds maximum key + it = mp.upper_bound(17); + if (it == mp.end()) { + std::cout << "The upper bound of key 17 points to end()." << std::endl; + } + + return 0; +} +``` From 16fcf59e6dbaa9547dac9973bfd692bb2abbfd89 Mon Sep 17 00:00:00 2001 From: shantanu <56212958+cigar-galaxy82@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:08:15 +0530 Subject: [PATCH 063/108] [New Entry] Swap Method Maps C++ (#5549) * added maps swap * Update swap.md * Update swap.md * Update swap.md * Update swap.md prettified * Update swap.md --------- --- content/cpp/concepts/maps/terms/swap/swap.md | 128 +++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 content/cpp/concepts/maps/terms/swap/swap.md diff --git a/content/cpp/concepts/maps/terms/swap/swap.md b/content/cpp/concepts/maps/terms/swap/swap.md new file mode 100644 index 00000000000..3a05bee47da --- /dev/null +++ b/content/cpp/concepts/maps/terms/swap/swap.md @@ -0,0 +1,128 @@ +--- +Title: '.swap()' +Description: 'Exchanges the content of two maps.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Objects' + - 'OOP' + - 'Classes' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, **`.swap()`** function exchanges the contents of two maps in constant time, provided the maps are of the same type, though their sizes may differ. + +## Syntax + +```pseudo +map1.swap(map2); +``` + +- `map1`: The first map whose contents will be swapped. +- `map2`: The second map to exchange contents with `map1`. + +> **Note:** If `map1` and `map2` are not of the same type (i.e., they do not have the same key and value types), a compilation error will occur because `std::map::swap()` requires both maps to have the same type. + +## Example + +The following example shows how the `swap()` funcrion works: + +```cpp +#include +#include +using namespace std; + +int main() { + map map1{{1, "one"}, {2, "two"}, {3, "three"}}; + map map2{{4, "four"}, {5, "five"}, {6, "six"}}; + + cout << "Before swap Map1:\n"; + for(map::iterator it = map1.begin();it != map1.end();++it) { + cout << "Key: " << it->first<< ", Value: " << it->second << endl; + } + + cout << "Before swap Map2:\n"; + for(map::iterator it = map2.begin();it != map2.end();++it) { + cout << "Key: " << it->first<< ", Value: " << it->second << endl; + } + + // Swapping the contents of map1 and map2 + map1.swap(map2); + + cout << "After swap Map1:\n"; + for(map::iterator it = map1.begin();it != map1.end();++it) { + cout << "Key: " << it->first<< ", Value: " << it->second << endl; + } + + cout << "After swap Map2:\n"; + for(map::iterator it = map2.begin();it != map2.end();++it) { + cout << "Key: " << it->first<< ", Value: " << it->second << endl; + } + + return 0; +} +``` + +The output of the above code will be: + +```shell +Before swap Map1: +Key: 1, Value: one +Key: 2, Value: two +Key: 3, Value: three +Before swap Map2: +Key: 4, Value: four +Key: 5, Value: five +Key: 6, Value: six +After swap Map1: +Key: 4, Value: four +Key: 5, Value: five +Key: 6, Value: six +After swap Map2: +Key: 1, Value: one +Key: 2, Value: two +Key: 3, Value: three +``` + +## Codebyte Example + +Run the below codebyte example to know how the `.swap()` function works: + +```codebyte/cpp +#include +#include +using namespace std; + +int main() { + map map1{{"apple", 1}, {"banana", 2}, {"cherry", 3}}; + map map2{{"date", 4}, {"elderberry", 5}, {"fig", 6}}; + + cout << "Before swap Map1:\n"; + for(map::iterator it = map1.begin(); it != map1.end(); ++it) { + cout << "Key: " << it->first << ", Value: " << it->second << endl; + } + + cout << "Before swap Map2:\n"; + for(map::iterator it = map2.begin(); it != map2.end(); ++it) { + cout << "Key: " << it->first << ", Value: " << it->second << endl; + } + + // Swapping the contents of map1 and map2 + map1.swap(map2); + + cout << "After swap Map1:\n"; + for(map::iterator it = map1.begin(); it != map1.end(); ++it) { + cout << "Key: " << it->first << ", Value: " << it->second << endl; + } + + cout << "After swap Map2:\n"; + for(map::iterator it = map2.begin(); it != map2.end(); ++it) { + cout << "Key: " << it->first << ", Value: " << it->second << endl; + } + + return 0; +} +``` From 3a053125e23e72eb10a628a34606c8f6fbe1907a Mon Sep 17 00:00:00 2001 From: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> Date: Thu, 31 Oct 2024 16:20:35 +0530 Subject: [PATCH 064/108] [Concept Entry] C++ List List (#5504) * New file has been added. * Update user-input.md * Update user-input.md * File has been modified. * Update list.md * Update list.md * Update list.md * Update list.md * Update list.md * Update list.md * Update list.md * Update list.md minor fixes and formating --------- --- content/cpp/concepts/list/list.md | 102 ++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 content/cpp/concepts/list/list.md diff --git a/content/cpp/concepts/list/list.md b/content/cpp/concepts/list/list.md new file mode 100644 index 00000000000..9ec60a72256 --- /dev/null +++ b/content/cpp/concepts/list/list.md @@ -0,0 +1,102 @@ +--- +Title: 'List' +Description: 'List in C++ is a sequential container that stores elements in non-contiguous memory locations, allowing for efficient insertion and deletion at any position.' +Subjects: + - 'Game Development' + - 'Mobile Development' + - 'Machine Learning' +Tags: + - 'Data Structures' + - 'Doubly Linked Lists' + - 'Lists' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +**List** in C++ is a sequential container and part of the Standard Template Library (STL) that stores elements in non-contiguous memory locations. It is implemented as a doubly linked list, allowing efficient insertion and deletion of elements at any known position with average constant time complexity. + +## Syntax + +```pseudo +#include + +std::list name_of_list; +``` + +- `data-type`: Specifies the type of elements stored in the list, which can be any valid C++ type (e.g., `int`, `double`, or user-defined types). +- `name_of_list`: The variable name for the list instance, used to reference and manipulate the list within the code. + +## Example + +```cpp +#include + +#include + +int main() { + // Declare a list of integers + std::list myList; + + // Adding elements to the list + myList.push_back(10); + myList.push_back(20); + myList.push_front(5); + + // Displaying elements in the list + std::cout << "List elements: "; + for (const auto & value: myList) { + std::cout << value << " "; + } + std::cout << std::endl; + + // Removing an element + myList.remove(10); + + // Displaying the updated list + std::cout << "Updated list elements after deletion: "; + for (const auto & value: myList) { + std::cout << value << " "; + } + std::cout << std::endl; + return 0; +} +``` + +The output for the above code is: + +```shell +List elements: 5 10 20 +Updated list elements after deletion: 5 20 +``` + +## Codebyte Example + +Run the following codebyte example to understand how List works in C++: + +```codebyte/cpp +#include + +#include + +#include + +int main() { + // Create a list of strings + std::list fruits = { + "apple", + "banana", + "cherry" + }; + + // Add a fruit to the list + fruits.push_back("orange"); + + // Access elements in the list using an iterator + for (const auto & fruit: fruits) { + std::cout << fruit << std::endl; + } + + return 0; +} +``` From 9b87fe93d0a9de209800407cac813b4da49c6932 Mon Sep 17 00:00:00 2001 From: Manish Giri Date: Sat, 2 Nov 2024 04:01:10 -0500 Subject: [PATCH 065/108] [Term Entry] Kotlin Arrays: .forEach() * Adding new entry for Kotlin forEach() * Update forEach.md minor fixes * Minor changes --------- --- .../concepts/arrays/terms/forEach/forEach.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 content/kotlin/concepts/arrays/terms/forEach/forEach.md diff --git a/content/kotlin/concepts/arrays/terms/forEach/forEach.md b/content/kotlin/concepts/arrays/terms/forEach/forEach.md new file mode 100644 index 00000000000..d95f17ee97f --- /dev/null +++ b/content/kotlin/concepts/arrays/terms/forEach/forEach.md @@ -0,0 +1,56 @@ +--- +Title: '.forEach()' +Description: 'Iterates over elements in a collection and performs a specified action on each element, without producing a new collection.' +Subjects: + - 'Code Foundations' + - 'Mobile Development' +Tags: + - 'Android' + - 'Arrays' + - 'ForEach' + - 'Kotlin' +CatalogContent: + - 'learn-kotlin' + - 'paths/computer-science' +--- + +In Kotlin, the **`.forEach()`** method iterates over elements in a collection ([array](https://www.codecademy.com/resources/docs/kotlin/arrays), list, or [set](https://www.codecademy.com/resources/docs/kotlin/sets)) and performs the provided action on each element. It does not modify the original collection or return a new one, making it useful for operations with side effects like printing or logging. + +## Syntax + +```pseudo +fun Iterable.forEach(action: (T) -> Unit) +``` + +Or alternatively: + +```pseudo +fun Array.forEach(action: (T) -> Unit) +``` + +- `T`: The type of the elements in the collection (or array). +- `action`: A [function](https://www.codecademy.com/resources/docs/kotlin/functions) that takes an element of type `T` and performs an action on it. + +## Example + +The following example demonstrates the usage of the `.forEach()` method: + +```kotlin +fun main() { + // Initialize an array of numbers + val numbers = arrayOf(4, 12, 14, 17, 8) + + // Use .forEach() to print each element multiplied by 2 + numbers.forEach { println(it * 2) } +} +``` + +The above code generates the following output: + +```shell +8 +24 +28 +34 +16 +``` From 0ad11346f5b96f2e14f66f0fa24464e6339bc974 Mon Sep 17 00:00:00 2001 From: Manish Giri Date: Sat, 2 Nov 2024 05:37:50 -0500 Subject: [PATCH 066/108] [Edit] Python:NumPy Built-In Functions: .log() * Adding codebyte example in Numpy/log() * Update log.md minor fixes * Update log.md --------- --- .../built-in-functions/terms/log/log.md | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/content/numpy/concepts/built-in-functions/terms/log/log.md b/content/numpy/concepts/built-in-functions/terms/log/log.md index db91946a5a9..186587c3858 100644 --- a/content/numpy/concepts/built-in-functions/terms/log/log.md +++ b/content/numpy/concepts/built-in-functions/terms/log/log.md @@ -15,7 +15,7 @@ CatalogContent: - 'paths/data-science' --- -The `.log()` function returns an element-wise natural logarithm of an array. +The **`.log()`** function returns an element-wise natural logarithm of an array. ## Syntax @@ -47,3 +47,32 @@ This produces the following output: [[0. 0.99999933] [0.99999933 0. ]] ``` + +## Codebyte Example + +The following codebyte creates different arrays and demonstrates applying `np.log()` to each array, calculating the natural logarithm of all elements: + +```codebyte/python +import numpy as np + +# Create an array containing a single element +single_element_array = np.array([10]) +print("Single element array:") +print(single_element_array) +print("Log of single element array:") +print(np.log(single_element_array)) + +# Create an array containing multiple elements +multiple_elements_array = np.array([1, 10, 100]) +print("\nMultiple elements array:") +print(multiple_elements_array) +print("Log of multiple elements array:") +print(np.log(multiple_elements_array)) + +# Create an array having more than 1 dimension +higher_dimensional_array = np.array([[1, 2], [3, 4]]) +print("\nHigher-dimensional array:") +print(higher_dimensional_array) +print("Log of higher-dimensional array:") +print(np.log(higher_dimensional_array)) +``` From 77c490a44507512cb64d7c59100207e34519b0d2 Mon Sep 17 00:00:00 2001 From: clonymontana <96956906+clonymontana@users.noreply.github.com> Date: Sat, 2 Nov 2024 12:35:18 +0100 Subject: [PATCH 067/108] [Term Entry] PyTorch Tensor Operations: .hstack() * Create hstack.md * New entry PyTorch Tensors .hstack() * Update hstack.md fixed meta data table * modified PyTorch * Fix Markdown linting issues * Fix format:verify) * Minor changes --------- --- .../tensor-operations/terms/hstack/hstack.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/hstack/hstack.md diff --git a/content/pytorch/concepts/tensor-operations/terms/hstack/hstack.md b/content/pytorch/concepts/tensor-operations/terms/hstack/hstack.md new file mode 100644 index 00000000000..cda4ca55c37 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/hstack/hstack.md @@ -0,0 +1,53 @@ +--- +Title: '.hstack()' +Description: 'Concatenates two or more tensors along the horizontal axis (column-wise).' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/data-science' +--- + +In PyTorch, **`.hstack()`** (short for horizontal stack) is a function used to concatenate two or more [tensors](https://www.codecademy.com/resources/docs/pytorch/tensors) along the horizontal axis (`axis=1`). This operation is helpful in combining data with the same number of rows but differing in the number of columns. It acts similarly to **`np.hstack()`** in [NumPy](https://www.codecademy.com/resources/docs/numpy) and is particularly handy for data that needs to be concatenated side by side before being fed into a model for training or inference. + +## Syntax + +```pseudo +torch.hstack(tensors) -> Tensor +``` + +- `tensors`: A sequence of tensors with the same number of rows. All tensors must have the same number of dimensions and the same size in all dimensions except for the dimension corresponding to the horizontal stacking. + +The function returns a new tensor containing the horizontal concatenation of the input tensors. + +## Example + +Here's an example demonstrating how `.hstack()` can be used to concatenate tensors: + +```py +import torch + +# Create two tensors +a = torch.tensor([[1, 2],[3, 4]]) +b = torch.tensor([[5, 6],[7, 8]]) + +# Stack the tensors horizontally +c = torch.hstack((a, b)) + +print(c) +``` + +The above code produces the following output: + +```shell +tensor([[1, 2, 5, 6], + [3, 4, 7, 8]]) +``` + +This example demonstrates concatenating two 2x2 tensors horizontally resulting in 2x4 tensor. From ad61d6f9b07b96790e23feb8ce161952513b0e7f Mon Sep 17 00:00:00 2001 From: Lesego Tsheole Date: Sat, 2 Nov 2024 16:32:49 +0200 Subject: [PATCH 068/108] [Edit] C++: Functions * add recursion subheading to functions * Update functions.md minor changes * Update functions.md minor changes * Update functions.md --------- --- content/cpp/concepts/functions/functions.md | 31 ++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/content/cpp/concepts/functions/functions.md b/content/cpp/concepts/functions/functions.md index cd5bbe1f75d..465b7182e3f 100644 --- a/content/cpp/concepts/functions/functions.md +++ b/content/cpp/concepts/functions/functions.md @@ -1,6 +1,6 @@ --- Title: 'Functions' -Description: 'A function is a set of statements that are executed together when the function is called. Every function has a name, which is used to call the respective function. C++ has many built-in functions.' +Description: 'Functions are self-contained blocks of code designed to perform specific tasks, allowing for code reuse and modularity.' Subjects: - 'Computer Science' - 'Game Development' @@ -183,3 +183,32 @@ This will output: When add function is called with integer parameters: 20 When add function is called with string parameters: HelloWorld! ``` + +## Recursion + +Recursion is a technique that allows a function to call itself. In C++, the function that calls itself is called a recursive function: + +```cpp +#include +using namespace std; + +int sum(int m) { + if (m > 0) { + return m + sum(m - 1); // Recursive call + } else { + return 0; // Base case + } +} + +int main() { + int result = sum(5); + cout << result; + return 0; +} +``` + +This program will output the following result: + +```shell +15 +``` From 8a997668c45567ffcae92fa56ec97cec545f8abb Mon Sep 17 00:00:00 2001 From: codecademydev Date: Sun, 3 Nov 2024 13:06:31 +0000 Subject: [PATCH 069/108] =?UTF-8?q?=F0=9F=A4=96=20update=20concept=20of=20?= =?UTF-8?q?the=20week?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/concept-of-the-week.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/concept-of-the-week.txt b/bin/concept-of-the-week.txt index 42bb1a2ef3b..69740388002 100644 --- a/bin/concept-of-the-week.txt +++ b/bin/concept-of-the-week.txt @@ -1 +1 @@ -content/git/concepts/reset/reset.md \ No newline at end of file +content/sql/concepts/data-types/data-types.md \ No newline at end of file From 66abae2b94d898cab278a4caaa9e8ba3dcd04f33 Mon Sep 17 00:00:00 2001 From: Dani Tellini Date: Mon, 4 Nov 2024 09:20:01 -0300 Subject: [PATCH 070/108] C++ Term Entry Issue #5476 (#5538) --- .../unordered-map/terms/bucket/bucket.md | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 content/cpp/concepts/unordered-map/terms/bucket/bucket.md diff --git a/content/cpp/concepts/unordered-map/terms/bucket/bucket.md b/content/cpp/concepts/unordered-map/terms/bucket/bucket.md new file mode 100644 index 00000000000..2c5e46be02e --- /dev/null +++ b/content/cpp/concepts/unordered-map/terms/bucket/bucket.md @@ -0,0 +1,74 @@ +--- +Title: '.bucket()' +Description: 'Returns the bucket number where an element is located in a C++ unordered map.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Map' + - 'Objects' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +The **`.bucket()`** function is part of the C++ [`unordered_map`](https://www.codecademy.com/resources/docs/cpp/unordered-map) container. It returns the bucket number (zero-indexed) where a specified element is located within the unordered map. Each element in the unordered map is assigned to a bucket based on its hash value, and this function helps determine which bucket a given key belongs to. + +## Syntax + +```pseudo +size_type bucket(const key_type& k) const; +``` + +- `key`: The key whose bucket number needs to be found in the unordered map. + +The function returns a `size_type` value, representing the zero-indexed bucket number where the specified key is stored. + +## Example + +In this example, the `bucket()` function is used to find the bucket number for the key `"banana"` in the unordered map: + +```cpp +#include +#include + +int main() { + std::unordered_map umap; + umap["apple"] = 1; + umap["banana"] = 2; + umap["cherry"] = 3; + + std::string key = "banana"; + std::cout << "The bucket for key '" << key << "' is: " << umap.bucket(key) << std::endl; + + return 0; +} +``` + +The above code generates the following output: + +```shell +The bucket for key 'banana' is: 4 +``` + +## Codebyte Example + +In this Codebyte, we are using the `bucket()` function to find the bucket for the key `"cherry"` in the unordered map: + +```codebyte/cpp +#include +#include + +int main() { + std::unordered_map umap; + umap["apple"] = 1; + umap["banana"] = 2; + umap["cherry"] = 3; + + // Check which bucket contains the key 'cherry' + std::string key = "cherry"; + std::cout << "The bucket for key '" << key << "' is: " << umap.bucket(key) << std::endl; + + return 0; +} +``` From c21db676452767da1e998e38710f19ae045a8713 Mon Sep 17 00:00:00 2001 From: Beto-Garcia <136840763+Beto-Garcia@users.noreply.github.com> Date: Wed, 6 Nov 2024 00:34:02 -0600 Subject: [PATCH 071/108] [Concept Entry] PyTorch: Optimizers * Empty file creation * Concept Entry Update 1 * Concept Entry Update 2 * Update optimizers.md * Update optimizers.md * Update optimizers.md * Update optimizers.md * Update optimizers.md * Minor changes --------- --- .../pytorch/concepts/optimizers/optimizers.md | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 content/pytorch/concepts/optimizers/optimizers.md diff --git a/content/pytorch/concepts/optimizers/optimizers.md b/content/pytorch/concepts/optimizers/optimizers.md new file mode 100644 index 00000000000..5d30bd9ff3d --- /dev/null +++ b/content/pytorch/concepts/optimizers/optimizers.md @@ -0,0 +1,78 @@ +--- +Title: 'Optimizers' +Description: 'Help adjust the model parameters during training to minimize the error between the predicted output and the actual output.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'Deep Learning' + - 'Libraries' + - 'Python' + - 'TensorFlow' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/data-science' +--- + +In PyTorch, **optimizers** help adjust the model parameters during training to minimize the error between the predicted output and the actual output. They use the gradients calculated through backpropagation to update the model in a direction that reduces this error, improving the model's performance over time. + +## Syntax + +```pseudo +torch.optim.optimizer_type(model_parameters, learning_rate) +``` + +- `optimizer_type`: The type of optimizer that will be used. +- `model_parameter`: The parameter of the model that will adjust during training. +- `learning_rate`: The parameter that controls how the optimizer adjusts the model weight. + +## Example + +The following example demonstrates the usage of optimizers in PyTorch: + +```py +import torch +import torch.nn as nn +import torch.optim as optim + +# Input and target data (simple linear relationship y = 2x) +x = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) +y = torch.tensor([[2.0], [4.0], [6.0], [8.0]]) + +# Simple model: 1 linear layer +model = nn.Linear(1, 1) + +# Adam Optimizer and Mean Squared Error (MSE) Loss +optimizer = optim.Adam(model.parameters(), lr=0.01) +criterion = nn.MSELoss() + +# Training loop +for epoch in range(50): + predictions = model(x) + loss = criterion(predictions, y) + optimizer.zero_grad() + loss.backward() + optimizer.step() + + if (epoch+1) % 10 == 0: # Print loss every 10 epochs + print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') + +# Test the model by making a prediction for x = 5 +with torch.no_grad(): + test_input = torch.tensor([[5.0]]) + test_output = model(test_input) + print(f'The predicted value for input 5: {test_output.item():.4f}') +``` + +> **Note:** Optimizers also support specifying per-parameter options like learning rate allowing. + +The output of the above code is: + +```shell +Epoch 10, Loss: 9.0166 +Epoch 20, Loss: 7.0211 +Epoch 30, Loss: 5.3501 +Epoch 40, Loss: 3.9961 +Epoch 50, Loss: 2.9324 +The predicted value for input 5: 6.4472 +``` From d7c24ca48dc6e0fca9f734d32f557813a694fa44 Mon Sep 17 00:00:00 2001 From: arisdelacruz <115809819+arisdelacruz@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:40:58 +0800 Subject: [PATCH 072/108] [Edit] Python:NumPy Built-In Functions: .var() * Created cat.md entry * Created cat.md for PyTorch * Create codebyte for variance * Delete content/pytorch/concepts/tensors/terms/cat/cat.md * Update variance.md * Update variance.md * Minor changes --------- --- .../terms/variance/variance.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/content/numpy/concepts/built-in-functions/terms/variance/variance.md b/content/numpy/concepts/built-in-functions/terms/variance/variance.md index b3180104153..a7bcf26bb1b 100644 --- a/content/numpy/concepts/built-in-functions/terms/variance/variance.md +++ b/content/numpy/concepts/built-in-functions/terms/variance/variance.md @@ -58,3 +58,26 @@ This produces the following output: [6. 6. 6.] [0.66666667 0.66666667 0.66666667] ``` + +## Codebyte Example + +The following codebyte example demonstrates how to calculate the variance of a 2D array: + +```codebyte/python +import numpy as np + +# Creating a 2D array +arr = [[2, 2, 2, 2, 2], +[15, 6, 27, 8, 2], +[23, 2, 54, 1, 2, ], +[11, 44, 34, 7, 2]] + +# Calculating the variance of the flattened array +print("\nvar of arr, axis = None : ", np.var(arr)) + +# Calculating the variance along axis = 0 +print("\nvar of arr, axis = 0 : ", np.var(arr, axis = 0)) + +# Calculating the variance along axis = 1 +print("\nvar of arr, axis = 1 : ", np.var(arr, axis = 1)) +``` From 8bbf438a2e59a6fbfe473463461fa1e11eaf0ef1 Mon Sep 17 00:00:00 2001 From: Umma Gohil <35455937+ummagohil@users.noreply.github.com> Date: Wed, 6 Nov 2024 06:59:26 +0000 Subject: [PATCH 073/108] [Term Entry] PyTorch Tensors: .chunk() * Term entry: PyTorch .chunk() * small tweak * Update chunk.md * Update chunk.md * Update chunk.md * Update chunk.md * Update chunk.md * Minor changes --------- --- .../concepts/tensors/terms/chunk/chunk.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/chunk/chunk.md diff --git a/content/pytorch/concepts/tensors/terms/chunk/chunk.md b/content/pytorch/concepts/tensors/terms/chunk/chunk.md new file mode 100644 index 00000000000..e2af6e3f643 --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/chunk/chunk.md @@ -0,0 +1,58 @@ +--- +Title: '.chunk()' +Description: 'Splits a tensor with a specified dimension into chunks.' +Subjects: + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/data-science' +--- + +In PyTorch, the **`.chunk()`** function splits a tensor into a specific number of chunks. The function may return fewer than the specified number of chunks. To get the exact number of chunks, the **`.tensor_split()`** function can be used. + +## Syntax + +```pseudo +torch.chunk(input, chunks, dim) +``` + +- `input`: A required parameter that specifies the tensor that will be split into chunks. +- `chunks`: A required parameter that specifies the number of chunks that will be returned. +- `dim`: An optional parameter that specifies the dimension along which the split is performed. + +> **Note:** If the tensor size is divisible by the number of chunks, then all the chunks returned are of same size. Otherwise, one chunk will be of a different size. If neither is an option, the function may return fewer chunks than the number of chunks specified. + +## Example + +Here is an example of a one-dimensional tensor with 6 elements, which is split into 3 chunks: + +```py +import torch + +# Create a 1D tensor +x = torch.tensor([1, 2, 3, 4, 5, 6]) + +print("Original tensor:", x) + +# Split the tensor into 3 chunks +chunks = torch.chunk(x, chunks=3) + +# Print each chunk +for i, chunk in enumerate(chunks): + print(f"Chunk {i}:", chunk) +``` + +The output of this is shown below: + +```shell +Original tensor: tensor([1, 2, 3, 4, 5, 6]) +Chunk 0: tensor([1, 2]) +Chunk 1: tensor([3, 4]) +Chunk 2: tensor([5, 6]) +``` From f9075cb21e1bf144cd7749ff14c839d65176947b Mon Sep 17 00:00:00 2001 From: Geewiz <106394210+kellyCookCodes@users.noreply.github.com> Date: Wed, 6 Nov 2024 04:54:45 -0800 Subject: [PATCH 074/108] [Term Entry] CSS Position: fixed * This is a new commit to attempt to fix error message while pushing * Update content/css/concepts/position/terms/fixed/fixed.md Removed quotations and hover text from image link for fixed nav element in the browser window/viewport. Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/fixed/fixed.md Rewording for the comparison of fixed and static positions. line 104. Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/fixed/fixed.md Rewording of the note regarding overflow of content, borders, padding, and margin. Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/fixed/fixed.md Removed extra blank line. Co-authored-by: Mamta Wardhani * Update content/css/concepts/position/terms/fixed/fixed.md * Update fixed.md minor fixes * Update fixed.md * Update fixed.md * Minor changes --------- --- .../concepts/position/terms/fixed/fixed.md | 64 ++++++++++++++++++ media/position-fixed-example.png | Bin 0 -> 11943 bytes media/position-static-example.png | Bin 0 -> 14752 bytes 3 files changed, 64 insertions(+) create mode 100644 content/css/concepts/position/terms/fixed/fixed.md create mode 100644 media/position-fixed-example.png create mode 100644 media/position-static-example.png diff --git a/content/css/concepts/position/terms/fixed/fixed.md b/content/css/concepts/position/terms/fixed/fixed.md new file mode 100644 index 00000000000..2a363b0ddc7 --- /dev/null +++ b/content/css/concepts/position/terms/fixed/fixed.md @@ -0,0 +1,64 @@ +--- +Title: 'fixed' +Description: 'Positions an element relative to the viewport, removing it from the document flow and keeping it fixed during page scrolling.' +Subjects: + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Attributes' + - 'CSS' + - 'Design' + - 'Development' +CatalogContent: + - 'learn-css' + - 'paths/front-end-engineer-career-path' +--- + +In CSS, the **`fixed`** value of the `position` property positions an [HTML](https://www.codecademy.com/resources/docs/html) element of a webpage by taking that [element](https://www.codecademy.com/resources/docs/html/elements) out of the normal flow of the document and pinning it to a specified position. In this position, the element will remain fixed in place, even while scrolling the page. + +## Syntax + +```pseudo +position: fixed; +``` + +An element with a `fixed` position will be positioned relative to the viewport or the HTML element. In other words, it is fixed relative to the document itself. + +> **Note**: This differs from [absolute positioning](https://www.codecademy.com/resources/docs/css/position/absolute), where an element is positioned relative to its closest ancestor/parent element, whose position is also set to a value of [`relative`](https://www.codecademy.com/resources/docs/css/position/relative) or `absolute` (a non-static position). + +## Example + +This example demonstrates the fixed positioning. Here is the HTML code: + +```html + +``` + +Here is the CSS code: + +```css +nav.fixed { + display: inline-block; + height: 80px; + width: 100%; + position: fixed; + top: 50px; + left: 100px; + background-color: white; + border: 4px solid red; +} +``` + +In the code block above, the `nav` element with the [class](https://www.codecademy.com/resources/docs/html/classes) `fixed` has its `position` property set to `fixed`, along with its [`top`](https://www.codecademy.com/resources/docs/css/position/top) and [`left`](https://www.codecademy.com/resources/docs/css/position/left) properties set to values of `50px` and `100px`, respectively. + +This configuration means that the navigation bar will remain fixed in place relative to the viewport, appearing 50 pixels from the top and 100 pixels from the left of the browser window. As a result, when the user scrolls, the `nav` element will stay visible at that position. This will render in the browser as shown in the image: + +![Image of a fixed nav element in the browser window/viewport](https://raw.githubusercontent.com/Codecademy/docs/main/media/position-fixed-example.png) + +The `nav` element is taken out of the document flow and positioned `50px` from the top and `100px` from the left. Although the [`width`](https://www.codecademy.com/resources/docs/css/sizing/width) property is set to `100%`, its position may cause it to extend beyond the right side of the viewport, depending on the viewport width and the element's total width (including [padding](https://www.codecademy.com/resources/docs/css/padding) and [borders](https://www.codecademy.com/resources/docs/css/borders)). + +If the `nav` element had the `position` property set to [`static`](https://www.codecademy.com/resources/docs/css/position/static) (the default value), it would remain in its default position, i.e., flush against the top-left corner of the viewport: + +![Image of a static nav element in the browser window/viewport](https://raw.githubusercontent.com/Codecademy/docs/main/media/position-static-example.png) diff --git a/media/position-fixed-example.png b/media/position-fixed-example.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0c734ec1beecec6aa2e9f55b85b9d0885e833b GIT binary patch literal 11943 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 literal 0 HcmV?d00001 diff --git a/media/position-static-example.png b/media/position-static-example.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5c27633cae5d7d3c2a0144419799b5f3bad083 GIT binary patch literal 14752 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 i!T;e!z26;?<%?zy1rv!B Date: Wed, 6 Nov 2024 21:09:23 +0800 Subject: [PATCH 075/108] [Term Entry] PyTorch Tensor Operations: .hsplit() * Creation of hsplit entry for pytorch * Update hsplit.md minor fixes * Update hsplit.md minor changes * Minor changes --------- --- .../tensor-operations/terms/hsplit/hsplit.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/hsplit/hsplit.md diff --git a/content/pytorch/concepts/tensor-operations/terms/hsplit/hsplit.md b/content/pytorch/concepts/tensor-operations/terms/hsplit/hsplit.md new file mode 100644 index 00000000000..36dccb45c91 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/hsplit/hsplit.md @@ -0,0 +1,58 @@ +--- +Title: '.hsplit()' +Description: 'Splits a tensor horizontally into multiple sub-tensors.' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Arrays' + - 'Data Structures' + - 'Deep Learning' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +In PyTorch, the **`.hsplit()`** method splits a [tensor](https://www.codecademy.com/resources/docs/pytorch/tensors) into multiple sub-tensors horizontally (column-wise) along the specified dimension (axis). + +## Syntax + +```pseudo +torch.hsplit(tensor, indices_or_sections) +``` + +- `tensor`: The tensor to be split. +- `indices_or_sections`: This can be an integer or a list of integers. + - If it's an integer, it specifies the number of equal-sized sub-tensors to split the tensor into. + - If it's a list of integers, it specifies the sizes of each sub-tensor along the specified dimension. + +## Example + +The following example demonstrates the usage of the `.hsplit()` method: + +```py +import torch + +# Define a tensor +tensor = torch.tensor([[1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12]]) + +# Split the tensor into 2 equal parts +sub_tensors = torch.hsplit(tensor, 2) + +print(sub_tensors) +``` + +The above code produces the following output: + +```shell +(tensor([[ 1, 2], + [ 5, 6], + [ 9, 10]]), tensor([[ 3, 4], + [ 7, 8], + [11, 12]])) +``` + +The tensor is split into two sub-tensors along the columns. The first sub-tensor contains the first two columns of the original tensor, while the second sub-tensor contains the last two columns. From 5bf355378dd5d6ffd02f5ebdfd176584d8a20bde Mon Sep 17 00:00:00 2001 From: ChinoUkaegbu <77782533+ChinoUkaegbu@users.noreply.github.com> Date: Thu, 7 Nov 2024 09:52:58 +0100 Subject: [PATCH 076/108] edit: Add example to csharp asin.md (#5591) * add example to csharp asin.md * Update asin.md fixed fomatting * Update asin.md minor fixes --------- --- .../math-functions/terms/asin/asin.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/content/c-sharp/concepts/math-functions/terms/asin/asin.md b/content/c-sharp/concepts/math-functions/terms/asin/asin.md index dec37ba8491..6d9159ee4f7 100644 --- a/content/c-sharp/concepts/math-functions/terms/asin/asin.md +++ b/content/c-sharp/concepts/math-functions/terms/asin/asin.md @@ -24,6 +24,36 @@ Math.Asin(value); Returns an angle measured in radians, of type `double`, whose sine is `value`. If an invalid value is passed to the function, or no value is passed at all, `NaN` is returned. +## Example + +The following example prints the results of the `Math.Asin()` method for three different values: + +```cs +using System; + +public class Example +{ + static void Main() + { + double a = Math.Asin(0.5); + double b = Math.Asin(1); + double c = Math.Asin(-2); + + Console.WriteLine(a); + Console.WriteLine(b); + Console.WriteLine(c); + } +} +``` + +This results in the following output: + +```shell +0.523598775598299 +1.5707963267949 +NaN +``` + ## Codebyte Example ```codebyte/csharp From c2a391648d70682c82e7cdab87202c605a065f03 Mon Sep 17 00:00:00 2001 From: Austin W <54342928+austinwdigital@users.noreply.github.com> Date: Thu, 7 Nov 2024 08:53:00 -0500 Subject: [PATCH 077/108] Kotlin arrayOfNulls() term entry : Issue #5310 (#5593) * Added documentation for Kotlin arrayOfNulls() including a description, syntax and example. Resolves issue [Term Entry] Kotlin Arrays .arrayOfNulls() #5310 * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md * Update arrayOfNulls.md Just made a minor change by removing the extra output block * Update arrayOfNulls.md minor fixes --------- --- .../arrays/terms/arrayOfNulls/arrayOfNulls.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md diff --git a/content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md b/content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md new file mode 100644 index 00000000000..01b6fe4f34b --- /dev/null +++ b/content/kotlin/concepts/arrays/terms/arrayOfNulls/arrayOfNulls.md @@ -0,0 +1,52 @@ +--- +Title: 'arrayOfNulls()' +Description: 'Creates an array of a specified size with all elements initialized as null.' +Subjects: + - 'Code Foundations' + - 'Mobile Development' +Tags: + - 'Android' + - 'Arrays' + - 'Map' + - 'Kotlin' +CatalogContent: + - 'learn-kotlin' + - 'paths/computer-science' +--- + +In Kotlin, the **`arrayOfNulls()`** function creates an array of a specified size with all elements initialized to `null`. This function is useful for creating an array with a defined size when initial values are not yet available, allowing for values to be assigned later. + +## Syntax + +```pseudo +fun arrayOfNulls(size: Int): Array +``` + +- `T`: The type of elements in the array. +- `size`: An integer specifying the size of the array to create. + +It returns an `Array` of the specified size, initialized with `null`. + +## Example + +The following example uses the `arrayOfNulls()` function: + +```kotlin +fun main() { + // Create an array of size 5 with all elements initialized as null + val nullArray = arrayOfNulls(5) + + // Assign values to some elements in the array + nullArray[0] = 2 + nullArray[1] = 4 + + // Print the array after assigning values + println(nullArray.contentToString()) +} +``` + +This example results in the following output: + +```shell +[2, 4, null, null, null] +``` From 2025b49f99768d078083c61a091e36dfbc7fc171 Mon Sep 17 00:00:00 2001 From: ebikatsudon <99709771+ebikatsudon@users.noreply.github.com> Date: Thu, 7 Nov 2024 21:09:23 -0800 Subject: [PATCH 078/108] C++ Count function map (#5543) * added count function entry * minor edits * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * Update content/cpp/concepts/maps/terms/count/count.md Co-authored-by: Mamta Wardhani * added example output * minor wording change * Update count.md minor fixes * Formating done --------- --- .../cpp/concepts/maps/terms/count/count.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 content/cpp/concepts/maps/terms/count/count.md diff --git a/content/cpp/concepts/maps/terms/count/count.md b/content/cpp/concepts/maps/terms/count/count.md new file mode 100644 index 00000000000..394d2e1d3bc --- /dev/null +++ b/content/cpp/concepts/maps/terms/count/count.md @@ -0,0 +1,98 @@ +--- +Title: '.count()' +Description: 'Checks whether a specified key exists in the map and returns the number of occurrences' +Subjects: + - 'Computer Science' + - 'Game Development' + - 'Machine Learning' +Tags: + - 'Objects' + - 'OOP' + - 'Classes' + - 'Map' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +The **`.count()`** method in C++ for `std::map` is used to determine the presence of a specific key in the map. Since all keys in a map are unique, the function returns: + +- _1_ if the key exists in the container. +- _0_ if the key does not exist. + +## Syntax + +```pseudo +mapName.count(key) +``` + +- `mapName`: Refers to the specific map being accessed. +- `key`: Represents the value that will be searched for in `mapName`. + +## Example + +In the following example, the `.count()` method is used to check whether the keys `"coconuts"` and `"strawberries"` exist in the `fruits` map: + +```cpp +#include +#include +#include + +int main() { + // Initializing map with items + std::map fruits {{"apples", 50}, {"bananas", 100}, {"coconuts", 20}, {"dates", 500}}; + + // Checking if "coconuts" exists + std::string key = "coconuts"; + + if (fruits.count(key) > 0) { + std::cout << "There are " << fruits[key] << " " << key << ".\n"; // If key exists, print the count + } else { + std::cout << "There are no " << key << ".\n"; // If key does not exist, print a message + } + + // Checking if "strawberries" exists + key = "strawberries"; + + if (fruits.count(key) > 0) { + std::cout << "There are " << fruits[key] << " " << key << ".\n"; // If key exists, print the count + } else { + std::cout << "There are no " << key << ".\n"; // If key does not exist, print a message + } + + return 0; +} +``` + +The above code produces the following output: + +```shell +There are 20 coconuts. +There are no strawberries. +``` + +## Codebyte Example + +The example below illustrates a scenario in which the `.count()` method is used to check whether an array of elements exists in a map: + +```codebyte/cpp +#include +#include +#include + +int main() { + std::map zoo_animals {{"hippos", 2}, {"lions", 4}, {"zebras", 6}, {"gorillas", 8}}; + + std::string animals_to_check[] = {"bats", "giraffes", "gorillas", "hippos", "zebras"}; + + for (const auto& animals : animals_to_check) { + if (zoo_animals.count(animals) > 0) { + std::cout << "The zoo has " << zoo_animals[animals] << " " << animals << ".\n"; + } else { + std::cout << "The zoo does not have " << animals << ".\n"; + } + } + + return 0; +} +``` From 499b1bfb42597ce46089f932ccdcd485c0f56e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=88=98=EB=AF=BC?= <162391624+LilyS222@users.noreply.github.com> Date: Fri, 8 Nov 2024 16:28:55 +0900 Subject: [PATCH 079/108] [Term Entry] C# Strings .Remove() (#5587) * New Term Entry for C# Remove() method * Fixed verify_formatting failure * Update remove.md minor fixes * Update yarn.lock * Update remove.md minor fix * Update content/c-sharp/concepts/strings/terms/remove/remove.md * Update content/c-sharp/concepts/strings/terms/remove/remove.md * Update content/c-sharp/concepts/strings/terms/remove/remove.md --------- --- .../concepts/strings/terms/remove/remove.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 content/c-sharp/concepts/strings/terms/remove/remove.md diff --git a/content/c-sharp/concepts/strings/terms/remove/remove.md b/content/c-sharp/concepts/strings/terms/remove/remove.md new file mode 100644 index 00000000000..5adec1b5844 --- /dev/null +++ b/content/c-sharp/concepts/strings/terms/remove/remove.md @@ -0,0 +1,87 @@ +--- +Title: '.Remove()' +Description: 'Removes a specified number of characters from a string starting at a defined index and returns the modified string.' +Subjects: + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Elements' + - 'Methods' + - 'Strings' +CatalogContent: + - 'learn-c-sharp' + - 'paths/computer-science' +--- + +In C#, the **`.Remove()`** method removes characters from a specific position in a string, starting at a given index. The original string remains unchanged, and the modified string is returned. + +## Syntax + +```pseudo +// Removes characters from startIndex to the end of the string. +string.Remove(int startIndex); +``` + +Or, alternatively: + +```pseudo +// Removes a specified number of characters starting at startIndex. +string.Remove(int startIndex, int count); +``` + +- `startIndex`: The zero-based position in the string where removal begins. +- `count` (Optional): The number of characters to remove from the specified `startIndex`. + +## Example + +The following example shows how to use the `.Remove()` method: + +```cs +using System; + +public class RemoveExample +{ + public static void Main() + { + string baseStr = "ABCDEFGHIJ"; + + string newStr1 = baseStr.Remove(5); + string newStr2 = baseStr.Remove(2, 5); + + Console.WriteLine("New string1: " + newStr1); + Console.WriteLine("New string2: " + newStr2); + + } +} +``` + +This example results in the following output: + +```shell +New string1: ABCDE +New string2: ABHIJ +``` + +## Codebyte Example + +Run the following codebyte example to understand how the `.Remove()` method works: + +```codebyte/csharp +using System; + +class RemoveMethod { + + public static void Main(string[] args) + { + string baseStr1 = "Codecademy helps you grow"; + string baseStr2 = "Improve skills with Codecademy"; + + string removedStr1 = baseStr1.Remove(10); + Console.WriteLine("Removed string1: " + removedStr1); + + string removedStr2 = baseStr2.Remove(8, 7); + Console.WriteLine("Removed string2: " + removedStr2); + + } +} +``` From 4dfb1acd9e4c7f5bd061440ffb9e09d90f41c8f6 Mon Sep 17 00:00:00 2001 From: Abere Fejiro Date: Fri, 8 Nov 2024 14:19:34 +0100 Subject: [PATCH 080/108] [Term Entry] C++ Deque: .empty() * [Term Entry] C++ Deque Empty() * Update empty.md minor fixes * Update empty.md * Minor changes --------- --- .../cpp/concepts/deque/terms/empty/empty.md | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 content/cpp/concepts/deque/terms/empty/empty.md diff --git a/content/cpp/concepts/deque/terms/empty/empty.md b/content/cpp/concepts/deque/terms/empty/empty.md new file mode 100644 index 00000000000..de8df0e573b --- /dev/null +++ b/content/cpp/concepts/deque/terms/empty/empty.md @@ -0,0 +1,94 @@ +--- +Title: '.empty()' +Description: 'Checks if a given deque container is empty.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Classes' + - 'Containers' + - 'Deques' + - 'OOP' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, the **`.empty()`** [method](https://www.codecademy.com/resources/docs/cpp/methods) checks if a given deque container is empty (i.e., if its size is 0). The method returns `true` if it is empty and `false` otherwise. + +## Syntax + +```pseudo +dequeName.empty(); +``` + +- `dequeName`: The [variable](https://www.codecademy.com/resources/docs/cpp/variables) name of the deque being checked for emptiness. + +## Example + +The example below showcases the use of the `.empty()` method: + +```cpp +#include +#include + +int main() { + // Create a deque of integers + std::deque numbers; + + // Add elements to the deque + numbers.push_back(100); + numbers.push_back(150); + + std::cout << "Deque is empty: "; + if (numbers.empty()) { + std::cout << "True"; + } + else { + std::cout << "False"; + } + + std::cout << std::endl; + + return 0; +} +``` + +The above code generates the following output: + +```shell +Deque is empty: False +``` + +## Codebyte Example + +The following codebyte uses the **`.clear()`** method on a deque and checks its emptiness by outputting a boolean value using the `.empty()` method: + +```codebyte/cpp +#include +#include +#include + +int main() { + std::deque myDeque; + + myDeque.push_back("Car"); + myDeque.push_back("Bus"); + myDeque.push_back("Train"); + + // Display vehicles before clearing the deque + std::cout << "Vehicles before clearing:"; + for (const auto& value : myDeque) { + std::cout << ' ' << value; + } + std::cout << std::endl; + + // Clear all elements from the deque + myDeque.clear(); + + // Boolean output indicating if the deque is empty after clearing + std::cout << "Deque is empty after clearing: " << std::boolalpha << myDeque.empty() << std::endl; + + return 0; +} +``` From 5fd6cfb33bb856e3660e38ce274d21c1054d1507 Mon Sep 17 00:00:00 2001 From: Abere Fejiro Date: Fri, 8 Nov 2024 14:28:50 +0100 Subject: [PATCH 081/108] [Term Entry] C++ Deque: .clear() * New Term Entry for C++ Deque Clear() method * Update clear.md minor fixes * Minor changes --------- --- .../cpp/concepts/deque/terms/clear/clear.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 content/cpp/concepts/deque/terms/clear/clear.md diff --git a/content/cpp/concepts/deque/terms/clear/clear.md b/content/cpp/concepts/deque/terms/clear/clear.md new file mode 100644 index 00000000000..4e1a91cfbb4 --- /dev/null +++ b/content/cpp/concepts/deque/terms/clear/clear.md @@ -0,0 +1,99 @@ +--- +Title: '.clear()' +Description: 'Removes all elements from a given deque.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Classes' + - 'Containers' + - 'Deques' + - 'OOP' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, the **`.clear()`** [method](https://www.codecademy.com/resources/docs/cpp/methods) removes all elements from a given deque container, leaving the container with a size of 0. + +## Syntax + +```pseudo +dequeName.clear(); +``` + +- `dequeName`: The name of the deque container from which all elements will be removed. + +## Example + +The example below showcases the use of the `.clear()` method: + +```cpp +#include +#include + +int main() { + // Create a deque of integers + std::deque numbers; + + // Add elements to the deque + numbers.push_back(50); + numbers.push_back(100); + numbers.push_back(150); + numbers.push_back(200); + + // Display the elements of the deque before clearing + std::cout << "My deque contains: "; + for (int num : numbers) { + std::cout << num << " "; + } + + // Clear all elements from the deque + numbers.clear(); + std::cout << std::endl; + + numbers.push_back(200); + + // Display the elements of the deque after clearing and adding a new element + std::cout << "My deque contains: "; + for (int num : numbers) { + std::cout << num << " "; + } + + std::cout << std::endl; + + return 0; +} +``` + +The above code generates the following output: + +```shell +My deque contains: 50 100 150 200 +My deque contains: 200 +``` + +## Codebyte Example + +The following codebyte demonstrates the use of the `.clear()` method, which removes all elements from the deque before adding a new element: + +```codebyte/cpp +#include +#include +#include + +int main() { + std::deque myDeque; + + myDeque.push_back("A"); + myDeque.push_back("B"); + myDeque.push_back("C"); + + myDeque.clear(); + myDeque.push_back("D"); + + for (const auto& value : myDeque) { + std::cout << ' ' << value; + } +} +``` From 97896b7deaf90abd92a1f4eea9dcde2a5b0abb86 Mon Sep 17 00:00:00 2001 From: Rashmit <163204184+RashmitTopG@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:58:48 +0530 Subject: [PATCH 082/108] Added count for Cpp (#5525) * Added count for Cpp * Made necessary changes * few changes * Update count.md minor fixes * Update content/cpp/concepts/unordered-map/terms/count/count.md * Update content/cpp/concepts/unordered-map/terms/count/count.md * Update count.md corrected formating issue * Update count.md * Update count.md fixed formating issue --------- --- .../unordered-map/terms/count/count.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 content/cpp/concepts/unordered-map/terms/count/count.md diff --git a/content/cpp/concepts/unordered-map/terms/count/count.md b/content/cpp/concepts/unordered-map/terms/count/count.md new file mode 100644 index 00000000000..9f258a3e38c --- /dev/null +++ b/content/cpp/concepts/unordered-map/terms/count/count.md @@ -0,0 +1,98 @@ +--- +Title: '.count()' +Description: 'Returns the number of elements with the specified key.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Classes' + - 'Objects' + - 'OOP' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +The **`.count()`** method checks if a key exists in an [unordered map](https://www.codecademy.com/resources/docs/cpp/unordered-map). It returns _1_ if the key exists and _0_ if it does not. + +## Syntax + +```pseudo +mapName.count(key); +``` + +- `mapName`: The name of the unordered map. +- `key`: The key to check for existence in the map. + +## Example + +The following example demonstrates the use of the `.count()` method with an unordered map to check for mammals and display their lifespans: + +```cpp +#include +#include + +int main() { + // Initializing unordered_map + std::unordered_map lifeSpan = { + {"Giraffe", 26}, + {"Goat", 15}, + {"Lion", 10}, + {"Tiger", 8} + }; + + // Checking the existence of elements using .count() + std::string mammals[] = {"Giraffe", "Elephant", "Lion", "Zebra"}; + + for (const auto& mammal : mammals) { + if (lifeSpan.count(mammal) > 0) { + std::cout << mammal << " exists in the map with an average lifespan of " << lifeSpan[mammal] << " years.\n"; + } else { + std::cout << mammal << " does not exist in the map.\n"; + } + } + + return 0; +} +``` + +This example results in the following output: + +```shell +Giraffe exists in the map with an average lifespan of 26 years. +Elephant does not exist in the map. +Lion exists in the map with an average lifespan of 10 years. +Zebra does not exist in the map. +``` + +## Codebyte Example + +The following codebyte example demonstrates the use of the `.count()` method with an unordered map to check for the presence of various fruits and their prices: + +```codebyte/cpp +#include +#include + +int main() { + // Initializing unordered_map with fruits and their prices + std::unordered_map fruitPrices = { + {"Apple", 0.99}, + {"Banana", 0.59}, + {"Cherry", 2.99}, + {"Date", 3.49} + }; + + // Checking the existence of fruits using .count() + std::string fruits[] = {"Apple", "Mango", "Cherry", "Pineapple"}; + + for (const auto& fruit : fruits) { + if (fruitPrices.count(fruit) > 0) { + std::cout << fruit << " is available at $" << fruitPrices[fruit] << " each.\n"; + } else { + std::cout << fruit << " is not available.\n"; + } + } + + return 0; +} +``` From a914d064579dae12ac5501289958d2ab7a011bcc Mon Sep 17 00:00:00 2001 From: Brahim Anjjar <61018662+braanj@users.noreply.github.com> Date: Fri, 8 Nov 2024 18:06:23 +0100 Subject: [PATCH 083/108] Edit csharp variables entry (#5442) * Update the c# variables concept entry * Revert "Update the c# variables concept entry" This reverts commit 42f045e45d48c059cf0d7e858f01ba5dad78f653. * Update the c# variables concept entry Add new description Add some commonly used types definitions and examples * Fix style format of table in the entry * Update the entry * Update variables.md minor changes * Update content/c-sharp/concepts/variables/variables.md * Update variables.md fixed formating issue * Update variables.md --------- --- .../c-sharp/concepts/variables/variables.md | 158 +++++++++++++++--- 1 file changed, 138 insertions(+), 20 deletions(-) diff --git a/content/c-sharp/concepts/variables/variables.md b/content/c-sharp/concepts/variables/variables.md index b57be167ce9..219219b3352 100644 --- a/content/c-sharp/concepts/variables/variables.md +++ b/content/c-sharp/concepts/variables/variables.md @@ -1,9 +1,9 @@ --- Title: 'Variables' -Description: 'A variable refers to a storage location in the computer’s memory that one can set aside to save, retrieve, and manipulate data.' +Description: 'Variables are used to store and manipulate data. In C#, each variable has a type that determines the values it can store.' Subjects: - - 'Computer Science' - 'Code Foundations' + - 'Computer Science' Tags: - 'Variables' - 'Data Types' @@ -12,44 +12,162 @@ CatalogContent: - 'paths/computer-science' --- -A **variable** is a storage location in the computer’s memory that is used to save, retrieve, and manipulate data. +**Variables** are used to store and manipulate data. In C#, each variable has a type that determines the values it can store. -## Syntax +## Types of variables + +In C#, there are five distinct types of variables: -Minimally, a variable is declared by specifying a data type and a name: +| Name | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- | +| Local variables | Variables declared within a method, constructor, or code block, accessible only within that scope. | +| Instance variables | Non-static fields in a class, storing data unique to each instance of the class. | +| Static Variables | Variables shared across all instances of a class, belonging to the class itself. | +| Constant Variables | Immutable values initialized at the time of declaration, typically declared with const and behaving similarly to static members. | +| Readonly Variables | Values that can be assigned during declaration or in a constructor but cannot be modified afterward. | + +## Syntax ```pseudo -type name; +type name = value; ``` -In this case, the variable will be initialized with the default value for its type: zero for numeric types, and `null` for reference types. +- `type`: The data type of a variable, defining the kind of data it can hold. +- `name`: The identifier for the variable, used to reference it in the code. +- `value`: An optional initial value for the variable. If omitted, it must be assigned a value before use. -A variable can also be initialized with a value when it is declared: +## Examples -```pseudo -type name = value; +### Local variables + +In this example, `localVariable` can only be used within the `MyMethod()` function: + +```cs +void MyMethod() +{ + int localVariable = 10; // This variable is only accessible inside MyMethod +} +``` + +### Instance variables + +The example demonstrates an instance variable (`name`) within a class (`Person`). Each instance of `Person` will have its own copy of `name`: + +```cs +class Person +{ + public string name; // Instance variable + + public Person(string personName) + { + name = personName; // Initialize instance variable + } +} ``` -In this case, the variable `name` will be set to the value `value`. +### Static Variables -> **Note:** `value` must be of type `type` or be able to be implicitly converted to `type`. +Here, `wheels` is a static variable, meaning it belongs to the `Car` class and is shared by all instances. Note that static variables can be modified unless marked as `const`: -## Example +```cs +class Car { + public static int wheels = 4; // Static variable +} +``` + +### Constant Variables + +In this example, `Pi` is a constant variable, meaning its value cannot be changed after declaration and is shared across all instances: ```cs +class Circle +{ + public const double Pi = 3.14159; // Constant variable + + public double CalculateArea(double radius) + { + return Pi * radius * radius; // Using the constant variable + } +} +``` + +### Readonly Variables + +In this example, `length` and `width` are readonly variables assigned in the `Rectangle` constructor. Their values cannot be changed after the instance is created: + +```cs +class Rectangle +{ + public readonly double length; // Readonly variable + public readonly double width; // Readonly variable + + public Rectangle(double l, double w) + { + length = l; // Assigning value in the constructor + width = w; // Assigning value in the constructor + } +} +``` + +## Codebyte Example + +Here’s an example showcasing the use of various types of variables: + +```codebyte/csharp using System; -public class Example +class Car { - public static void Main(string[] args) + // Instance variable + public string model; + + // Static variable + public static int wheels = 4; // Shared across all instances + + // Constant variable + public const string fuelType = "Gasoline"; // Cannot be changed + + // Readonly variable + public readonly string vin; // Must be assigned in constructor + + // Constructor to initialize instance and readonly variables + public Car(string model, string vin) { - int x = 1; - int y = x + 5; - long z = y; + this.model = model; + this.vin = vin; // Assigning the readonly variable + } + + public void DisplayInfo() + { + // Local variable + string message = $"Car Model: {model}, VIN: {vin}, Wheels: {wheels}, Fuel Type: {fuelType}"; + + // Displaying the message + Console.WriteLine(message); + } +} + +class Factory +{ + static void Main() + { + // Creating instances of Car + Car car1 = new Car("Toyota Camry", "1HGCM82633A123456"); + Car car2 = new Car("Honda Accord", "1HGCM82633A654321"); + + // Displaying info for each car + car1.DisplayInfo(); + car2.DisplayInfo(); + + // Modifying static variable + Car.wheels = 5; // All instances will see this change - Console.WriteLine("The int {0} can be implicitly converted to the long {1}.", y, z); + // Displaying info again to see the updated static variable + car1.DisplayInfo(); + car2.DisplayInfo(); - // Output: "The int 6 can be implicitly converted to the long 6." + // Trying to modify readonly variable (will cause compile-time error) + // car1.vin = "1HGCM82633A111111"; // Uncommenting this line will cause an error } } ``` From 027869eaa93562f460ee6070771debd2111cad1a Mon Sep 17 00:00:00 2001 From: Radhika-okhade Date: Sat, 9 Nov 2024 12:34:53 +0530 Subject: [PATCH 084/108] [Term Entry]Py torch tensor operations .gather() (#5605) * Create loss-functions.md * Delete content/pytorch/concepts/nn/terms/loss-functions/loss-functions.md Deleted test file * Create gather.md --------- --- .../tensor-operations/terms/gather/gather.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/gather/gather.md diff --git a/content/pytorch/concepts/tensor-operations/terms/gather/gather.md b/content/pytorch/concepts/tensor-operations/terms/gather/gather.md new file mode 100644 index 00000000000..2278d2db1e1 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/gather/gather.md @@ -0,0 +1,57 @@ +--- +Title: '.gather()' +Description: 'Retrieves specific elements from a tensor along a defined axis based on indices.' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/data-science' +--- + +The **`.gather()`** function in PyTorch is a tensor operation that retrieves specific elements from a tensor along a specified axis. It is beneficial for selecting values based on a set of indices, making it ideal for applications in machine learning and data processing, where efficient data selection is critical. + +## Syntax + +```pseudo +torch.gather(input, dim, index) +``` + +- `input`: The source tensor from which values are gathered. +- `dim`: The dimension along which to gather values. This is the axis in the `input` tensor where the selection occurs. +- `index`: A tensor of indices specifying which values to gather from the `input` tensor along the specified `dim`. + +The function returns a tensor with the same shape as the `index`, where each value is gathered from the `input` tensor based on the specified indices. + +## Example + +Here's an example of how `.gather()` can be used to select elements from a tensor based on specified indices: + +```py +import torch + +# Define a source tensor +input_tensor = torch.tensor([[1, 2], [3, 4]]) + +# Define the indices to gather +index_tensor = torch.tensor([[0, 1], [1, 0]]) + +# Gather elements from the source tensor along dimension 1 +output_tensor = torch.gather(input_tensor, 1, index_tensor) + +print(output_tensor) +``` + +This example results in the following output: + +```shell +tensor([[1, 2], + [4, 3]]) +``` + +In this example, `.gather()` retrieves elements from `input_tensor` based on `index_tensor` along dimension `1`. The result is a new tensor where values are selected from the original tensor according to the provided indices. From f69a3d78aa8241716a2b69f2ce81cce907f95798 Mon Sep 17 00:00:00 2001 From: Radhika-okhade Date: Sat, 9 Nov 2024 12:56:48 +0530 Subject: [PATCH 085/108] [Term Entry]Py torch tensors .view() (#5607) * Create loss-functions.md * Delete content/pytorch/concepts/nn/terms/loss-functions/loss-functions.md Deleted test file * Create view.md * Update view.md minor fixes * Update view.md fixed formatting --------- --- .../concepts/tensors/terms/view/view.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 content/pytorch/concepts/tensors/terms/view/view.md diff --git a/content/pytorch/concepts/tensors/terms/view/view.md b/content/pytorch/concepts/tensors/terms/view/view.md new file mode 100644 index 00000000000..b92d19c5447 --- /dev/null +++ b/content/pytorch/concepts/tensors/terms/view/view.md @@ -0,0 +1,53 @@ +--- +Title: '.view()' +Description: 'Reshapes a tensor to a specified shape without changing its data, as long as the total number of elements remains the same.' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Data Types' + - 'Deep Learning' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/data-science' +--- + +The **`.view()`** method in PyTorch reshapes a tensor without altering its underlying data, provided the total number of elements remains the same. This method is useful when preparing tensors for operations requiring specific dimensions, such as neural network inputs. + +## Syntax + +```pseudo +tensor.view(shape) +``` + +- `shape`: A tuple or list defining the desired dimensions. The total number of elements must match the original tensor. + +The function returns a tensor with the specified shape, sharing the same data as the original tensor. + +## Example + +This example reshapes a tensor from a shape of _(2, 3)_ to _(3, 2)_ using `.view()`: + +```py +import torch + +# Create a tensor of shape (2, 3) +original_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]]) + +# Reshape the tensor to (3, 2) +reshaped_tensor = original_tensor.view(3, 2) + +print(reshaped_tensor) +``` + +This example results in the following output: + +```shell +tensor([[1, 2], + [3, 4], + [5, 6]]) +``` + +In this example, `.view()` modifies the shape of `original_tensor` while preserving its data. From e1bf04799643786d1a9fd0b5a324691be9812180 Mon Sep 17 00:00:00 2001 From: Brodes4JC <92485033+Brodes4JC@users.noreply.github.com> Date: Fri, 8 Nov 2024 23:39:44 -0800 Subject: [PATCH 086/108] [Term Entry] C++ Maps: .empty() * Created new markdown file for the term entry on the cpp member function '.empty()' * moved empty.md into the correct file location as specified by issue #5354 * Modified the tags.md file to include a suggestion for a tag: namely, C++. If desired, could be changed to cpp. * Finished first complete draft of the empty.md file. * Made edits to the empty.md file. * Edited empty.md to delete whitespace detected by yarn:lint test * Updated proposed change to tags.md Updated proposed change to tags.md, for the new proposed tag to be Cpp not C++ * Update empty.md to include new proposed tag Update empty.md to include a new proposed Cpp tag instead of a new proposed C++ tag * Update tags.md for new proposed Cpp tag Update tags.md for the new proposed Cpp tag to be contained in the tag list in alphabetical order * Update empty.md minor fixes * Update tags.md * Update empty.md Deleted the 'Cpp' tag in the 'Tags' metadata section, since it was not approved to be in the tags.md file as a new tag. * Attempted to update the lockfile by running 'yarn install' * Revert "Attempted to update the lockfile by running 'yarn install'" This reverts commit a9aa75e326a337764fc385c8a0ac4fa93a15fe79. * Update empty.md I think I found what was causing the format: verify command to fail! An extra space after the "Subjects: " header in the metadata. :) * Minor changes --------- --- .../cpp/concepts/maps/terms/empty/empty.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 content/cpp/concepts/maps/terms/empty/empty.md diff --git a/content/cpp/concepts/maps/terms/empty/empty.md b/content/cpp/concepts/maps/terms/empty/empty.md new file mode 100644 index 00000000000..e74a6e98df1 --- /dev/null +++ b/content/cpp/concepts/maps/terms/empty/empty.md @@ -0,0 +1,90 @@ +--- +Title: '.empty()' +Description: 'Checks if a given map is empty.' +Subjects: + - 'Computer Science' + - 'Game Deelopment' +Tags: + - 'Data Structures' + - 'Documentation' + - 'Functions' + - 'Map' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In the C++ Standard Template Library (STL), the **`.empty()`** [function](https://www.codecademy.com/resources/docs/cpp/functions) is a member function under the `std::map` [class](https://www.codecademy.com/resources/docs/cpp/classes) that checks if an STL map [object](https://www.codecademy.com/resources/docs/cpp/objects) contains any key-value pairs. It returns `true` if the map is empty and `false` otherwise. + +## Syntax + +```pseudo +myMap.empty(); +``` + +- `myMap`: The map to be checked. + +## Example + +The following example calls the `.empty()` function, stores its return value in a boolean [variable](https://www.codecademy.com/resources/docs/cpp/variables) and uses this value to display whether the map is empty or not: + +```cpp +#include +#include +using namespace std; + +int main(){ + // Create an empty STL map object + map emptyMap; + + // Check if the map is empty using the .empty() function and store the result + bool isEmpty = emptyMap.empty(); + + // Use the value stored in 'isEmpty' to display whether the map is empty or not + isEmpty ? printf("The map is empty.") : printf("The map is not empty."); + + return 0; +} +``` + +The code above produces the following output: + +```shell +The map is empty. +``` + +## Codebyte Example + +The following code creates two STL map objects with one left empty and the other initialized with elements. The `.empty()` function is then called on each map, returning a boolean indicating if the map is empty: + +```codebyte/cpp +#include +#include +using namespace std; + +int main() { + // Create an empty map + map emptyMap; + + // Create a non-empty map using an initializer list + map notEmptyMap{{1, 'a'}, {2, 'b'}, {3, 'c'}}; + + // Call the .empty() function on the empty map + printf("Testing if emptyMap is empty:\n"); + if (emptyMap.empty()) { + printf("The map is empty.\n"); + } else { + printf("The map is not empty.\n"); + } + + // Call the .empty() function on the map containing elements + printf("Testing if notEmptyMap is empty:\n"); + if (notEmptyMap.empty()) { + printf("The map is empty.\n"); + } else { + printf("The map is not empty.\n"); + } + + return 0; +} +``` From d46d5894de58cfa30e55201ebf9835bae1b14f1a Mon Sep 17 00:00:00 2001 From: Radhika-okhade Date: Sat, 9 Nov 2024 13:11:08 +0530 Subject: [PATCH 087/108] [Term Entry]C++ variables constant variables (#5606) * Create loss-functions.md * Delete content/pytorch/concepts/nn/terms/loss-functions/loss-functions.md Deleted test file * Create constant-variables.md * Update constant-variables.md minor fixes * Update constant-variables.md fixed formatting --------- --- .../constant-variables/constant-variables.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 content/cpp/concepts/variables/terms/constant-variables/constant-variables.md diff --git a/content/cpp/concepts/variables/terms/constant-variables/constant-variables.md b/content/cpp/concepts/variables/terms/constant-variables/constant-variables.md new file mode 100644 index 00000000000..4837309ec1d --- /dev/null +++ b/content/cpp/concepts/variables/terms/constant-variables/constant-variables.md @@ -0,0 +1,68 @@ +--- +Title: 'Constant Variables' +Description: 'Defines variables in C++ whose values cannot be altered after they are set.' +Subjects: + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Const' + - 'OOP' + - 'Variables' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +**Constant variables** in C++ are variables whose values cannot be altered after they are set. By using the `const` keyword, a variable becomes read-only, preventing accidental modification. Constants are especially useful for defining values that should remain consistent throughout the program, such as mathematical constants (e.g., `PI`) or configuration settings. + +## Syntax + +```pseudo +const data_type variable_name = value; +``` + +- `data_type`: The type of the variable. +- `variable_name`: The name of the constant variable. +- `value`: The initial value assigned to the variable. Once set, this value cannot change. + +## Example + +This example demonstrates how to declare and use a constant variable in C++: + +```cpp +#include + +int main() { + const int max_attempts = 5; + std::cout << "Maximum allowed attempts: " << max_attempts << std::endl; + + // Uncommenting the following line would cause a compilation error + // max_attempts = 10; + + return 0; +} +``` + +This example results in the following output: + +```shell +Maximum allowed attempts: 5 +``` + +In this example, `max_attempts` is declared as a constant integer. Attempting to modify it later in the code would result in a compilation error, ensuring that its value remains consistent. + +## Codebyte Example + +```codebyte/cpp +#include + +int main() { + const float pi = 3.14159; + std::cout << "The value of pi is: " << pi << std::endl; + + // Uncommenting the following line would cause a compilation error + // pi = 3.14; + + return 0; +} +``` From a1b38850e8fed5f870a0f1140aea2f3abda4850b Mon Sep 17 00:00:00 2001 From: NeemaJoju Date: Sat, 9 Nov 2024 13:33:29 +0530 Subject: [PATCH 088/108] Adding an example for atan() (#5584) * Adding an example for atan() * Update atan.md * Update atan.md fixed formatting --------- --- .../math-functions/terms/atan/atan.md | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/content/c-sharp/concepts/math-functions/terms/atan/atan.md b/content/c-sharp/concepts/math-functions/terms/atan/atan.md index 8a175f3d330..804715a1e9d 100644 --- a/content/c-sharp/concepts/math-functions/terms/atan/atan.md +++ b/content/c-sharp/concepts/math-functions/terms/atan/atan.md @@ -12,7 +12,7 @@ CatalogContent: - 'paths/computer-science' --- -**Math.Atan()** is a static method that calculates the inverse tangent of a given number, in radians. +**`Math.Atan()`** is a static method that calculates the inverse tangent of a given number, in radians. ## Syntax @@ -23,9 +23,36 @@ Math.Atan(x); - The `Math.Atan()` method takes one double as an argument and returns a double. - Using this method requires the `System` namespace. +## Example + +This example first uses the `Math.Atan()` method to compute the arctangent of an angle in radians and then converts it to degrees: + +```cs +using System; + +class sample +{ + public static void Main() + { + double value = 1.0; // The tangent of an angle + double angleInRadians = Math.Atan(value); + Console.WriteLine("The arctangent of the angle in radians: {0}",angleInRadians); + double angleInDegrees = angleInRadians * (180 / Math.PI); + Console.WriteLine("The arctangent of the angle in degrees: {0}",angleInDegrees); + } +} +``` + +The above code creates the following output: + +```shell +The arctangent of the angle in radians: 0.7853981633974483 +The arctangent of the angle in degrees: 45 +``` + ## Codebyte Example -The following example uses `Math.Atan()` to return the arctangent of a right angled triangle, where the side opposite the angle is equal to 7, and the side adjacent is 5. +The following example uses `Math.Atan()` to return the arctangent of a right angled triangle, where the side opposite the angle is equal to 7, and the side adjacent is 5: ```codebyte/csharp namespace AtanExample { From 4e6c9d9e717484f19aa579628fb456daa1bf2bb8 Mon Sep 17 00:00:00 2001 From: SaiTeja-002 <95877599+SaiTeja-002@users.noreply.github.com> Date: Sat, 9 Nov 2024 13:50:09 +0530 Subject: [PATCH 089/108] [Term Entry] PyTorch Tensor Operations: .narrow() * [Term Entry] PyTorch Tensor Operations .narrow() * Update narrow.md minor fixes * Minor changes --------- --- .../tensor-operations/terms/narrow/narrow.md | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/narrow/narrow.md diff --git a/content/pytorch/concepts/tensor-operations/terms/narrow/narrow.md b/content/pytorch/concepts/tensor-operations/terms/narrow/narrow.md new file mode 100644 index 00000000000..0fb4ee3fd28 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/narrow/narrow.md @@ -0,0 +1,109 @@ +--- +Title: '.narrow()' +Description: 'Returns a narrow subsection of a tensor along a specified dimension.' +Subjects: + - 'Computer Science' + - 'Machine Learning' +Tags: + - 'Python' + - 'Machine Learning' + - 'Methods' + - 'Functions' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +In PyTorch, the **`.narrow()`** method selects a subsection of a [tensor](https://www.codecademy.com/resources/docs/pytorch/tensors) along a specified dimension. It returns a narrowed view without copying the underlying data, making it efficient for extracting specific sections of large tensors without incurring additional memory allocations. + +## Syntax + +```pseudo +torch.narrow(input, dim, start, length) +``` + +- `input`: The tensor to be narrowed. +- `dim`: The dimension along which the input tensor is to be narrowed. +- `start`: The index where the narrowing begins. This can be a positive integer, a negative integer (to index from the end of `dim`) or a 0-dimensional integer tensor. +- `length`: The number of elements to include from the starting position. + +## Example + +The following example illustrates the usage of the `.narrow()` method in various scenarios: + +```py +import torch + +# Create a 2D tensor +tensor_2d = torch.arange(1, 13).reshape(3, 4) +print(f"Original 2D Tensor:\n{tensor_2d}") + +# Case 1: Narrowing along rows (dim=0) +row_narrow = torch.narrow(tensor_2d, 0, 1, 2) +print("\nCase 1: Narrow Along Rows (dim=0, start=1, length=2)") +print(row_narrow) + +# Case 2: Narrowing along columns (dim=1) +col_narrow = torch.narrow(tensor_2d, 1, 1, 2) +print("\nCase 2: Narrow Along Columns (dim=1, start=1, length=2)") +print(col_narrow) + +# Case 3: Extracting a single column (dim=1, length=1) +single_col = torch.narrow(tensor_2d, 1, 2, 1) +print("\nCase 3: Extract Single Column (dim=1, start=2, length=1)") +print(single_col) + +# Case 4: Narrow with length extending beyond tensor's dimension +# In this case, .narrow() raises an error because the sub-tensor's length exceeds the tensor's dimension +try: + error_narrow = torch.narrow(tensor_2d, 0, 1, 5) + print("\nCase 4: Narrow With Length Exceeding Dimension Size") + print(error_narrow) +except RuntimeError as e: + print("\nCase 4: RuntimeError -", e) + +# Case 5: Using a negative start index (dim=1, start=-3, length=2) +negative_start_narrow = torch.narrow(tensor_2d, 1, -3, 2) +print("\nCase 5: Negative Start Index (dim=1, start=-3, length=2)") +print(negative_start_narrow) + +# Case 6: Using a 0-dimensional start index +tensor_0_dim = torch.tensor(1) # 0-dimensional integer tensor +tensor_start_narrow = torch.narrow(tensor_2d, 0, tensor_0_dim, 2) +print("\nCase 6: Start Index as a 0-Dim Tensor (dim=0, start=tensor(1), length=2)") +print(tensor_start_narrow) +``` + +The above program gives the following output: + +```shell +Original 2D Tensor: +tensor([[ 1, 2, 3, 4], + [ 5, 6, 7, 8], + [ 9, 10, 11, 12]]) + +Case 1: Narrow Along Rows (dim=0, start=1, length=2) +tensor([[ 5, 6, 7, 8], + [ 9, 10, 11, 12]]) + +Case 2: Narrow Along Columns (dim=1, start=1, length=2) +tensor([[ 2, 3], + [ 6, 7], + [10, 11]]) + +Case 3: Extract Single Column (dim=1, start=2, length=1) +tensor([[ 3], + [ 7], + [11]]) + +Case 4: RuntimeError - start (1) + length (5) exceeds dimension size (3). + +Case 5: Negative Start Index (dim=1, start=-3, length=2) +tensor([[ 2, 3], + [ 6, 7], + [10, 11]]) + +Case 6: Start Index as a 0-Dim Tensor (dim=0, start=tensor(1), length=2) +tensor([[ 5, 6, 7, 8], + [ 9, 10, 11, 12]]) +``` From 769f8aa3a7458584e42f417e1043e7fd7ce0972b Mon Sep 17 00:00:00 2001 From: SaiTeja-002 <95877599+SaiTeja-002@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:03:04 +0530 Subject: [PATCH 090/108] Feat: [Term Entry] PyTorch Tensor Operations .conj() (#5585) * [Term Entry] PyTorch Tensor Operations .conj() * Update conj.md * Update conj.md * Update conj.md minor fixes --------- --- .../tensor-operations/terms/conj/conj.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/conj/conj.md diff --git a/content/pytorch/concepts/tensor-operations/terms/conj/conj.md b/content/pytorch/concepts/tensor-operations/terms/conj/conj.md new file mode 100644 index 00000000000..3662aabc6ab --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/conj/conj.md @@ -0,0 +1,55 @@ +--- +Title: '.conj()' +Description: 'Computes the complex conjugate of each element in a given tensor.' +Subjects: + - 'Computer Science' + - 'Machine Learning' +Tags: + - 'Python' + - 'Machine Learning' + - 'Functions' + - 'Values' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +In PyTorch, the **`.conj()`** function is used to compute the complex conjugate of each element in a given tensor, returning a new tensor with the computed conjugate values. + +## Syntax + +```pseudo +torch.conj(tensor) +``` + +- `tensor`: The input tensor for which the complex conjugate will be computed. + +## Example + +The following example illustrates the usage of `.conj()`: + +```py +import torch + +complex_tensor = torch.tensor([1 + 2j, 3 - 4j, 5 + 0j]) +print("Original Complex Tensor:") +print(complex_tensor) + +# Applying .conj() on a complex tensor +complex_conj = torch.conj(complex_tensor) +print(f"\nReturn type of .conj() - {type(complex_conj)}") +print("\nComplex Conjugate:") +print(complex_conj) +``` + +The above program gives the following output: + +```shell +Original Complex Tensor: +tensor([1.+2.j, 3.-4.j, 5.+0.j]) + +Return type of .conj() - + +Complex Conjugate: +tensor([1.-2.j, 3.+4.j, 5.-0.j]) +``` From 3fa778e9779aa1d0110921a8fd17e1791a506a3f Mon Sep 17 00:00:00 2001 From: pontiuspilates <92167731+pontiuspilates21@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:40:28 +1030 Subject: [PATCH 091/108] [Edit] C# Math Functions: .Tan() * add example to tan file, with code block and explanation * Update tan.md minor fix * Update tan.md minor fixes * Minor changes --------- --- .../concepts/math-functions/terms/tan/tan.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/content/c-sharp/concepts/math-functions/terms/tan/tan.md b/content/c-sharp/concepts/math-functions/terms/tan/tan.md index 94e32edf7c9..ca54086b595 100644 --- a/content/c-sharp/concepts/math-functions/terms/tan/tan.md +++ b/content/c-sharp/concepts/math-functions/terms/tan/tan.md @@ -28,6 +28,36 @@ The `Math.Tan()` method takes only one parameter, `angle`, an angle in radians o - `NegativeInfinity` - `PositiveInfinity` +## Example + +The following example converts 30 degrees to radians and then uses the `Math.Tan()` method to calculate the tangent of that angle. Finally, `Console.WriteLine()` outputs the result to the console: + +```cs +using System; + +public class Example { + public static void Main(string[] args) { + // Define an angle in degrees + double degrees = 30; + + // Convert the angle to radians + double radians = degrees * Math.PI/180; + + // Calculate the tangent of the angle + double tangent = Math.Tan(radians); + + // Display the result + Console.WriteLine("The tangent of " + degrees + " degrees is: " + tangent); + } +} +``` + +The above example will result in the following output: + +```shell +The tangent of 30 degrees is: 0.5773502691896257 +``` + ## Codebyte Example The following example is runnable and returns the tangent of the `angle` given in degrees: From e075696d1e316faf4e28386393b7ee6bfcb00590 Mon Sep 17 00:00:00 2001 From: Pritam <92075572+pritamjr@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:56:43 +0530 Subject: [PATCH 092/108] [Term Entry] Python:Plotly Express: .scatter_3d() * new term added scatter3d() * Added the output images * Update scatter_3d.md * Rename scatter_3d.md to scatter-3d.md * Update scatter-3d.md * Update scatter.md updating scatter.md * Update scatter-3d.md fixed content * Rename scatter-3d.md to scatter-3d.md file name changed * Update scatter-3d.md * Update scatter-3d.md fixed link * Minor changes --------- --- .../express/terms/scatter-3d/scatter-3d.md | 85 ++++++++++++++++++ media/plotlyScatter3dOutput1.png | Bin 0 -> 51658 bytes media/plotlyScatter3dOutput2.png | Bin 0 -> 59502 bytes 3 files changed, 85 insertions(+) create mode 100644 content/plotly/concepts/express/terms/scatter-3d/scatter-3d.md create mode 100644 media/plotlyScatter3dOutput1.png create mode 100644 media/plotlyScatter3dOutput2.png diff --git a/content/plotly/concepts/express/terms/scatter-3d/scatter-3d.md b/content/plotly/concepts/express/terms/scatter-3d/scatter-3d.md new file mode 100644 index 00000000000..22bdcd8e491 --- /dev/null +++ b/content/plotly/concepts/express/terms/scatter-3d/scatter-3d.md @@ -0,0 +1,85 @@ +--- +Title: '.scatter_3d()' +Description: 'Creates a 3D scatter plot to visualize data points across three dimensions (x, y, z) with options for color, size, and hover data.' +Subjects: + - 'Data Science' + - 'Data Visualization' +Tags: + - 'Graphs' + - 'Libraries' + - 'Plotly' + - 'Data' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +The **`.scatter_3d()`** method in the `plotly.express` module creates a 3D scatter plot to visualize the relationships between three variables using markers in a three-dimensional space. The data points are plotted based on their values on the `x`, `y`, and `z` axes. It also allows customizing marker colors, sizes, and symbols. + +## Syntax + +The `x`, `y`, and `z` parameters are required and accept values as a string, integer, `Series`, or array-like object, representing the data for each axis. Optional parameters, such as `color`, `symbol`, and `size`, customize the markers' appearance. If `data_frame` is not provided, a `DataFrame` will be constructed from other arguments. + +```pseudo +plotly.express.scatter_3d(data_frame=None, x=None, y=None, z=None, color=None, symbol=None, size=None, ...) +``` + +- `data_frame`: The Pandas [`DataFrame`](https://www.codecademy.com/resources/docs/pandas/dataframe) containing the data to visualize. +- `x`: The column name in `data_frame`, `Series`, or array-like object for x-axis data. +- `y`: The column name in `data_frame`, `Series`, or array-like object for y-axis data. +- `z`: The column name in `data_frame`, `Series`, or array-like object for z-axis data. +- `color`: The column name in `data_frame`, `Series`, or array-like object to specify marker colors. +- `symbol`: The column name in `data_frame`, `Series`, or array-like object for assigning marker symbols. +- `size`: The column name in `data_frame`, `Series`, or array-like object to assign marker sizes. + +> **Note:** The ellipsis in the syntax (...) indicates additional optional parameters that can be used to customize the plot further. + +## Examples + +The examples below demonstrate how the [`.scatter()`](https://www.codecademy.com/resources/docs/plotly/express/scatter) method creates a 2D scatter plot, while the `.scatter_3d()` method provides a more complex visualization in three dimensions, utilizing additional parameters for color and symbol customization. + +### Example 1 + +The following example demonstrates the use of the `.scatter()` method: + +```py +# Defining 'x' and 'y' as array-like objects +import plotly.express as px +x = [1, 3, 5, 7, 9] +y = [4, 6, 5, 8, 2] + +# Creating a scatter plot +fig = px.scatter(x = x, y = y) + +# Displaying the plot +fig.show() +``` + +The output for the above code is as follows: + +![The output for the above example](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotlyScatter3dOutput1.png) + +### Example 2 + +This example illustrates the use of the `.scatter_3d()` method, showcasing its capability to utilize more parameters for enhanced visualization: + +```py +import plotly.express as px + +# Sample Data +x = [1, 3, 5, 7, 9] +y = [4, 6, 5, 8, 2] +z = [7, 2, 9, 4, 8] +color = ['red', 'green', 'blue', 'purple', 'orange'] +symbol = ['circle', 'square', 'diamond', 'star', 'triangle-up'] + +# Creating a 3D scatter plot +fig = px.scatter_3d(x=x, y=y, z=z, color=color, symbol=symbol, title="3D Scatter Plot with Colors and Symbols") + +# Displaying the plot +fig.show() +``` + +The above code produces the following output: + +![The output for the above example](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotlyScatter3dOutput2.png) diff --git a/media/plotlyScatter3dOutput1.png b/media/plotlyScatter3dOutput1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7627b8b061f8bf042f518a068e4a84720b95856 GIT binary patch literal 51658 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
l!9(J`J6bhDDub;D*yam~16}Gz(>XV${YJMO+ zCZFISK-2ht^K|xDHNYAbZvLPV-ZB}prnyf$ObJU+<^u4MgC#eV=t+Z#EInahRPktK zmU&irZCN8z7Q}UqR_+}YEs)X4(4ZmNrnVLa(a=>|#%(7c-|l`Vn}Z_c0l6oxM8V+_ z`GetUlVSAGbq*C>gF5$UNsFZ4)U-j+GajaqmQ)Q>OV@$Tq?%Y{h85DBqK{d66sN=^ zRR_qaj(OX#vB+yE5|G0+1KxdS0_1?2DCQ?|639@Em#Z}Y-29$u5+{2LlE3{e2a+ATow8XP2F2xPdLf2-{DWwa z+zdJ>6f{_Js?J7)JErSLLTNRD)tN*Oe9Rq%;V&~;cz*SZyG@h*A8mzx9 zfS2Vo^yZHf6;p+6w*kl}Ib@yAOs+iwH8w=!>UlknX`dhfbc(GJBlC$4hhNx3{;yZy%Lb@29K45Kr@Z@_(0zzrx58 z3T-kc2TR+ZVPNB8q%pA(1^uOwuYs~QVfouk)RF{nx_R? ze%>IV4I6dnlJ2adNI!7xGGjs**~x0xiLI@n2A*BTmXEfk@fiQYi$YG?8@CPm9{bwl zQ@LntQ z8Z=As%f{0l5b=A2JCiuh0u~ge&+=vj*8wDZgXT{Ar`d)wgD^~UufPMZNd;u*tm
    MD1Q0x&5h-Q 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 literal 0 HcmV?d00001 diff --git a/media/plotlyScatter3dOutput2.png b/media/plotlyScatter3dOutput2.png new file mode 100644 index 0000000000000000000000000000000000000000..56e1a040a99356ee09015f91744b347dbf394e3b GIT binary patch literal 59502 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 W{z&iO-n;_-i9MHomMiqi?SBCb! Date: Sun, 10 Nov 2024 13:06:03 +0000 Subject: [PATCH 093/108] =?UTF-8?q?=F0=9F=A4=96=20update=20concept=20of=20?= =?UTF-8?q?the=20week?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/concept-of-the-week.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/concept-of-the-week.txt b/bin/concept-of-the-week.txt index 69740388002..a47e69cb203 100644 --- a/bin/concept-of-the-week.txt +++ b/bin/concept-of-the-week.txt @@ -1 +1 @@ -content/sql/concepts/data-types/data-types.md \ No newline at end of file +content/rust/concepts/conditionals/conditionals.md \ No newline at end of file From 262be358c2483a457a3f1ce0ce593c331f6ad5b4 Mon Sep 17 00:00:00 2001 From: Nelson Santiago Date: Mon, 11 Nov 2024 11:45:00 +0000 Subject: [PATCH 094/108] Edited Python Numpy built-in functions .reshape() (#5523) * edited Python Numpy built-in functions .reshape() * required changes done * Update reshape.md minor fixes * Minor changes * formating fix --------- --- .../terms/reshape/reshape.md | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/content/numpy/concepts/built-in-functions/terms/reshape/reshape.md b/content/numpy/concepts/built-in-functions/terms/reshape/reshape.md index 61104d272df..94518ec2295 100644 --- a/content/numpy/concepts/built-in-functions/terms/reshape/reshape.md +++ b/content/numpy/concepts/built-in-functions/terms/reshape/reshape.md @@ -1,6 +1,6 @@ --- Title: '.reshape()' -Description: 'Rearranges the data of an ndarray into a new shape.' +Description: 'Rearranges the data of a ndarray into a new shape.' Subjects: - 'Computer Science' - 'Data Science' @@ -20,16 +20,23 @@ The `.reshape()` function rearranges the data in an [`ndarray`](https://www.code ## Syntax ```pseudo -numpy.reshape(array, newshape) +numpy.reshape(array, newshape, order = 'C') ``` -Where `array` is the array to be reshaped, and `newshape` can be an integer or a [`tuple`](https://www.codecademy.com/resources/docs/python/tuples) representing the size of the new array. If a dimension is `-1`, that dimension will be inferred from the size of the original array. +- `array`: The input array to be reshaped. +- `newshape`: An integer or a [`tuple`](https://www.codecademy.com/resources/docs/python/tuples) representing the desired shape of the new array. If one dimension is set to -1, that dimension will be inferred based on the size of the original array. +- `order`: Specifies how elements should be read from the original array and placed into the reshaped array. It can be set to `'C'`, `'F'`, or `'A'`: + - `C`: Read/write elements in row-major order (C-like), where the last axis (columns) changes fastest, and the first axis (rows) changes slowest. The elements are placed row by row. + - `F`: Read/write elements in column-major order (Fortran-like), where the first axis (rows) changes fastest, and the last axis (columns) changes slowest. The elements are placed column by column. + - `A`: Use Fortran-like index order if the array is Fortran contiguous in memory (i.e., stored sequentially without gaps), or C-like order otherwise. -If possible, the `ndarray` returned will be a view of the original `ndarray`'s data. +Using `'C'` or `'F'` in `.reshape()` affects the indexing order but does not alter the physical layout of the data in memory. + +If possible, the `ndarray` returned will be a view of the data from the original `ndarray`. ## Example -The following example creates an `ndarray` then uses `.reshape()` to change its dimensions. +The following example creates an `ndarray` then uses `.reshape()` to change its dimensions: ```py import numpy as np @@ -58,3 +65,17 @@ This produces the following output: [5] [6]] ``` + +## Codebyte Example + +The following example creates a `ndarray` and then uses `order` as an optional parameter for `.reshape()` to change its dimensions: + +```codebyte/python +import numpy as np + +nd1 = np.array([[10, 20, 30], [40, 50, 60]]) + +print(nd1) +print(np.reshape(nd1, (3, 2), order='C')) +print(np.reshape(nd1, (3, 2), order='F')) +``` From 30f071124e60fc85859982600e2537b8237558d9 Mon Sep 17 00:00:00 2001 From: Robera Toye <47657043+roberanegussie@users.noreply.github.com> Date: Tue, 12 Nov 2024 13:59:15 +0300 Subject: [PATCH 095/108] [Term Entry] local-variables (#5496) * Create local-variables.md [Term Entry] for Local Variables * Update local-variables.md * Update local-variables.md minor fixes * Update local-variables.md * Update local-variables.md fixed formating issue --------- --- .../terms/local-variables/local-variables.md | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 content/cpp/concepts/variables/terms/local-variables/local-variables.md diff --git a/content/cpp/concepts/variables/terms/local-variables/local-variables.md b/content/cpp/concepts/variables/terms/local-variables/local-variables.md new file mode 100644 index 00000000000..c0ef3f9fee3 --- /dev/null +++ b/content/cpp/concepts/variables/terms/local-variables/local-variables.md @@ -0,0 +1,67 @@ +--- +Title: 'Local Variables' +Description: 'A variable defined inside a function body between braces is called a local variable.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Data Types' + - 'Variables' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +A **local variable** is a variable whose scope is limited to the function or block where it is defined. It exists only within that function and can only be accessed from there. + +## Syntax + +```pseudo +void local_variable(){ + int a_local_variable; +} +``` + +The variable `a_local_variable` is local to the `local_variable` function in which it is defined. It can only be accessed and used within that function. When the function `local_variable` exits, the life of `a_local_variable` ends, and its memory is released. + +## Example + +In the following example, the `a_local_variable` of integer data type is defined inside the function `local_variable()`: + +```cpp +#include +using namespace std; + +void local_variable(){ + int a_local_variable = 1; + cout < +using namespace std; + +void local(){ + int var = 0; + cout< Date: Tue, 12 Nov 2024 06:02:31 -0500 Subject: [PATCH 096/108] Forward list (#5343) * Added a Forward List page for cpp * Updated formatting * Update forward-list.md * Update content/cpp/concepts/forward-list/forward-list.md * Update forward-list.md added codebytle example and fixed a minor issue * Update forward-list.md fixed minor issue * Update forward-list.md minor fixes --------- --- .../cpp/concepts/forward-list/forward-list.md | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 content/cpp/concepts/forward-list/forward-list.md diff --git a/content/cpp/concepts/forward-list/forward-list.md b/content/cpp/concepts/forward-list/forward-list.md new file mode 100644 index 00000000000..7557f98b928 --- /dev/null +++ b/content/cpp/concepts/forward-list/forward-list.md @@ -0,0 +1,84 @@ +--- +Title: 'forward_list' +Description: 'Forward List is a sequence container that allows efficient insertions and deletions from the front of the list.' +Subjects: + - 'Computer Science' +Tags: + - 'Collections' + - 'Lists' + - 'Memory' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +A **`forward_list`** is a sequence container in C++ that allows efficient insertions and deletions at the front of the list. It stores a memory address to the first element, with each element containing data and a pointer to the next element. Compared to arrays, `forward_list` offers faster insertions and deletions at the front but lacks direct access to elements by index. + +## Syntax + +```pseudo +#include + +std::forward_list list_name; +``` + +- `type`: The type of the elements in the `forward_list`. This can be any data type, such as `int`, `std::string`, or user-defined types. +- `list_name`: The name of the `forward_list` object being declared. + +> **Note:** To use `std::forward_list`, the header `` must be included. + +## Example + +The following example shows how to create a `forward_list` and iterate over it: + +```cpp +#include +#include + +int main() { + std::forward_list list = {1,2,3,4,5}; + + std::cout << "Output:" << std::endl; + + for(auto it = list.begin(); it != list.end(); ++it) { + std::cout << *it << " "; + } + std::cout << std::endl; +} +``` + +The output of the above program will be: + +```shell +Output: +1 2 3 4 5 +``` + +> **Note:** Unlike arrays, `forward_list` does not support direct access to elements through indices. To access a specific element, all preceding elements must be iterated over. + +## Codebyte Example + +The following codebyte example demonstrates the use of `forward_list` in C++ by initializing a list with elements, inserting an element at the front, removing an element from the front, and iterating over the list to print the remaining elements: + +```codebyte/cpp +#include +#include + +int main() { + // Initialize a forward_list with some elements + std::forward_list list = {10, 20, 30}; + + // Insert an element at the front + list.push_front(5); + + // Remove an element from the front + list.pop_front(); + + // Iterate over the list and print each element + for (auto it = list.begin(); it != list.end(); ++it) { + std::cout << *it << " "; + } + + return 0; +} +``` From 5b104f5afb018c0f3c765b9c237dea7eb2cc4583 Mon Sep 17 00:00:00 2001 From: Nauman Tamboli <141002585+Naumantamboli@users.noreply.github.com> Date: Wed, 13 Nov 2024 00:20:14 +0530 Subject: [PATCH 097/108] Naumantamboli references (#5545) * Update references.md * Update references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update content/cpp/concepts/references/references.md * Update references.md * Update references.md * Update references.md * Minor formatting and grammatical fixes * Add code output * Minor Fix --------- --- content/cpp/concepts/references/references.md | 64 ++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/content/cpp/concepts/references/references.md b/content/cpp/concepts/references/references.md index d0abd380451..d859272d260 100644 --- a/content/cpp/concepts/references/references.md +++ b/content/cpp/concepts/references/references.md @@ -1,14 +1,13 @@ --- Title: 'References' -Description: 'A reference variable is an alias for another object. It is created using the & sign. Two things to note: Anything done to the reference also happens to the original and aliases cannot be changed to alias something else.' +Description: 'A reference variable is an alias for another object.' Subjects: - 'Computer Science' - 'Game Development' Tags: - - 'References' - - 'Pointers' - - 'Parameters' - 'Memory' + - 'Parameters' + - 'References' CatalogContent: - 'learn-c-plus-plus' - 'paths/computer-science' @@ -19,7 +18,7 @@ A **reference** variable is an alias for another object. It is created using the Two things to note: - Anything done to the reference also happens to the original. -- Aliases cannot be changed to alias something else. +- Aliases cannot be changed to alias or something else. ## Syntax @@ -37,7 +36,6 @@ It allows the ability to: - Avoid making copies of a variable/object for performance reasons. ```cpp - void swap_num(int &i, int &j) { int temp = i; i = j; @@ -50,8 +48,8 @@ int main() { swap_num(a, b); - std::cout << "A is " << a << "\n"; - std::cout << "B is " << b << "\n"; + std::cout << "A is " << a << "\n"; // Expected output: A is 200 + std::cout << "B is " << b << "\n"; // Expected output: B is 100 } ``` @@ -66,3 +64,53 @@ int triple(int const &i) { return i * 3; } ``` + +## References with Classes + +References can also be used with objects of classes. This allows object properties to be modified directly by passing them as reference parameters. + +```cpp +#include + +class Car { + public: + int speed; + Car(int spd) : speed(spd) {} + + void setSpeed(int &newSpeed) { speed = newSpeed; } +}; + +int triple(const int &i) { return i * 3; } + +int main() { + Car myCar(100); + int newSpeed = 200; + myCar.setSpeed(newSpeed); + + std::cout << "The new speed is: " << myCar.speed << "\n"; // The new speed is: 200 + std::cout << "Triple the speed: " << triple(myCar.speed) << "\n"; // Triple the speed: 600 + + return 0; +} +``` + +## Modifying Arrays Using References + +Passing arrays by reference is also useful for avoiding unnecessary copies, especially for large datasets. + +```cpp +void modifyArray(int (&arr)[5]) { + for (int i = 0; i < 5; i++) { + arr[i] = arr[i] * 2; + } +} + +int main() { + int myArr[5] = {1, 2, 3, 4, 5}; + modifyArray(myArr); + + for (int i = 0; i < 5; i++) { + std::cout << myArr[i] << " "; // 2 4 6 8 10 + } +} +``` From 81d76789cd3ff33eb998d5c9e8849bec5fba19c9 Mon Sep 17 00:00:00 2001 From: Christina Loiacono <65386414+christina-ml@users.noreply.github.com> Date: Thu, 14 Nov 2024 00:14:08 -0500 Subject: [PATCH 098/108] [Concept Entry] PostgreSQL: Transactions * add concept entry for postgresql transactions * fix issues by running PR checker * Update the changes requested in the suggestions. * Update transactions.md replaced the syntax ```sql block with ```pseudo * Update transactions.md * Add headings for outputs for Example 1 and Example 2 for clarity. * Run yarn lint * Update content/postgresql/concepts/transactions/transactions.md * Update transactions.md made minor changes * Minor changes --------- --- .../concepts/transactions/transactions.md | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 content/postgresql/concepts/transactions/transactions.md diff --git a/content/postgresql/concepts/transactions/transactions.md b/content/postgresql/concepts/transactions/transactions.md new file mode 100644 index 00000000000..ae3e067d241 --- /dev/null +++ b/content/postgresql/concepts/transactions/transactions.md @@ -0,0 +1,127 @@ +--- +Title: 'Transactions' +Description: 'Transactions bundle one or more steps into a single unit of work; an all-or-nothing operation where all statements succeed or all statements fail.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'PostgreSQL' + - 'Database' + - 'Finance' + - 'Data' +CatalogContent: + - 'paths/data-science' + - 'paths/data-science-foundations' +--- + +**Transactions** are a fundamental concept in PostgreSQL that bundles one or more steps into a single unit of work. It is an all-or-nothing operation where all statements succeed or all statements fail. The intermediate states between the steps are not visible to other concurrent transactions and if a failure occurs that prevents the transaction from completing, it does not affect the database. + +Examples for when to use transactions would be in finance, such as a bank database that contains balances for various customer accounts and total deposit balances for branches. Transactions are fundamental for maintaining the accuracy and reliability of the records in a database. + +## Syntax + +There are three main commands in a transaction. These are `BEGIN`, `COMMIT`, and `ROLLBACK`. + +`BEGIN` starts a transaction block: + +```pseudo +BEGIN; +``` + +Even if a `BEGIN` command is _not_ issued, each individual statement has an implicit `BEGIN`. If successful, it will have a `COMMIT` wrapped around it. + +`COMMIT` permanently saves the changes made within the transaction block to the database: + +```pseudo +COMMIT; +``` + +`ROLLBACK` is used to undo a transaction. It cancels all changes made in the current transaction block. This can also be used if partway through the transaction, there is no need to commit these changes: + +```pseudo +ROLLBACK; +``` + +Putting it all together, here is the general syntax for the three commands: + +```pseudo +BEGIN; +-- Set of statements +COMMIT; +``` + +Or, + +```pseudo +BEGIN; +-- Set of statements +ROLLBACK; +``` + +## Example 1 + +A customer named Alice has an initial balance of $500.00 in her bank account. Here is an example that demonstrates the usage of a transaction block using the `BEGIN` and `COMMIT` commands: + +```sql +BEGIN; +UPDATE accounts SET balance = balance - 100.00 + WHERE name = 'Alice'; +-- Set of statements +COMMIT; +``` + +After the transaction, $100 has been deducted from Alice's balance. To verify Alice's updated balance, a query is run on the `accounts` table: + +```sql +SELECT balance FROM accounts WHERE name = 'Alice'; +``` + +Here is the output: + +```shell +400.00 +``` + +## Example 2 + +Customers Alice, Bob, and Carol each start with $500.00 in their bank accounts. + +To have more control over statements in a transaction, the `SAVEPOINT` command can be used, which allows a savepoint to be defined. After defining a savepoint, if needed, the transaction can be rolled back to the savepoint with the `ROLLBACK TO` command. + +Here is an example that demonstrates the usage of a transaction block, implementing the `SAVEPOINT` and `ROLLBACK TO` commands, giving more control over the statements within the transaction block: + +```sql +BEGIN; +UPDATE accounts SET balance = balance - 100.00 + WHERE name = 'Alice'; +-- Output: Alice's account was deducted by 100.00 and now has 400.00 +-- Add a savepoint for Alice's account +SAVEPOINT my_savepoint; +UPDATE accounts SET balance = balance + 100.00 + WHERE name = 'Bob'; +-- Output: Bob's account was increased by 100.00 and now Bob has 600.00 +-- Oops... this wasn't for Bob, use Carol's account +ROLLBACK TO my_savepoint; +-- No Output: Bob's account reverts back to 500.00 +UPDATE accounts SET balance = balance + 100.00 + WHERE name = 'Carol'; + -- Output: Carol's account was increased by 100.00 and now Carol has 600.00 +COMMIT; +``` + +To verify the balances after the transaction, the `accounts` table is queried: + +```sql +SELECT balance FROM accounts WHERE name = 'Alice'; +-- Output: 400.00 + +SELECT balance FROM accounts WHERE name = 'Bob'; +-- Output: 500.00 + +SELECT balance FROM accounts WHERE name = 'Carol'; +-- Output: 600.00 +``` + +Using the `SAVEPOINT` selectively discards parts of the transaction, while committing the rest. + +`ROLLBACK TO` prevents the need for rolling back the transaction completely and starting over. This means the database changes between `SAVEPOINT` and `ROLLBACK TO` are discarded, but earlier changes in the savepoint are kept. From 6e982ee038b2dd0faf86cfccca9ffe8f1d2ecd81 Mon Sep 17 00:00:00 2001 From: Rashmit <163204184+RashmitTopG@users.noreply.github.com> Date: Thu, 14 Nov 2024 11:26:52 +0530 Subject: [PATCH 099/108] [Edit] C++: Enum * Added cpp enum * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update content/cpp/concepts/enum/enum.md * Update enum.md fixed minor issues * Minor changes --------- --- content/cpp/concepts/enum/enum.md | 62 ++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/content/cpp/concepts/enum/enum.md b/content/cpp/concepts/enum/enum.md index 5b628a1011d..04df8195a0b 100644 --- a/content/cpp/concepts/enum/enum.md +++ b/content/cpp/concepts/enum/enum.md @@ -1,6 +1,6 @@ --- -Title: 'Enums' -Description: 'In C++, an enumeration (enum) is a user defined type where a set of values are specified for a variable and the variable can only take one out of a small set of possible values.' +Title: 'Enum' +Description: 'Defines a variable with a limited set of predefined values.' Subjects: - 'Computer Science' - 'Game Development' @@ -102,3 +102,61 @@ LogResult logger_result = LogResult::Success; if (logger_result == LogResult::Success) {} // Because Success is scoped to LogResult, it doesn't collide with SocketResult::Success ``` + +## Enum to Int Conversion + +In C++, `enum` can be implicitly converted to integers, useful for numeric contexts like array indexing or bitwise operations: + +```cpp +#include +enum color { red, green, blue }; + +int main() { + color c = green; + int colorValue = c; // Implicit conversion to int + std::cout << "Color value: " << colorValue; +} +``` + +Here is the output: + +```shell +Color value: 1 +``` + +Converting an `enum` to `int` is easy, but converting `int` to `enum` is risky as no bounds check is done, leading to undefined behavior if the value is out of range. + +## Custom Underlying Types + +By default, an enum's type is `int`, but a smaller type like `unsigned char` can be specified to optimize memory usage: + +```cpp +#include +enum class Permission : unsigned char { + Read = 1, + Write = 2, + Execute = 4 +}; + +int main() { + Permission p = Permission::Write; + std::cout << static_cast(p); // Explicit cast to int +} +``` + +Here, the underlying type of `Permission` is `unsigned char`. The constants `Read`, `Write`, and `Execute` are stored using only 1 byte of memory. + +This example results in the following output: + +```shell +2 +``` + +## Best Practices + +Here are some best practices for using enums: + +1. Use `enum class` for strong typing: Scoped enums (C++11) prevent implicit int conversions, ensuring better type safety. +2. Explicit casting: Use `static_cast(enum_value)` for safe conversions. +3. Avoid magic numbers: Enums replace hardcoded numbers, improving readability. +4. Use underlying types wisely: Choose the underlying type carefully in memory-constrained environments. From 55c9f8c3c171a3fbdc361065affb73d07118c59c Mon Sep 17 00:00:00 2001 From: Nauman Tamboli <141002585+Naumantamboli@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:42:21 +0530 Subject: [PATCH 100/108] Update files.md (#5539) * Update files.md * Update content/cpp/concepts/files/files.md * Update content/cpp/concepts/files/files.md * Update content/cpp/concepts/files/files.md * Update files.md fixed minor issues * Update files.md made the description shorter * Review Fixes --------- --- content/cpp/concepts/files/files.md | 59 ++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/content/cpp/concepts/files/files.md b/content/cpp/concepts/files/files.md index 8b2e3196616..436053e06ba 100644 --- a/content/cpp/concepts/files/files.md +++ b/content/cpp/concepts/files/files.md @@ -1,6 +1,6 @@ --- Title: 'Files' -Description: 'Computers use file systems to store and retrieve data. The fstream library, short for file stream, enables working with files in C++. The fstream library has three classes that are used to create, write, and read files: ofstream, ifstream, and fstream.' +Description: 'Computers use file systems to store and retrieve data. The fstream library, short for file stream, enables working with files in C++.' Subjects: - 'Computer Science' - 'Game Development' @@ -89,3 +89,60 @@ The output would be: Today is the greatest Day I've ever known ``` + +## Appending to a File + +In some cases, you may want to append text to an existing file instead of overwriting its content. To do this, you can open the file in append mode using the `std::ios::app` flag with `ofstream` or `fstream`. Here's an example: + +```cpp +#include +#include +int main() { + // Open the file in append mode + std::ofstream MyFile("journal.txt", std::ios::app); + // Append text to the file + MyFile << "\nSmashing Pumpkins lyrics\n"; + // Close the file + MyFile.close(); +} +``` + +The file `journal.txt` will now contain: + +```shell +Today is the greatest +Day I've ever known +Smashing Pumpkins lyrics +``` + +## Checking if a file exists + +Before opening a file, checking if the file exists is a good practice. This can prevent issues like reading a file that doesn't exist. You can use the `.is_open()` function for this: + +```cpp +#include +#include +int main() { + std::ifstream MyFile("journal.txt"); + // Check if the file opened successfully + if (MyFile.is_open()) { + std::cout << "File opened successfully.\n"; + } else { + std::cout << "File does not exist.\n"; + } + // Close the file + MyFile.close(); +} +``` + +If the file `journal.txt` exists, the output will be: + +```shell +File opened successfully. +``` + +If the file `journal.txt` does not exist, the output will be: + +```shell +File does not exist. +``` From e7b239d0708eaa391e59e71c18e6126db935660c Mon Sep 17 00:00:00 2001 From: selena Date: Thu, 14 Nov 2024 03:00:25 -0800 Subject: [PATCH 101/108] [Edit] Python numpy - Added Codebyte example to linspace function (#5526) * added codebyte example * Update linspace.md minor changes * Update linspace.md minor changes --------- --- .../terms/linspace/linspace.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/content/numpy/concepts/built-in-functions/terms/linspace/linspace.md b/content/numpy/concepts/built-in-functions/terms/linspace/linspace.md index f35abefeb96..23547d2134d 100644 --- a/content/numpy/concepts/built-in-functions/terms/linspace/linspace.md +++ b/content/numpy/concepts/built-in-functions/terms/linspace/linspace.md @@ -66,3 +66,22 @@ This results in the following output: [3.4 4.4 5.4] [4. 5. 6. ]] ``` + +## Codebyte Example + +Run the following codebyte example to understand the usage of the `linspace()` function with different inputs and parameters: + +```codebyte/python +import numpy as np + +result, step_size = np.linspace(0, 20, num=5, retstep=True) +print("Resulting array: ", result) +print("Step size: ", step_size) + +result2, step_size2 = np.linspace(0, 20, num=5, endpoint=False, retstep=True) +print("Resulting array (without endpoint): ", result2) +print("Step size: ", step_size2) + +result3 = np.linspace([0, 10], [20, 100], num=8, axis=1) +print(result3) +``` From c177d5f6664753d77085adad7fd50e326bbf1de3 Mon Sep 17 00:00:00 2001 From: Pratik Jadhav <81787115+pratik305@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:21:48 +0530 Subject: [PATCH 102/108] Add sgd docs (#5208) * Started documentation for Stochastic Gradient Descent * correct some spelling mistake * Add example and update documentation for SGD * added syntax * corrected code * updated the file --------- --- .../stochastic-gradient-descent.md | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 content/ai/concepts/neural-networks/terms/stochastic-gradient-descent/stochastic-gradient-descent.md diff --git a/content/ai/concepts/neural-networks/terms/stochastic-gradient-descent/stochastic-gradient-descent.md b/content/ai/concepts/neural-networks/terms/stochastic-gradient-descent/stochastic-gradient-descent.md new file mode 100644 index 00000000000..85877803682 --- /dev/null +++ b/content/ai/concepts/neural-networks/terms/stochastic-gradient-descent/stochastic-gradient-descent.md @@ -0,0 +1,182 @@ +--- +Title: 'Stochastic Gradient Descent' +Description: 'Stochastic Gradient Descent is an optimizer algorithm that minimizes the loss function in machine learning and deep learning models.' +Subjects: + - 'Machine Learning' + - 'Computer Science' +Tags: + - 'AI' + - 'Neural Networks' +CatalogContent: + - 'paths/computer-science' + - 'paths/data-science' +--- + +**Stochastic Gradient Descent** (SGD) is an optimization algorithm used to minimize the loss function in machine learning and deep learning models. It is a variant of the traditional **Gradient Descent** (GD) algorithm. SGD updates the weights and biases of a model, such as those in an Artificial Neural Network (ANN), during the backpropagation process. + +The term `stochastic` refers to the randomness involved in the algorithm. Instead of using the entire dataset to compute gradients as in batch `gradient descent`, SGD uses a randomly selected data point (or a small mini-batch) to perform each update. For instance, if the dataset contains 500 rows, SGD will update the model parameters 500 times in one epoch, each time using a different randomly chosen data point (or small batch). + +This approach significantly reduces computation time, especially for large datasets, making SGD faster and more scalable. SGD is used for training models like neural networks, support vector machines (SVMs), and logistic regression. However, it introduces more noise into the learning process, which can lead to less stable convergence but also helps escape local minima, making it suitable for non-convex problems. + +## Algorithms Step + +- At each iteration, a random sample is selected from the training dataset. +- The gradient of the cost function with respect to the model parameters is computed based on the selected sample. +- The model parameters are updated using the computed gradient and the learning rate. +- The process is repeated for multiple iterations until convergence or a specified number of epochs. + +## Formula + +$$ +\large \theta = \theta - \alpha \cdot \nabla J(\theta ; x_i, y_i) +$$ + +Where: + +- `θ` represents the model parameter (weight or bias) being updated. +- `α` is the learning rate, a hyperparameter that controls the step size of the update. +- `∇J(θ;xi,yi)` is the gradient of the cost or loss function `J` with respect to the model parameter `θ`, computed based on a single training sample `(xi,yi)`. + +## Advantages + +- **Faster convergence:** SGD updates parameters more frequently hence it takes less time to converge especially for large datasets. +- **Reduced Computation Time:** SGD takes only a subset of dataset or batch for each update. This makes it easy to handle large datasets and compute faster. +- **Avoid Local Minima:** The noise introduced by updating parameters with individual data points or small batches can help escape local minima.This can potentially lead to better solutions in complex, non-convex optimization problems. +- **Online Learning:** SGD can be used in scenarios where data is arriving sequentially (online learning).- It allows models to be updated continuously as new data comes in. + +## Disadvantages + +- **Noisy Updates:** Updates are based on a single data point or small batch, which introduces variability in the gradient estimates.This noise can cause the algorithm to converge more slowly or oscillate around the optimal solution. +- **Convergence Issues:** The noisy updates can lead to less stable convergence and might make it harder to reach the exact minimum of the loss function.Fine-tuning the learning rate and other hyperparameters becomes crucial to achieving good results. +- **Hyperparameter Sensitivity:** - SGD's performance is sensitive to the choice of learning rate and other hyperparameters.Finding the right set of hyperparameters often requires experimentation and tuning. + +## Example + +The following code demonstrates **Stochastic Gradient Descent** (SGD) to fit a line to data points. Starting with initial guesses for the slope (`m`) and intercept (`b`), it updates these values iteratively by calculating the gradients of the **Mean Squared Error** (MSE) loss. The parameters are adjusted step-by-step based on the gradients, reducing the error between predicted and actual values: + +```python +import numpy as np + +# Data points (x, y) where the true line is y = 2x +x = np.array([1, 2, 3, 4, 5]) +y = np.array([2, 4, 6, 8, 10]) + +# Initial guess for parameters (slope, intercept) +params = np.array([0.0, 0.0]) + +# Learning rate and epochs +learning_rate = 0.01 +epochs = 1000 + +# Model: y = mx + b +def model(params, x): + m, b = params + return m * x + b + +# MSE loss function +def loss(pred, actual): + return np.mean((pred - actual) ** 2) # Using mean instead of sum + +# Compute gradients (partial derivatives) +def gradients(params, x, y): + m, b = params + pred = model(params, x) + grad_m = 2 * (pred - y) * x # Gradient for m + grad_b = 2 * (pred - y) # Gradient for b + return np.array([grad_m, grad_b]) + +# Training history +history = [] + +# SGD: Update parameters +for epoch in range(epochs): + total_loss = 0 + # Shuffle data + indices = np.random.permutation(len(x)) + x_shuffled = x[indices] + y_shuffled = y[indices] + + for i in range(len(x)): + # Forward pass + pred = model(params, x_shuffled[i]) + loss_value = loss(pred, y_shuffled[i]) + + # Compute gradients + grads = gradients(params, x_shuffled[i], y_shuffled[i]) + + # Update parameters + params -= learning_rate * grads + total_loss += loss_value + + # Store loss for plotting + avg_loss = total_loss / len(x) + history.append(avg_loss) + + if epoch % 100 == 0: # Print loss every 100 epochs + print(f"Epoch {epoch}, Loss: {avg_loss:.6f}") + +print(f"Final parameters: m = {params[0]:.4f}, b = {params[1]:.4f}") +``` + +The output of the code is as follows: + +```shell +Epoch 0, Loss: 22.414958 +Epoch 100, Loss: 0.001293 +Epoch 200, Loss: 0.000037 +Epoch 300, Loss: 0.000001 +Epoch 400, Loss: 0.000000 +Epoch 500, Loss: 0.000000 +Epoch 600, Loss: 0.000000 +Epoch 700, Loss: 0.000000 +Epoch 800, Loss: 0.000000 +Epoch 900, Loss: 0.000000 +Final parameters: m = 2.0000, b = 0.0000 +``` + +> **Note**: The output may vary depending on factors like the initial parameter values, learning rate, and number of epochs. + +## codebyte Example + +Here’s a Python code snippet demonstrating how to implement SGD for linear regression: + +```codebyte/python +import numpy as np + +# Generate synthetic data +np.random.seed(42) +X = 2 * np.random.rand(100, 1) +y = 4 + 3 * X + np.random.randn(100, 1) + +# Add a bias term (X0 = 1) to the input data +X_b = np.c_[np.ones((100, 1)), X] # Add a column of ones for the intercept term + +# Initialize parameters +m, n = X_b.shape +theta = np.random.randn(n, 1) # Initial weights +learning_rate = 0.01 +n_iterations = 1000 + +# Stochastic Gradient Descent function +def stochastic_gradient_descent(X, y, theta, learning_rate, n_iterations): + m = len(y) + for iteration in range(n_iterations): + # Shuffle the data + indices = np.random.permutation(m) + X_shuffled = X[indices] + y_shuffled = y[indices] + + # Update weights for each sample + for i in range(m): + xi = X_shuffled[i:i+1] + yi = y_shuffled[i:i+1] + gradient = 2 * xi.T.dot(xi.dot(theta) - yi) + theta -= learning_rate * gradient + + return theta + +# Perform SGD +theta_final = stochastic_gradient_descent(X_b, y, theta, learning_rate, n_iterations) + +print("Optimized weights:", theta_final) +``` From f52e5d598358d52a05bdda95c65f684569bd1b23 Mon Sep 17 00:00:00 2001 From: Deepak Saldanha Date: Thu, 14 Nov 2024 17:38:46 +0530 Subject: [PATCH 103/108] [Term Entry] Python Plotly- graph_objects .Surface() (#5219) * Added Plotly- graph_objects .Surface() [Term Entry] * Add example image link and housekeeping * Addressed review comments for PR #5198 * Addressed review comments for PR #5198 * Addressed review comments for PR #5198 * Add concept entry for simialr to * Revert "Add concept entry for simialr to" This reverts commit b73cada3908ab7c1f5a0ec849e5b60d8880d48ff. * Update content/plotly/concepts/graph-objects/terms/surface/surface.md Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> * minor change to title changed title to maintain consistency * changes post review-2 * updated the file --------- --- .../graph-objects/terms/surface/surface.md | 70 ++++++++++++++++++ media/3d-surface-example-plotly.png | Bin 0 -> 66564 bytes 2 files changed, 70 insertions(+) create mode 100644 content/plotly/concepts/graph-objects/terms/surface/surface.md create mode 100644 media/3d-surface-example-plotly.png diff --git a/content/plotly/concepts/graph-objects/terms/surface/surface.md b/content/plotly/concepts/graph-objects/terms/surface/surface.md new file mode 100644 index 00000000000..f32f464a03e --- /dev/null +++ b/content/plotly/concepts/graph-objects/terms/surface/surface.md @@ -0,0 +1,70 @@ +--- +Title: '.Surface()' +Description: 'Creates a 3d plot using the `Surface` class of the `graph_objects` module in Plotly' +Subjects: + - 'Data Science' + - 'Data Visualization' +Tags: + - 'Plotly' + - 'Graphs' + - 'Data' + - 'Values' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' +--- + +The **`Surface`** class creates a 3D surface plot using Plotly's `graph_objects` module. It allows for the visualization of data in three dimensions. This class enables the rendering of surfaces defined by `x`, `y`, and `z` coordinates, and can be customized with various parameters like colors, scales, and more to represent complex datasets. + +## Syntax + +```pseudo +plotly.graph_objects.Surface( + z=None, # 2D array-like, required. + x=None, # 1D array-like, optional. + y=None, # 1D array-like, optional. + colorscale=None, # list of tuples or named color scale, optional. + cmin=None, # float, optional. + cmax=None, # float, optional. + opacity=None, # float between 0 and 1, optional. + surfacecolor=None, # 2D array-like, optional. + **kwargs +) +``` + +- `z`: It defines the surface's `Z` coordinates (height/depth). +- `x`: It represents the `X` coordinates. If not provided, it defaults to the range of the number of columns in `z`. +- `y`: It represents the `Y` coordinates. If not provided, it defaults to the range of the number of rows in `z`. +- `colorscale`: Can be a named colour scale (e.g., `'Viridis'`) or a list of tuples that define custom colour mapping (optional). +- `cmin`: Minimum value of the colorscale range (optional). +- `cmax`: Maximum value of the colorscale range (optional). +- `opacity`: A float between 0 (completely transparent) and 1 (fully opaque), defining surface opacity (optional). +- `surfacecolor`: A 2D array of values used to colour the surface independent of the Z axis (optional). + +## Example + +This code creates a 3D surface plot using Plotly's `Surface` class from the `graph_objects` module. It defines a mathematical function $f(x, y) = x^2 + y^2$, where `x` and `y` form a mesh grid, and `z` represents the height of the surface: + +```py +import plotly.graph_objects as go +import numpy as np + +x = np.linspace(-5, 5, 50) +y = np.linspace(-5, 5, 50) +x, y = np.meshgrid(x, y) +z = x**2 + y**2 + +fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)]) + +fig.update_layout(title='3D Surface Plot of f(x, y) = x^2 + y^2', + scene=dict( + xaxis_title='X', + yaxis_title='Y', + zaxis_title='f(x, y)' + )) +fig.show() +``` + +The above code generates the following output: + +![Output from above code](https://raw.githubusercontent.com/Codecademy/docs/main/media/3d-surface-example-plotly.png) diff --git a/media/3d-surface-example-plotly.png b/media/3d-surface-example-plotly.png new file mode 100644 index 0000000000000000000000000000000000000000..9acd5f18314e46cf74c497d59744c5a85df17dec GIT binary patch literal 66564 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 literal 0 HcmV?d00001 From 52a8efe464b5ac3735682a291f01b7661cee6ea6 Mon Sep 17 00:00:00 2001 From: Albert Berezvay <98382874+A-Berezvay@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:26:05 +0100 Subject: [PATCH 104/108] Refactor RegExp Documentation: Fix Typos and Enhance Formatting; (#5449) * Refactor RegExp Documentation: Fix Typos and Enhance Formatting; * Minor fixes * Change ```pseudo codeblock to ```js * change ```pseudo to ```js "codeblock" * Update regexp.md Fixed minor issues like adding line breaks and updating example headings to example 1 and example 2. * Update regexp.md fixed formating issues * Update regexp.md fixed lint issue * Lint --------- --- content/javascript/concepts/regexp/regexp.md | 102 +++++++++---------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/content/javascript/concepts/regexp/regexp.md b/content/javascript/concepts/regexp/regexp.md index c86165a9a28..540a26f2c03 100644 --- a/content/javascript/concepts/regexp/regexp.md +++ b/content/javascript/concepts/regexp/regexp.md @@ -1,6 +1,6 @@ --- Title: 'RegExp' -Description: 'The RegExp object is used for matching strings with Regular Expressions, which is a special string pattern that uses various character sequences to match a character sequence or pattern in other strings.' +Description: 'A RegExp object defines patterns for matching and manipulating strings in JavaScript.' Subjects: - 'Web Development' - 'Computer Science' @@ -12,53 +12,53 @@ CatalogContent: - 'paths/create-a-back-end-app-with-javascript' --- -The `RegExp` object is used for matching strings with Regular Expressions. A Regular Expression is a special string, called a pattern, that uses various character sequences to define the characteristics to match a character sequence within another string. +The `RegExp` object defines patterns for matching and manipulating strings in JavaScript. Regular Expressions perform pattern-based searches, replacements, or any other operations on strings. A `RegExp` object can also have flags set along with a pattern to change how matches are performed. ## Syntax -There are two methods of creating a `RegExp` object. The first method is literal notation using slashes to delimit the pattern, followed by any flags. The second method uses the `RegExp` constructor which takes the pattern as the first argument and any flags as the second. +There are two ways to create a `RegExp` object: -```pseudo -// Using literal notation +- Literal Notation: Use slashes to delimit the pattern, followed by any flags. + +```js let re1 = /foo?/i; +``` -// Using RegExp constructor -let re2 = new RegExp('foo?', 'i'); +- Constructor Function: Use the `RegExp` constructor, passing the pattern as the first argument and any flags as the second. -// Both create a RegExp object with a pattern = "foo?" and a flag = "i" +```js +let re2 = new RegExp('foo?', 'i'); ``` -There is a difference between the methods. Literal notation compiles when the expression is evaluated. It should be used when the pattern will remain constant, so it won't be recompiled unnecessarily, such as in a loop. +There is a difference between the methods. Literal notation compiles when the expression is evaluated. It should be used when the pattern will remain constant so it won't be recompiled unnecessarily, such as in a loop. -Using the object constructor means the expression will be compiled at runtime. It should be used when the pattern of the `RegExp` object would be subject to change, or the pattern is obtained during runtime, such as from user input. +Using the object constructor means the expression will be compiled at runtime. It should be used when the pattern of the `RegExp` object is subject to change or is obtained during runtime, such as from user input. -### RegExp Properties +### Properties -| Property | Description | -| ------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| `.flags` | Returns a string containing the flags of the `RegExp` object. | -| `.dotAll` | Does `.` match newlines or not? | -| `.global` | Does the `RegExp` object test against all matches in a string, or only the first? | -| `.hasIndices` | Does the Regular Expression result expose the start and end indices of captured substrings? | -| `.ignoreCase` | Does the `RegExp` object ignore case when performing a match? | -| `.multiline` | Does the `RegExp` object perform matches across multiple lines? | -| `.source` | The text of the pattern used by the `RegExp` object. | -| `.sticky` | Is the search sticky? (Does the next match have to occur at `lastIndex`, or can we match the next occurrence after `lastIndex`?) | -| `.unicode` | Are Unicode features enabled? | -| `.lastIndex` | The index at which to start the next match. | +| Property | Description | +| ------------- | ------------------------------------------------------------------------------------- | +| `.flags` | Returns a string containing the flags of the `RegExp` object. | +| `.dotAll` | Indicates if `.` matches newlines. | +| `.global` | Indicates if the `RegExp` searches for all matches. | +| `.hasIndices` | Does the Regular Expression result expose captured substrings' start and end indices? | +| `.ignoreCase` | Indicates if the `RegExp` is case-insensitive. | +| `.multiline` | Indicates if the `RegExp` performs multiline matches. | +| `.source` | The text of the pattern used by the `RegExp` object. | +| `.sticky` | Indicates if the `RegExp` only matches from `lastIndex`. | +| `.unicode` | Indicates if the `RegExp` treats patterns as Unicode sequences. | +| `.lastIndex` | The index to start the next match. | -### RegExp Methods +### Methods -| Method | Description | -| ------------ | ------------------------------------------------ | -| `.exec(str)` | Execute a search on its `str` string parameter. | -| `.test(str)` | Tests for a match in its `str` string parameter. | +- `.exec(str)`: Executes a search for a match in the given string and returns an array of results. +- `.test(str)` Tests whether a pattern is found in the given string and returns `true` or `false`. -### String Methods that Can Use RegExp Objects +### String Methods Supporting RegExp -In the following `re` is a `RegExp` object. +In the following, `re` is a `RegExp` object. | Method | Description | | ---------------------- | ------------------------------------------------------------------ | @@ -70,20 +70,20 @@ In the following `re` is a `RegExp` object. \* The RegExp object must have the `g` flag set or an exception is thrown. -### `RegExp` Flags +### RegExp Flags -When specified, these flags change the default match behavior of the `RegExp` object. +`RegExp` flags modify the default matching behaviour. -| Flag | Description | -| ---- | ------------------------------------------------------------------------ | -| `g` | Performs a global match, finding all matches rather than just the first. | -| `i` | Makes matches case-insensitive. Matches both uppercase and lowercase. | -| `m` | Performs multiline matches. (Changes behavior of `^`,`$`) | -| `s` | Allows `.` to match newline characters. | -| `u` | Enables Unicode support. | -| `y` | Matches are sticky, looking only at exact position in the text. | +| Flag | Description | +| ---- | --------------------------------------------------------------------- | +| `g` | Finds all matches, not just the first one. | +| `i` | Makes matches case-insensitive. Matches both uppercase and lowercase. | +| `m` | Performs multiline matches. (Changes behavior of `^`,`$`) | +| `s` | Allows `.` to match newline characters. | +| `u` | Enables Unicode support. | +| `y` | Matches are sticky, looking only at exact position in the text. | -Usage: +#### Example 1 ```js let re1 = /foo?/gim; @@ -100,12 +100,12 @@ The following characters are used to define a Regular Expression string. The following match the boundaries between characters, not the characters themselves. -| Characters | Meaning | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `^` | Matches the beginning of input. In multiline search, matches immediately after a line break character. | -| `$` | Matches the end of input. In multiline search matches immediately before a line break character. | -| `\b` | Matches a word boundary. Point where a word character is not followed by a word character, or the point where a word character is not preceded by another word character | -| `\B` | Matches a non-word boundary. Point where preceding and following character are of the same type. | +| Characters | Meaning | +| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `^` | Matches the beginning of input. In multiline search, matches immediately after a line break character. | +| `$` | Matches the end of input. In multiline search, matches immediately before a line breaks character. | +| `\b` | Matches a word boundary. The point where a word character is not followed by a word character or the point where a word character is not preceded by another word character | +| `\B` | Matches a non-word boundary. The point where preceding and following characters are of the same type. | The following match a character or expression based on what follows or precedes it. @@ -116,7 +116,7 @@ The following match a character or expression based on what follows or precedes | `(?<=y)x` | Match `x` only if `x` is immediately preceded by `y`. `y` is not part of the match results. | | `(?\\unnnn | Matches a UTF-16 code unit with the value nnnn (four hexadecimal digits). | | `\` | Followed by a special character, means that the character should be matched literally. | -#### Examples +#### Example 3 ```js let str = '2001: A Space Odyssey'; @@ -199,7 +199,7 @@ Indicate groups and ranges of characters to match. \* If the hyphen falls at the start or end of the sequence in brackets, it is treated as a literal hyphen. -#### Examples +#### Example 4 ```js let str = 'Peter Piper picked a peck of pickled peppers.'; @@ -232,7 +232,7 @@ Quantifiers specify the number of characters or expressions to match. By default, these quantifiers are greedy, matching as much of the string as possible. By following the quantifier with `?` (`x*?`) the match will stop at its first occurrence. -#### Examples +#### Example 5 ```js let str = 'Billy bought a bushel of blue balloons.'; From fb7f1e1981f064f834069a8ff20a52a0aa4a16c7 Mon Sep 17 00:00:00 2001 From: Brahim Anjjar <61018662+braanj@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:29:54 +0100 Subject: [PATCH 105/108] New entry mutable variables (#5555) * Update the c# variables concept entry * Revert "Update the c# variables concept entry" This reverts commit 42f045e45d48c059cf0d7e858f01ba5dad78f653. * Docs: add new cpp concept entry term (mutable variables) * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md * Update mutable-variables.md minor fixes and fixed formatting --------- --- .../mutable-variables/mutable-variables.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md diff --git a/content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md b/content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md new file mode 100644 index 00000000000..0fd6abb2588 --- /dev/null +++ b/content/cpp/concepts/variables/terms/mutable-variables/mutable-variables.md @@ -0,0 +1,99 @@ +--- +Title: 'Mutable Variables' +Description: 'Mutable variables are variables that can be modified even within constant functions.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Functions' + - 'Values' + - 'Variable Types' + - 'Variables' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, **mutable variables** are variables that can be modified even within constant functions, useful for managing internal state flexibly. + +## Syntax + +To declare a variable as mutable, the `mutable` keyword needs to be placed before the variable type: + +```pseudo +mutable type name; +``` + +- `type`: The type of the variable (e.g., `int`, `char`). +- `name`: The name of the variable. + +## Example + +In the example below, `accessCount` is marked `mutable`, allowing it to be modified within the constant `displayData()` function: + +```cpp +#include +#include + +class Data { +public: + Data(std::string value) : data(value), accessCount(0) {} + + void displayData() const { + ++accessCount; // Modification allowed due to 'mutable' + std::cout << "Data: " << data << ", Access count: " << accessCount << std::endl; + } + +private: + std::string data; + mutable int accessCount; // Can be modified in constant methods +}; + +int main() { + Data d("Sample"); + d.displayData(); + d.displayData(); + return 0; +} +``` + +The above code produces the following output: + +```shell +Data: Sample, Access count: 1 +Data: Sample, Access count: 2 +``` + +Here, even though `displayData()` is a constant member function, `accessCount` can be incremented due to its `mutable` declaration. + +## Codebyte Example + +The following codebyte example demonstrates the usage of mutable variables: + +```codebyte/cpp +#include + +class Counter { +public: + Counter() : count(0) {} + + void increment() const { + ++count; // 'count' is mutable, so this modification is allowed in this constant method + } + + int getCount() const { + return count; + } + +private: + mutable int count; +}; + +int main() { + Counter counter; + counter.increment(); + counter.increment(); + std::cout << "Count: " << counter.getCount() << std::endl; + return 0; +} +``` From 6ffe7dc5ee0d5da9b4b240a6431a5d5842eb9600 Mon Sep 17 00:00:00 2001 From: ebikatsudon <99709771+ebikatsudon@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:48:29 -0800 Subject: [PATCH 106/108] C# Strings .Concat() Entry (#5603) * added count function entry * minor edits * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * Update content/cpp/concepts/maps/terms/count/count.md * added example output * minor wording change * Update count.md minor fixes * added concat.md file * updated code example * deleted extraneous lines * Delete content/cpp/concepts/maps/terms/count/count.md * attempted to fix formatting issues * Update concat.md * Update concat.md minor fixes --------- --- .../concepts/strings/terms/concat/concat.md | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 content/c-sharp/concepts/strings/terms/concat/concat.md diff --git a/content/c-sharp/concepts/strings/terms/concat/concat.md b/content/c-sharp/concepts/strings/terms/concat/concat.md new file mode 100644 index 00000000000..f6ee8142195 --- /dev/null +++ b/content/c-sharp/concepts/strings/terms/concat/concat.md @@ -0,0 +1,72 @@ +--- +Title: '.Concat()' +Description: 'Combines two or more strings together into a single string.' +Subjects: + - 'Code Foundations' + - 'Computer Science' +Tags: + - 'Methods' + - 'Lists' + - 'Loops' + - 'Strings' +CatalogContent: + - 'learn-c-sharp' + - 'paths/computer-science' +--- + +The **`.Concat()`** [method](https://www.codecademy.com/resources/docs/c-sharp/methods) combines strings by appending one string to the end of another. This method is similar in function to using the `+` or `+=` [operator](https://www.codecademy.com/resources/docs/c-sharp/operators) to concatenate strings, though the compiler handles those operators differently for optimization in certain scenarios. + +## Syntax + +```pseudo +string.Concat(string1, string2, ...) +``` + +- `string1, string2, ...`: The strings that will be concatenated together. + +## Example + +The following example uses the `.Concat()` method to combine three strings: + +```cs +using System; + +public class ConcatMethod +{ + public static void Main() + { + string firstString = "Hello"; + string secondString = "World!"; + string fullSentence = string.Concat(firstString, " ", secondString); + Console.WriteLine(fullSentence); + } +} +``` + +This results in the following output: + +```shell +Hello World! +``` + +## Codebyte Example + +The below codebyte example demonstrates how `.Concat()` can be used with a `foreach` [loop](https://www.codecademy.com/resources/docs/c-sharp/loops) to iterate through a list and output multiple concatenated strings: + +```codebyte/csharp +using System; +using System.Collections.Generic; + +public class ConcatMethod +{ + public static void Main() + { + List usernames = new List { "Alice", "Bob", "Charlie" }; + foreach (string user in usernames) + { + string greeting = string.Concat("Hi there ", user, ", how can I help you?"); + Console.WriteLine(greeting); + } + } +} +``` From e1a7ef0c0beae0fadd73ff3551a3f8d32d6064dc Mon Sep 17 00:00:00 2001 From: NeemaJoju Date: Fri, 15 Nov 2024 13:30:29 +0530 Subject: [PATCH 107/108] Added file on take() (#5612) * Added file on take() * changes resolved * Update take.md minor fixes --------- --- .../tensor-operations/terms/take/take.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 content/pytorch/concepts/tensor-operations/terms/take/take.md diff --git a/content/pytorch/concepts/tensor-operations/terms/take/take.md b/content/pytorch/concepts/tensor-operations/terms/take/take.md new file mode 100644 index 00000000000..3bf135c5f79 --- /dev/null +++ b/content/pytorch/concepts/tensor-operations/terms/take/take.md @@ -0,0 +1,50 @@ +--- +Title: '.take()' +Description: 'Returns a 1D tensor containing elements from input at the specified indices.' +Subjects: + - 'AI' + - 'Data Science' +Tags: + - 'AI' + - 'Arrays' + - 'Data Structures' + - 'Deep Learning' +CatalogContent: + - 'intro-to-py-torch-and-neural-networks' + - 'paths/computer-science' +--- + +The **`.take()`** function returns a 1D tensor containing elements from the given tensor at the specified indices. The resulting tensor will always be a 1D tensor irrespective of the size of the given tensor. + +## Syntax + +```pseudo +torch.take(input,index) +``` + +- `input`: The input tensor from which the elements will be selected. +- `index`: A 1D tensor containing the indices of the elements to extract from `input`. + +## Example + +The following example demonstrates the usage of `.take()` function: + +```py +import torch + +# Define a tensor +data = torch.tensor([[4, 2, -1], [7, 8, 0]]) + +# Define indices as a tensor +indices = torch.tensor([0, 2, 5]) + +# Use torch.take with data and indices +result = torch.take(data, indices) +print(result) +``` + +The code produces the following output: + +```shell +[4,-1,0] +``` From d548fd875db07565c86ba33ffe38431bbc8e9783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=88=98=EB=AF=BC?= <162391624+LilyS222@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:29:08 +0900 Subject: [PATCH 108/108] add concept entry for c++ size map (#5608) * add concept entry for c++ size map * Update size.md * Update size.md fixed formatting and minor changes * Update size.md * Update size.md fixed formatting --------- --- content/cpp/concepts/maps/terms/size/size.md | 70 ++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 content/cpp/concepts/maps/terms/size/size.md diff --git a/content/cpp/concepts/maps/terms/size/size.md b/content/cpp/concepts/maps/terms/size/size.md new file mode 100644 index 00000000000..08ff43a5469 --- /dev/null +++ b/content/cpp/concepts/maps/terms/size/size.md @@ -0,0 +1,70 @@ +--- +Title: '.size()' +Description: 'Determines the number of elements in a map.' +Subjects: + - 'Computer Science' + - 'Game Development' +Tags: + - 'Elements' + - 'Map' + - 'OOP' + - 'Objects' +CatalogContent: + - 'learn-c-plus-plus' + - 'paths/computer-science' +--- + +In C++, the **`.size()`** [method](https://www.codecademy.com/resources/docs/cpp/methods) is used to determine the number of elements in a map. + +## Syntax + +```pseudo +mapName.size(); +``` + +- `mapName`: The map object for which the size is to be checked. + +## Example + +The following example uses `.size()` to get the number of elements in `myMap`: + +```cpp +#include +#include + +int main() { + std::map myMap; + myMap[1] = "apple"; + myMap[2] = "banana"; + myMap[3] = "cherry"; + + std::cout << "The map contains " << myMap.size() << " elements."; +} +``` + +The output of the above code will be: + +```shell +The map contains 3 elements. +``` + +## Codebyte Example + +The below example demonstrates the usage of the `.size()` method with two maps, `vehicles` and `fruits`: + +```codebyte/cpp +#include +#include +#include +using namespace std; + +int main() { + // Initializing maps with items + map vehicles {{1, "Car"}, {2, "Motorcycle"}, {3, "Bicycle"}, {4, "Bus"}, {5, "Airplane"}}; + map fruits{{1, "apple"}, {5, "banana"}, {6, "strawberry"}}; + + // Printing the size of each map + cout << "The number of vehicles: " << vehicles.size() << endl; + cout << "The number of fruits: " << fruits.size() << endl; +} +```