diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
index 04f2611d67b..f00a2b28af0 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
@@ -89,7 +89,7 @@ reRegex.lastIndex = 0;
assert(!reRegex.test('1 2 3'));
```
-你的正則表達式不應匹配字符串 `10 10 10`。
+你的正則表達式應該匹配字符串 `10 10 10`。
```js
reRegex.lastIndex = 0;
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
index 40bdd3decf7..0b1bee7e332 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/reuse-patterns-using-capture-groups.md
@@ -89,7 +89,7 @@ reRegex.lastIndex = 0;
assert(!reRegex.test('1 2 3'));
```
-你的正则表达式不应匹配字符串 `10 10 10`。
+你的正则表达式应该匹配字符串 `10 10 10`。
```js
reRegex.lastIndex = 0;
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md
index a8afa6f0890..08ab5b8d8fc 100644
--- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md
@@ -11,14 +11,14 @@ Así está mejor, pero el precio no se quedó en la derecha. Esto se debe a que
# --hints--
-La propiedad `width` del selector de clase `.flavor` debe tener un valor dé `50%`.
+La propiedad `width` del selector de clase `.flavor` debe tener un valor de `50%`.
```js
const flavorWidth = new __helpers.CSSHelp(document).getStyle('.flavor')?.getPropertyValue('width');
assert(flavorWidth === '50%');
```
-La propiedad `width` del selector de clase `.price` debe tener un valor dé `50%`.
+La propiedad `width` del selector de clase `.price` debe tener un valor de `50%`.
```js
const priceWidth = new __helpers.CSSHelp(document).getStyle('.price')?.getPropertyValue('width');
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866dd0d0275f01d4d847.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866dd0d0275f01d4d847.md
index 621ce3a42a1..4f495b30673 100644
--- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866dd0d0275f01d4d847.md
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866dd0d0275f01d4d847.md
@@ -7,9 +7,9 @@ dashedName: step-40
# --description--
-Bueno, eso no funcionó. Cambiar los elementos `p` a `inline-block` y colocarlos en líneas diferentes crea un espacio extra a la derecha del primer elemento `p`, haciendo que el segundo se mueva a la siguiente línea. Una forma de arreglar esto, es hacer que el ancho (width) de cada elemento de `p` un poco menor que `50%`.
+Bueno, eso no funcionó. Cambiar los elementos `p` a `inline-block` y colocarlos en líneas diferentes crea un espacio extra a la derecha del primer elemento `p`, haciendo que el segundo se mueva a la siguiente línea. Una forma de arreglar esto, es hacer que el ancho (width) de cada elemento `p` sea un poco menor que `50%`.
-Cambia el valor de la propiedad `width` a `49%` para cada selector de clase para ver qué sucede.
+Cambia el valor de la propiedad `width` a `49%` en cada clase para ver qué sucede.
# --hints--
diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md
index ec1c022f21d..5d1ad914d65 100644
--- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md
+++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md
@@ -7,7 +7,7 @@ dashedName: step-1
# --description--
-Los elemento HTML tienen etiquetas de apertura, como `
` y etiquetas de cierre, como `
`.
+Los elementos HTML tienen etiquetas de apertura como `
` y etiquetas de cierre como `
`.
Encuentra el elemento `h1` y cambia su texto a:
@@ -17,7 +17,7 @@ Asegúrate de que el texto esté entre las etiquetas de apertura y cierre.
# --hints--
-El texto `CatPhotoApp` debe estar presente en el código. Talvez deberías revisar tu ortografía.
+El texto `CatPhotoApp` debe estar presente en el código. Tal vez deberías revisar tu ortografía.
```js
assert(code.match(/catphotoapp/i));
diff --git a/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md b/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
new file mode 100644
index 00000000000..f89be515412
--- /dev/null
+++ b/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
@@ -0,0 +1,88 @@
+---
+id: 56533eb9ac21ba0edf2244e2
+title: Construye un cifrado César
+challengeType: 5
+forumTopicId: 16003
+dashedName: build-a-caesars-cipher
+---
+
+# --description--
+
+Uno de los cifrados más simples y conocidos es el cifrado César, también conocido como cifrado por desplazamiento. En un cifrado por desplazamiento los significados de las letras se desplazan por una cantidad determinada de letras.
+
+Un uso moderno común es el cifrado ROT13, donde los valores de las letras son desplazados por 13 lugares. Así `A ↔ N`, `B ↔ O` y así sucesivamente.
+
+Escriba una función que reciba una cadena codificada en ROT13 como entrada y devuelva una cadena decodificada.
+
+Todas las letras estarán en mayúsculas. No transforme ningún carácter no alfabético (espacios, puntuación, por ejemplo), pero si aplíquele el desplazamiento.
+
+# --hints--
+
+`rot13("SERR PBQR PNZC")` debe decodificarse en la cadena `FREE CODE CAMP`
+
+```js
+assert(rot13('SERR PBQR PNZC') === 'FREE CODE CAMP');
+```
+
+`rot13("SERR CVMMN!")` debe decodificarse en la cadena `FREE PIZZA!`
+
+```js
+assert(rot13('SERR CVMMN!') === 'FREE PIZZA!');
+```
+
+`rot13("SERR YBIR?")` debe decodificarse en la cadena `FREE LOVE?`
+
+```js
+assert(rot13('SERR YBIR?') === 'FREE LOVE?');
+```
+
+`rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.")` debe decodificarse en la cadena `THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.`
+
+```js
+assert(
+ rot13('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.') ===
+ 'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function rot13(str) {
+ return str;
+}
+
+rot13("SERR PBQR PNZC");
+```
+
+# --solutions--
+
+```js
+var lookup = {
+ 'A': 'N','B': 'O','C': 'P','D': 'Q',
+ 'E': 'R','F': 'S','G': 'T','H': 'U',
+ 'I': 'V','J': 'W','K': 'X','L': 'Y',
+ 'M': 'Z','N': 'A','O': 'B','P': 'C',
+ 'Q': 'D','R': 'E','S': 'F','T': 'G',
+ 'U': 'H','V': 'I','W': 'J','X': 'K',
+ 'Y': 'L','Z': 'M'
+};
+
+function rot13(encodedStr) {
+ var codeArr = encodedStr.split(""); // String to Array
+ var decodedArr = []; // Your Result goes here
+ // Only change code below this line
+
+ decodedArr = codeArr.map(function(letter) {
+ if(lookup.hasOwnProperty(letter)) {
+ letter = lookup[letter];
+ }
+ return letter;
+ });
+
+ // Only change code above this line
+ return decodedArr.join(""); // Array to String
+}
+```
diff --git a/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md b/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md
new file mode 100644
index 00000000000..20d96f7a4b4
--- /dev/null
+++ b/curriculum/challenges/espanol/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md
@@ -0,0 +1,252 @@
+---
+id: aa2e6f85cab2ab736c9a9b24
+title: Construye una caja registradora
+challengeType: 5
+forumTopicId: 16012
+dashedName: build-a-cash-register
+---
+
+# --description--
+
+Diseña una función `checkCashRegister()` que acepte el precio de compra como primer argumento (`price`), la cantidad pagada como segundo argumento (`cash`), y el dinero en efectivo que tiene la caja (`cid`) como tercer argumento.
+
+`cid` es un arreglo 2D que enumera las monedas disponibles.
+
+La función `checkCashRegister()` siempre debe devolver un objeto con una clave `status` y una clave `change`.
+
+Devuelve `{status: "INSUFFICIENT_FUNDS", change: []}` si el efectivo en caja es menor que el cambio necesario, o si no puedes devolver el cambio exacto.
+
+Devuelve `{status: "CLOSED", change: [...]}` si el efectivo en caja como valor de la clave `change` es igual al cambio que se debe entregar.
+
+En cualquier otro caso, devuelve `{status: "OPEN", change: [...]}`, con el cambio a entregar en monedas y billetes, ordenados de mayor a menor, como valor de la clave `change`.
+
+
Unidad Monetaria
Importe
Centavo
$0.01 (CENTAVO)
Níquel
$0.05 (NÍQUEL)
Díez Centavos
$0.1 (DÍEZ CENTAVOS)
25 centavos
$0.25 (QUARTER)
Dólar
$1 (UNO)
Cinco dólares
$5 (CINCO)
Diez dólares
$10 (DÍEZ)
Veinte dólares
$20 (VEINTE)
Cien dólares
$100 (CIEN)
+
+Vea a continuación un ejemplo de un arreglo de efectivo en caja:
+
+```js
+[
+ ["PENNY", 1.01],
+ ["NICKEL", 2.05],
+ ["DIME", 3.1],
+ ["QUARTER", 4.25],
+ ["ONE", 90],
+ ["FIVE", 55],
+ ["TEN", 20],
+ ["TWENTY", 60],
+ ["ONE HUNDRED", 100]
+]
+```
+
+# --hints--
+
+`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` debe devolver un objeto.
+
+```js
+assert.deepEqual(
+ Object.prototype.toString.call(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ])
+ ),
+ '[object Object]'
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` debe devolver `{status: "OPEN", change: [["QUARTER", 0.5]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ]),
+ { status: 'OPEN', change: [['QUARTER', 0.5]] }
+);
+```
+
+`checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` debe devolver `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(3.26, 100, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ]),
+ {
+ status: 'OPEN',
+ change: [
+ ['TWENTY', 60],
+ ['TEN', 20],
+ ['FIVE', 15],
+ ['ONE', 1],
+ ['QUARTER', 0.5],
+ ['DIME', 0.2],
+ ['PENNY', 0.04]
+ ]
+ }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` debe devolver `{status: "INSUFFICIENT_FUNDS", change: []}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.01],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ { status: 'INSUFFICIENT_FUNDS', change: [] }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` debe devolver `{status: "INSUFFICIENT_FUNDS", change: []}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.01],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 1],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ { status: 'INSUFFICIENT_FUNDS', change: [] }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` debe devolver `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.5],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ {
+ status: 'CLOSED',
+ change: [
+ ['PENNY', 0.5],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]
+ }
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function checkCashRegister(price, cash, cid) {
+ let change;
+ return change;
+}
+
+checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
+```
+
+# --solutions--
+
+```js
+const denom = [
+ { name: "ONE HUNDRED", val: 100 },
+ { name: "TWENTY", val: 20 },
+ { name: "TEN", val: 10 },
+ { name: "FIVE", val: 5 },
+ { name: "ONE", val: 1 },
+ { name: "QUARTER", val: 0.25 },
+ { name: "DIME", val: 0.1 },
+ { name: "NICKEL", val: 0.05 },
+ { name: "PENNY", val: 0.01 },
+];
+
+function checkCashRegister(price, cash, cid) {
+ const output = { status: null, change: [] };
+ let change = cash - price;
+ const register = cid.reduce(
+ function (acc, curr) {
+ acc.total += curr[1];
+ acc[curr[0]] = curr[1];
+ return acc;
+ },
+ { total: 0 }
+ );
+ if (register.total === change) {
+ output.status = "CLOSED";
+ output.change = cid;
+ return output;
+ }
+ if (register.total < change) {
+ output.status = "INSUFFICIENT_FUNDS";
+ return output;
+ }
+ const change_arr = denom.reduce(function (acc, curr) {
+ let value = 0;
+ while (register[curr.name] > 0 && change >= curr.val) {
+ change -= curr.val;
+ register[curr.name] -= curr.val;
+ value += curr.val;
+ change = Math.round(change * 100) / 100;
+ }
+ if (value > 0) {
+ acc.push([curr.name, value]);
+ }
+ return acc;
+ }, []);
+ if (change_arr.length < 1 || change > 0) {
+ output.status = "INSUFFICIENT_FUNDS";
+ return output;
+ }
+ output.status = "OPEN";
+ output.change = change_arr;
+ return output;
+}
+```
diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
index 002237ffc8b..13e8a1e89ad 100644
--- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
+++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
@@ -21,12 +21,12 @@ const arr = [
[[10, 11, 12], 13, 14]
];
-arr[3];
-arr[3][0];
-arr[3][0][1];
+const subarray = arr[3];
+const nestedSubarray = arr[3][0];
+const element = arr[3][0][1];
```
-`arr[3]` è `[[10, 11, 12], 13, 14]`, `arr[3][0]` è `[10, 11, 12]`, e `arr[3][0][1]` è `11`.
+In quest'esempio, `subarray` ha il valore `[[10, 11, 12], 13, 14]`, `nestedSubarray` ha il valore `[10, 11, 12]` e `element` ha il valore `11`.
**Nota:** Non ci dovrebbero essere spazi tra il nome dell'array e le parentesi quadre, come `array [0][0]` e anche questo non è permesso: `array [0] [0]`. Anche se JavaScript è in grado di elaborarlo correttamente, questo potrebbe confondere altri programmatori che leggono il tuo codice.
diff --git a/curriculum/challenges/italian/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md b/curriculum/challenges/italian/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md
index c68081bb85e..4a045d58510 100644
--- a/curriculum/challenges/italian/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md
+++ b/curriculum/challenges/italian/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md
@@ -309,7 +309,7 @@ async (getUserInput) => {
};
```
-Una richiesta `GET` a `/api/users/:id/logs` restituisce un oggetto utente con un arraa `log` di tutti gli esercizi aggiunti.
+Una richiesta `GET` a `/api/users/:_id/logs` restituisce un oggetto utente con un array `log` di tutti gli esercizi aggiunti.
```js
async(getUserInput) => {
@@ -353,7 +353,7 @@ async(getUserInput) => {
};
```
-Ogni elemento nell'array `log` restituito da `GET /api/users/:id/logs` è un oggetto che dovrebbe avere proprietà `description`, `duration`, e `date`.
+Ogni elemento nell'array `log` restituito da `GET /api/users/:_id/logs` è un oggetto che dovrebbe avere proprietà `description`, `duration` e `date`.
```js
async(getUserInput) => {
@@ -400,7 +400,7 @@ async(getUserInput) => {
};
```
-La proprietà `description` di ogni oggetto nell'array `log` restituito da `GET /api/users/:id/logs` dovrebbe essere una stringa.
+La proprietà `description` di ogni oggetto nell'array `log` restituito da `GET /api/users/:_id/logs` dovrebbe essere una stringa.
```js
async(getUserInput) => {
@@ -447,7 +447,7 @@ async(getUserInput) => {
};
```
-La proprietà `duration` di ogni oggetto nell'array `log` restituito da `GET /api/users/:id/logs` dovrebbe essere un numero.
+La proprietà `duration` di ogni oggetto nell'array `log` restituito da `GET /api/users/:_id/logs` dovrebbe essere un numero.
```js
async(getUserInput) => {
@@ -494,7 +494,7 @@ async(getUserInput) => {
};
```
-La proprietà `date` di ogni oggetto nell'array `log` restituito da `GET /api/users/:id/logs` dovrebbe essere una stringa. Usa il formato `dateString` dell'API `Date`.
+La proprietà `date` di ogni oggetto nell'array `log` restituito da `GET /api/users/:_id/logs` dovrebbe essere una stringa. Usa il formato `dateString` dell'API `Date`.
```js
async(getUserInput) => {
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-strategies.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-strategies.md
index 995e0600b19..2e6907f7127 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-strategies.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-strategies.md
@@ -10,7 +10,7 @@ dashedName: authentication-strategies
Una strategia è un modo di autenticare un utente. Puoi utilizzare una strategia per permettere agli utenti di autenticarsi basandosi su informazioni salvate localmente (se li si fa prima registrare/iscrivere), o da una varietà di fornitori come Google o GitHub. Per questo progetto, usiamo il middleware Passport. Passport fornisce un set di strategie completo che supporta l'autenticazione usando username e password, GitHub, Google, e altri.
-Aggiungi `passport-local@~1.0.0` come dipendenza ed aggiungilo al tuo server come segue: `const LocalStrategy = require('passport-local');`
+`passport-local@~1.0.0` è già stato aggiunto come dipendenza, quindi aggiungilo al tuo server come segue: `const LocalStrategy = require('passport-local');`
Ora, dovrai dire a passport di **usare** un oggetto LocalStrategy istanziato con alcune impostazioni definite. Assicurati che questo (come tutto da questo punto in poi) sia compreso all'interno della connessione al database dato che si basa su di essa!
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md
index 9f1108a116f..3bd0e39f9e0 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md
@@ -10,7 +10,7 @@ dashedName: authentication-with-socket-io
Al momento, non puoi determinare chi sia connesso alla tua socket web. `req.user` contiene l'oggetto utente, ma solo quando l'utente interagisce con il server web. Con le web sockets non hai `req` (richiesta) e di conseguenza, nessun dato utente. Un modo per risolvere il problema di sapere chi sia connesso alla tua web socket è di analizzare e decodificare il cookie che contiene la sessione passport, per poi deserializzarlo e ottenere l'oggetto utente. Fortunatamente, c'è un pacchetto su NPM fatto per questo, che trasforma un compito una volta complesso, in qualcosa di semplice!
-Aggiungi `passport.socketio@~3.7.0`, `connect-mongo@~3.2.0`, e `cookie-parser@~1.4.5` come dipendenze e richiedile rispettivamente come `passportSocketIo`, `MongoStore`, e `cookieParser`. Inoltre, dobbiamo inizializzare un nuovo archivio di memoria da `express-session` che abbiamo richiesto in precedenza. Dovrebbe assomigliare a questo:
+`passport.socketio@~3.7.0`, `connect-mongo@~3.2.0` e `cookie-parser@~1.4.5` sono già stati aggiunti come dipendenze. Richiedili rispettivamente come `passportSocketIo`, `MongoStore` e `cookieParser`. Inoltre, dobbiamo inizializzare un nuovo archivio di memoria da `express-session` che abbiamo richiesto in precedenza. Dovrebbe assomigliare a questo:
```js
const MongoStore = require('connect-mongo')(session);
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/hashing-your-passwords.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/hashing-your-passwords.md
index 5cf1a66afe1..87921822b29 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/hashing-your-passwords.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/hashing-your-passwords.md
@@ -10,7 +10,7 @@ dashedName: hashing-your-passwords
Tornando alla sezione sulla sicurezza delle informazioni, potresti ricordare che memorizzare le password non è *mai* una buona cosa. Ora è tempo di implementare BCrypt per risolvere questo problema.
-Aggiungi `bcrypt@~5.0.0` come dipendenza, e richiedilo nel tuo server. Dovrai gestire l'hashing in 2 aree chiave: dove gestisci la registrazione/salvataggio di un nuovo account, e quando controlli per vedere se una password è corretta al momento dell'accesso.
+`bcrypt@~5.0.0` è già stato aggiunto come dipendenza, quindi richiedilo nel tuo server. Dovrai gestire l'hashing in 2 aree chiave: dove gestisci la registrazione/salvataggio di un nuovo account, e quando controlli per vedere se una password è corretta al momento dell'accesso.
Attualmente sul nostro percorso di registrazione, inserisci la password di un utente nel database in questo modo: `password: req.body.password`. Un modo semplice per implementare il salvataggio di un hash invece è quello di aggiungere quanto segue prima della logica del database `const hash = bcrypt.hashSync(req.body.password, 12);`, e sostituire `req.body.password` nel database salvando solo `password: hash`.
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
index e842fcd4a59..ec88c22a04a 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
@@ -8,7 +8,7 @@ dashedName: implementation-of-social-authentication-ii
# --description--
-L'ultima parte della configurazione dell'autenticazione con GitHub è creare la strategia stessa. Per questo, è necessario aggiungere la dipendenza di `passport-github@~1.1.0` al tuo progetto e richiederlo nel tuo `auth.js` come `GithubStrategy` così: `const GitHubStrategy = require('passport-github').Strategy;`. Non dimenticare di richiedere e configurare `dotenv` per utilizzare le variabili d'ambiente.
+L'ultima parte della configurazione dell'autenticazione con GitHub è creare la strategia stessa. `passport-github@~1.1.0` è già stato aggiunto come dipendenza, quindi richiedilo nel file `auth.js` come `GithubStrategy` in questo modo: `const GitHubStrategy = require('passport-github').Strategy;`. Non dimenticare di richiedere e configurare `dotenv` per utilizzare le variabili d'ambiente.
Per impostare la strategia GitHub, devi dire al Passport di utilizzare un `GitHubStrategy` istantanziato, che accetta 2 argomenti: un oggetto (contenente `clientID`, `clientSecret`, e `callbackURL`) e una funzione da chiamare quando un utente viene autenticato con successo, che determinerà se l'utente è nuovo e quali campi salvare inizialmente nell'oggetto database dell'utente. Questo è comune in molte strategie, ma alcune possono richiedere ulteriori informazioni, come indicato nel README di quella specifica strategia GitHub. Ad esempio, Google richiede anche un *ambito* che determina il tipo di informazioni che la tua richiesta sta chiedendo di ricevere e chiede all'utente di approvare tale accesso.
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/serialization-of-a-user-object.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/serialization-of-a-user-object.md
index 7868baefa56..c14a8de5796 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/serialization-of-a-user-object.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/serialization-of-a-user-object.md
@@ -12,7 +12,7 @@ La serializzazione e la deserializzazione sono concetti importanti per quanto ri
Per configurarlo correttamente, dobbiamo avere una funzione di serializzazione e una funzione di deserializzazione. In Passport, li creiamo con `passport.serializeUser( OURFUNCTION )` e `passport.deserializeUser( OURFUNCTION )`
-`serializeUser` è chiamato con 2 argomenti, l'oggetto utente completo e una callback utilizzata da passport. Una chiave univoca per identificare quell'utente deve essere restituita nella callback, quello più semplice da usare è l'`_id` dell'utente nell'oggetto. Esso dovrebbe essere unico dato che è stato generato da MongoDB. Allo stesso modo, anche `deserializeUser` viene chiamato con quella chiave e una funzione callback per passport, ma questa volta dobbiamo prendere quella chiave e restituire l'intero oggetto utente alla callback. Per creare una query di ricerca per un `_id` Mongo, dovrai creare `const ObjectID = require('mongodb').ObjectID;`, e poi per usarlo invocare `new ObjectID(THE_ID)`. Assicurati di aggiungere `mongodb@~3.6.0` come dipendenza. Puoi vederlo negli esempi qui sotto:
+`serializeUser` è chiamato con 2 argomenti, l'oggetto utente completo e una callback utilizzata da passport. Una chiave univoca per identificare quell'utente deve essere restituita nella callback, quello più semplice da usare è l'`_id` dell'utente nell'oggetto. Esso dovrebbe essere unico dato che è stato generato da MongoDB. Allo stesso modo, anche `deserializeUser` viene chiamato con quella chiave e una funzione callback per passport, ma questa volta dobbiamo prendere quella chiave e restituire l'intero oggetto utente alla callback. Per creare una query di ricerca per un `_id` Mongo, dovrai creare `const ObjectID = require('mongodb').ObjectID;`, e poi per usarlo invocare `new ObjectID(THE_ID)`. `mongodb@~3.6.0` è già stato aggiunto come dipendenza. Puoi vederlo negli esempi qui sotto:
```js
passport.serializeUser((user, done) => {
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md
index 6e60de3cb60..9fff315c67c 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md
@@ -18,15 +18,15 @@ Quando hai finito, assicurati che una demo funzionante del tuo progetto sia ospi
Un modello di motore ti permette di utilizzare file di template statici (come quelli scritti in *Pug*) nella tua app. Al runtime, il template engine sostituisce le variabili in un file modello con valori effettivi che possono essere forniti dal tuo server. Quindi trasforma il template in un file HTML statico che viene inviato al client. Questo approccio facilita la progettazione di una pagina HTML e permette di visualizzare le variabili sulla pagina senza dover effettuare una chiamata API dal client.
-Aggiungi `pug@~3.0.0` come dipendenza nel tuo file `package.json`.
+`pug@~3.0.0` è già stato installato ed elencato come dipendenza nel file `package.json`.
Express deve sapere quale templare engine si sta utilizzando. Utilizzeremo il metodo `set` per assegnare `pug` come valore di `view engine` della proprietà: `app.set('view engine', 'pug')`
-La tua pagina non verrà caricata finché non esegui correttamente il rendering del file index nella directory `views/pug`.
+La tua pagina sarà vuota finché non esegui correttamente il rendering del file index nella directory `views/pug`.
-Modifica l’argomento della dichiarazione `res.render()` nella rotta `/` in modo che sia il percorso di file per la directory `views/pug`. Il percorso può essere un percorso relativo (relativo alle viste), o un percorso assoluto, e non richiede un'estensione del file.
+Per renderizzare il modello `pug`, hai bisogno di usare `res.render()` nella rotta `/`. Passa il percorso del file alla directory `views/pug` come argomento del metodo. Il percorso può essere un percorso relativo (relativo a views), o un percorso assoluto, e non richiede un'estensione del file.
-Se tutto è andato come previsto, la tua home page dell'app smetterà di mostrare il messaggio "`Pug template is not defined.`" e ora mostrerà un messaggio che indica che hai reso con successo il modello Pug!
+Se tutto è andato come previsto, la tua home page dell'app non sarà più vuota e mostrerà un messaggio che indica che il rendering del modello Pug è avvenuto con successo!
Invia la tua pagina quando pensi che sia corretto. Se stai avendo errori, puoi vedere il progetto completato fino a questo punto.
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-passport.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-passport.md
index 6a9a242edce..75c06e189f2 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-passport.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-passport.md
@@ -8,11 +8,9 @@ dashedName: set-up-passport
# --description--
-È ora di configurare *Passport* così da permettere finalmente ad un utente di registrarsi od accedere ad un account! In aggiunta a Passport, useremo Express-session per gestire le sessioni. Usare questo middleware salva l'id di sessione come cookie nel client e permettere di accedere ai dati di sessione usando quell'id sul server. In questo modo teniamo informazioni personali dell'account al di fuori del cookie usato dal client per verificare con il server di essere autenticato e teniamo solo la *key* per accedere ai dati immagazzinati nel server.
+È ora di configurare *Passport* così da permettere finalmente ad un utente di registrarsi od accedere ad un account! In aggiunta a Passport, useremo Express-session per gestire le sessioni. Express-session ha un sacco di funzionalità avanzate che puoi usare ma per ora useremo solo le basi! Usare questo middleware salva l'id di sessione come cookie nel client e permette di accedere ai dati di sessione usando quell'id sul server. In questo modo teniamo informazioni personali dell'account al di fuori del cookie usato dal client per verificare con il server di essere autenticato e teniamo solo la *key* per accedere ai dati immagazzinati nel server.
-Per configurare Passport per usarlo nel tuo progetto dovrai prima aggiungerlo come dipendenza nel tuo package.json. `passport@~0.4.1`
-
-In aggiunta, aggiungi anche Express-session come dipendenza. Express-session ha un sacco di feature avanzate che puoi usare ma per ora useremo solo le basi! `express-session@~1.17.1`
+`passport@~0.4.1` e `express-session@~1.17.1` sono già installati e sono entrambi elencati come dipendenze nel tuo file `package.json`.
Ora dovrai configurare le impostazioni della sessione e inizializzare Passport. Assicurati di creare prima le variabili 'session' e 'passport' per richiedere rispettivamente 'express-session' e 'passport'.
@@ -57,7 +55,7 @@ Passaport e Express-session dovrebbero essere dipendenze.
);
```
-Le dipendenze dovrebbero essere correttamente richieste.
+Le dipendenze dovrebbero essere richieste correttamente.
```js
(getUserInput) =>
@@ -103,7 +101,7 @@ Express app dovrebbe utilizzare nuove dipendenze.
);
```
-La sessione e il segreto di sessione dovrebbero essere impostate correttamente.
+La sessione e il segreto di sessione dovrebbero essere impostati correttamente.
```js
(getUserInput) =>
diff --git a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
index 2ef18d20690..5b4ee40ed8b 100644
--- a/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
+++ b/curriculum/challenges/italian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
@@ -10,7 +10,7 @@ dashedName: set-up-the-environment
Le seguenti sfide utilizzeranno il file `chat.pug`. Così, nel tuo file `routes.js`, aggiugi una rotta GET che punta a `/chat` che fa uso di `ensureAuthenticated`, e fa il rendering di `chat.pug`, con `{ user: req.user }` passato come argomento alla risposta. Adesso, modifica la rotta esistente `/auth/github/callback` per impostare il `req.session.user_id = req.user.id` e reindirizzare a `/chat`.
-Aggiungi `socket.io@~2.3.0` come dipendenza e richiedila/instanziala nel server definito come segue, con `http` (che è già integrato in Nodejs):
+`socket.io@~2.3.0` è già stato aggiunto come dipendenza, quindi richiedilo nel tuo server come segue con `http` (integrato in Nodejs):
```javascript
const http = require('http').createServer(app);
diff --git a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md
index 45cd705d34e..1ec0a9e4061 100644
--- a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md
+++ b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md
@@ -13,7 +13,8 @@ Lavorerai a Video corso Python for Everybody (14 ore)
-- Video corso Learn Python (10 ore)
+
+- Come analizzare i dati con Python Pandas (10 ore)
# --instructions--
diff --git a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md
index 5aab64edbc1..9f6df7e8d88 100644
--- a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md
+++ b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md
@@ -12,8 +12,9 @@ Lavorerai a Video corso Python for Everybody (14 ore)
-- Video corso Learn Python
+- Video corso Python per tutti(14 ore)
+
+- Come analizzare i dati con Python Pandas (10 ore)
# --instructions--
diff --git a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md
index 3ac07ed901d..c33a96201dc 100644
--- a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md
+++ b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md
@@ -12,8 +12,9 @@ Lavorerai a Video corso Python for Everybody (14 ore)
-- Video corso Learn Python
+- Video corso Python per tutti(14 ore)
+
+- Come analizzare i dati con Python Pandas (10 ore)
# --instructions--
diff --git a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md
index fc2cd00a30e..83a684f8d19 100644
--- a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md
+++ b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md
@@ -12,8 +12,9 @@ Lavorerai a Video corso Python for Everybody (14 ore)
-- Video corso Learn Python
+- Video corso Python for Everybody(14 ore)
+
+- Come analizzare i dati con Python Pandas (10 ore)
# --instructions--
diff --git a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md
index 9d9dd8d1933..7848435370e 100644
--- a/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md
+++ b/curriculum/challenges/italian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md
@@ -12,8 +12,9 @@ Lavorerai a Video corso Python for Everybody (14 ore)
-- Video corso Learn Python
+- Video corso Python per tutti(14 ore)
+
+- Come analizzare i dati con Python Pandas (10 ore)
# --instructions--
diff --git a/curriculum/challenges/italian/09-information-security/information-security-projects/port-scanner.md b/curriculum/challenges/italian/09-information-security/information-security-projects/port-scanner.md
index 534287a3979..39d3ffb23ec 100644
--- a/curriculum/challenges/italian/09-information-security/information-security-projects/port-scanner.md
+++ b/curriculum/challenges/italian/09-information-security/information-security-projects/port-scanner.md
@@ -15,7 +15,9 @@ Stiamo ancora sviluppando la parte didattica interattiva del curriculum di Pytho
- Video corso Python for Everybody (14 ore)
-- Video corso Learn Python (10 ore)
+- Video corso Python Basics in Depth (4 hours)
+
+- Video corso Intermediate Python (6 hours)
# --instructions--
diff --git a/curriculum/challenges/italian/09-information-security/information-security-projects/sha-1-password-cracker.md b/curriculum/challenges/italian/09-information-security/information-security-projects/sha-1-password-cracker.md
index 7f4743e862f..46385e5b453 100644
--- a/curriculum/challenges/italian/09-information-security/information-security-projects/sha-1-password-cracker.md
+++ b/curriculum/challenges/italian/09-information-security/information-security-projects/sha-1-password-cracker.md
@@ -15,7 +15,9 @@ Stiamo ancora sviluppando la parte didattica interattiva del curriculum di Pytho
- Video corso Python for Everybody (14 ore)
-- Video corso Learn Python (10 ore)
+- Video corso Python Basics in Depth (4 hours)
+
+- Video corso Intermediate Python (6 hours)
# --instructions--
diff --git a/curriculum/challenges/italian/10-coding-interview-prep/rosetta-code/24-game.md b/curriculum/challenges/italian/10-coding-interview-prep/rosetta-code/24-game.md
index 6a5fa0dc523..68d1e750690 100644
--- a/curriculum/challenges/italian/10-coding-interview-prep/rosetta-code/24-game.md
+++ b/curriculum/challenges/italian/10-coding-interview-prep/rosetta-code/24-game.md
@@ -39,28 +39,28 @@ Scrivi una funzione che prenda una stringa di quattro cifre come argomento, con
assert(typeof solve24 === 'function');
```
-`solve24("4878")` dovrebbe restituire `(7-8/8)*4` o `4*(7-8/8)`
+`solve24("4878")` dovrebbe restituire `(7-8/8)*4`, `4*(7-8/8)`, o una stringa simile valida
```js
-assert(include(answers[0], removeParentheses(solve24(testCases[0]))));
+assert(isValidSolution_(solve24(testCases_[0])));
```
-`solve24("1234")` dovrebbe restituire un qualsiasi ordine di `1*2*3*4`
+`solve24("1234")` dovrebbe restituire `1*2*3*4` o una stringa simile valida
```js
-assert(include(answers[1], removeParentheses(solve24(testCases[1]))));
+assert(isValidSolution_(solve24(testCases_[1])));
```
-`solve24("6789")` dovrebbe restituire `(6*8)/(9-7)` o `(8*6)/(9-7)`
+`solve24("6789")` dovrebbe restituire `(6*8)/(9-7)`. `(8*6)/(9-7)` o una stringa valida simile
```js
-assert(include(answers[2], removeParentheses(solve24(testCases[2]))));
+assert(isValidSolution_(solve24(testCases_[2])));
```
-`solve24("1127")` dovrebbe restuire una permutazione di `(1+7)*(1+2)`
+`solve24("1127")` dovrebbe restituire `(1+7)*(1+2)` o una stringa simile valida
```js
-assert(include(answers[3], removeParentheses(solve24(testCases[3]))));
+assert(isValidSolution_(solve24(testCases_[3])));
```
# --seed--
@@ -68,56 +68,101 @@ assert(include(answers[3], removeParentheses(solve24(testCases[3]))));
## --after-user-code--
```js
-const testCases = [
+const testCases_ = [
'4878',
'1234',
'6789',
'1127'
];
-const answers = [
- ['(7-8/8)*4', '4*(7-8/8)', '(4-8+7)*8', '(4+7-8)*8', '(7+4-8)*8', '(7-8+4)*8', '8*(4-8+7)', '8*(4+7-8)', '8*(7+4-8)', '8*(7-8+4)'],
- ['1*2*3*4', '1*2*4*3', '1*3*2*4', '1*3*4*2', '1*4*2*3', '1*4*3*2', '2*1*3*4', '2*1*4*3', '2*3*1*4', '2*3*4*1', '2*4*3*1', '2*4*1*3', '3*1*2*4', '3*1*4*2', '3*2*1*4', '3*2*4*1', '3*4*1*2', '3*4*2*1', '4*1*2*3', '4*1*3*2', '4*2*1*3', '4*2*3*1', '4*3*1*2', '4*3*2*1', '(1+2+3)*4', '(1+3+2)*4', '(2+1+3)*4', '(2+3+1)*4', '(3+1+2)*4', '(3+2+1)*4', '4*(1+2+3)', '4*(2+1+3)', '4*(2+3+1)', '4*(3+1+2)', '4*(3+2+1)'],
- ['(6*8)/(9-7)', '(8*6)/(9-7)', '6*8/(9-7)', '8*6/(9-7)'],
- ['(1+7)*(2+1)', '(1+7)*(1+2)', '(1+2)*(1+7)', '(1+2)*(7+1)', '(2+1)*(1+7)', '(7+1)*(2+1)']
-];
-
-function include(ansArr, res) {
- const index = ansArr.indexOf(res);
- return index >= 0;
+const OPERATORS_ = {
+ "+": (a, b) => a + b,
+ "-": (a, b) => a - b,
+ "*": (a, b) => a * b,
+ "/": (a, b) => a / b,
}
-//The main method for detecting single parentheses
-function removeParentheses(ans) {
- for (let i = 0; i < ans.length; i++) {
- if (!isNaN(ans[i])) {
- ans = removeParenthesesHelper(ans, i);
+const PRECIDENCE_ = {
+ "+": 1,
+ "-": 1,
+ "*": 2,
+ "/": 2,
+}
+
+function evaluate_(expression) {
+ expression = expression.replace('/\s+/g', '');
+ const stack = [];
+ let postfix = "";
+
+ // Convert from infix to postfix
+ let head = 0;
+ while (head < expression.length) {
+ let c = expression[head];
+ switch (c) {
+ case "(":
+ stack.push(c);
+ break;
+ case ")":
+ let last = stack.pop();
+ while (last !== "(") {
+ postfix += last;
+ last = stack.pop();
+ }
+ break;
+ case "+":
+ case "-":
+ case "*":
+ case "/":
+ while (stack.length &&
+ PRECIDENCE_[c] <= PRECIDENCE_[stack[stack.length-1]]) {
+ postfix += stack.pop();
+ }
+ stack.push(c);
+ break;
+ case "0":
+ case "1":
+ case "2":
+ case "3":
+ case "4":
+ case "5":
+ case "6":
+ case "7":
+ case "8":
+ case "9":
+ postfix += c;
+ break;
+ default:
+ return false;
+ }
+ head++;
+ }
+
+ // Clear out stack
+ while (stack.length) {
+ postfix += stack.pop();
+ }
+
+ // Evaluate postfix
+ for (let c of postfix) {
+ switch (c) {
+ case "+":
+ case "-":
+ case "*":
+ case "/":
+ const b = +stack.pop();
+ const a = +stack.pop();
+ stack.push(OPERATORS_[c](a, b));
+ break;
+ default:
+ stack.push(c);
}
}
- return ans;
+ return stack.pop();
}
-//Helper to remove left and right parantheses
-function removeParenthesesHelper(ans, i) {
- while (i > 0 && i < ans.length - 1) {
- if (ans[i - 1] === '(' && ans[i + 1] === ')') {
- //Paranthesis detected. Remove them.
- ans = replaceChar(ans, '', i - 1);
- ans = replaceChar(ans, '', i);
- i--;
- } else {
- return ans;
- }
- }
- return ans;
-}
-
-//Replace a character at a given index for the provided character
-function replaceChar(origString, replaceChar, index) {
- let firstPart = origString.substr(0, index);
- let lastPart = origString.substr(index + 1);
- let newString = firstPart + replaceChar + lastPart;
- return newString;
+// Check solution validity
+function isValidSolution_(userSolution) {
+ return evaluate_(userSolution) === 24;
}
```
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md
index 6edbfc08306..0884a8fedb4 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md
@@ -16,8 +16,6 @@ California
USA
```
-Puoi farci un salto, ma potresti non trovare nulla...
-
# --hints--
Dovresti aggiungere il testo qui sopra inclusi i tag ` ` all'elemento `address`.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3cade9fa77275d9f4efe62.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3cade9fa77275d9f4efe62.md
index 5977886e1d3..fb87effeb1a 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3cade9fa77275d9f4efe62.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3cade9fa77275d9f4efe62.md
@@ -9,7 +9,7 @@ dashedName: step-41
Ha funzionato, ma c'è ancora un po' di spazio a destra del prezzo.
-Potresti continuare a provare diverse percentuali per le larghezze. Invece, puoi semplicemente spostare l'elemento `p` relativo al prezzo in modo che sia sulla stessa riga assicurandoti che non ci sia spazio tra di loro.
+Potresti continuare a provare diverse percentuali per le larghezze. Invece, usa il tasto back space della tastiera per spostare l'elemento `p` con la classe `price` affianco all'elemento `p` con la classe `flavor` in modo che siano sulla stessa riga nell'editor. Assicurati che non ci sia uno spazio tra i due elementi.
# --hints--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c7e645d8e905819f1dd4.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c7e645d8e905819f1dd4.md
index 473ca04a89d..38f38a308e5 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c7e645d8e905819f1dd4.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c7e645d8e905819f1dd4.md
@@ -7,7 +7,7 @@ dashedName: step-1
# --description--
-Inizia con il testo HTML standard. Aggiungi la dichiarazione `DOCTYPE`, l'elemento `html`, l'elemento `head` e l'elemento `body`.
+Inizia con il testo HTML standard. Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html` (specificando che la pagina è in inglese), `head` e `body`.
Aggiungi l'elemento `meta` per il `charset` corretto, l'elemento `title` e un elemento `link` per il file `./styles.css`.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695ab9f6ffe951c16d03dd.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695ab9f6ffe951c16d03dd.md
index 47df80849ac..8a1cb46f5db 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695ab9f6ffe951c16d03dd.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695ab9f6ffe951c16d03dd.md
@@ -35,10 +35,46 @@ Dovresti avere un tag `body` di chiusura.
assert(code.match(/<\/body\s*>/i));
```
-Gli elementi `head` e `body` dovrebbero essere "fratelli".
+Dovrebbe esserci solo un tag di apertura `head`.
```js
-assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+assert(code.match(//ig).length === 1);
+```
+
+Dovrebbe esserci solo un tag di chiusura `head`.
+
+```js
+assert(code.match(/<\/head\s*>/ig).length === 1);
+```
+
+Dovrebbe esserci solo un tag di apertura `body`.
+
+```js
+assert(code.match(//ig).length === 1);
+```
+
+Dovrebbe esserci solo un tag di chiusura `body`.
+
+```js
+assert(code.match(/<\/body\s*>/ig).length === 1);
+```
+
+L'elemento `head` dovrebbe essere vuoto.
+
+```js
+assert(code.match(/\s*<\/head\s*>/i));
+```
+
+L'elemento `body` dovrebbe essere vuoto.
+
+```js
+assert(code.match(/\s*<\/body\s*>/i));
+```
+
+L'elemento `body` dovrebbe essere posizionato dopo l'elemento `head`.
+
+```js
+assert(code.match(/<\/head\s*>\s*/i));
```
L'elemento `head` dovrebbe essere all'interno dell'elemento `html`.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764c602bee6974e7790f35.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764c602bee6974e7790f35.md
index e14cff209b0..7895c993dc2 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764c602bee6974e7790f35.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764c602bee6974e7790f35.md
@@ -7,18 +7,15 @@ dashedName: step-16
# --description--
-A scuola, potresti aver imparato che rosso, giallo e blu sono colori primari e come creare nuovi colori mescolandoli. Tuttavia, questo è un modello obsoleto.
-
-Attualmente esistono due principali modelli dei colori: il modello additivo RGB (rosso, verde, blu) utilizzato nei dispositivi elettronici, e il modello detrattivo CMYK (ciano, magenta, giallo, nero) utilizzato nella stampa. In questo progetto lavorerai con il modello RGB.
-
-Innanzitutto, aggiungi `one` all'attributo `class` del primo elemento `div`.
+Per dare ai pennarelli dei colori diversi, avrai bisogno di dare una classe unica a ognuno di essi. È possibile aggiungere più classi a un elemento elencandole separate uno spazio nell'attributo `class`. Ad esempio, il seguente codice aggiunge entrambe le classi `animal` e `dog` a un elemento `div`.
```html
-
- ...content
-
+
```
+Per iniziare, dovresti aggiungere la classe `one` all'elemento `div` del primo pennarello.
+
+
# --hints--
Dovresti aggiungere la classe `one` al primo elemento `div`.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md
index e5de3a90faa..22ad101ba3e 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md
@@ -7,9 +7,9 @@ dashedName: step-21
# --description--
-Finora hai imparato che il modello dei colori RGB è additivo. Ciò significa che un colore parte come nero, e cambia in base ai diversi livelli di rosso, verde e blu introdotti.
+Esistono due principali modelli dei colori: il modello additivo RGB (rosso, verde, blu) utilizzato nei dispositivi elettronici, e il modello detrattivo CMYK (ciano, magenta, giallo, nero) utilizzato nella stampa.
-La funzione CSS `rgb` è un modo semplice di visualizzare quest'aspetto.
+In questo progetto lavorerai con il modello RGB. Ciò significa che un colore parte come nero, e cambia in base ai diversi livelli di rosso, verde e blu introdotti. La funzione CSS `rgb` è un modo semplice di visualizzare quest'aspetto.
Crea una nuova regola CSS che seleziona la classe `container` e assegna alla sua proprietà `background-color` il valore `rgb(0, 0, 0)` che corrisponde al nero.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md
index 066dd266c17..41cd24b991f 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md
@@ -7,7 +7,7 @@ dashedName: step-5
# --description--
-Al di sotto dell'`header`, crea un nuovo elemento `div` e assegnagli la classe `gallery`.
+Al di sotto dell'elemento `.header`, crea un nuovo elemento `div` con un attributo `class` del valore di `gallery`. Questo `div` fungerà da contenitore per le immagini della galleria.
In quest'elemento `.gallery`, crea nove elementi `img`.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md
index f28992dcf37..669b50687f1 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md
@@ -7,7 +7,7 @@ dashedName: step-1
# --description--
-Inizia con il testo HTML standard. Aggiungi una dichiarazione `DOCTYPE`, un elemento `html`, un elemento `head` e un elemento `body`.
+Inizia con il testo HTML standard. Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html` (specificando che la pagina è in inglese), `head` e `body`.
All'interno dell'elemento `head`, aggiungi un tag `` con il valore appropriato dell'attributo `charset` e un tag `` per la responsività mobile.
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md
index 830e2e1f7cd..8e92596b633 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md
@@ -9,7 +9,7 @@ dashedName: step-1
Creerai un pinguino felice che saluta e in questo processo esplorerai ulteriormente le trasformazioni e le animazioni in CSS.
-Comincia con il testo HTML standard. Includi la dichiarazione `DOCTYPE`, l'elemento `html`, i tag `meta` appropriati, gli elementi `head`, `body` e `title`. Inoltre, collega il foglio di stile alla pagina.
+Comincia con il testo HTML standard. Includi la dichiarazione `DOCTYPE`, l'elemento `html` con la lingua impostata sull'inglese, i tag `meta` appropriati, gli elementi `head`, `body` e `title`. Inoltre, collega il foglio di stile alla pagina.
# --hints--
@@ -95,25 +95,28 @@ assert.isAtLeast(title?.textContent?.length, 1);
Il codice dovrebbe avere un elemento `link`.
```js
-assert(/[\w\W\s]*[\w\W\s]*<\/head>/i))
+assert(code.match(/[\w\W\s]*[\w\W\s]*<\/head>/i));
```
L'elemento `link` dovrebbe avere un attributo `rel` con il valore `stylesheet`.
```js
-assert.match(code, /\n\s{6}/)
+ .match(/<\/h2>\s*\n\s{6}/)
);
```
@@ -76,10 +76,10 @@ assert(
);
```
-Il tag di apertura `p` dovrebbe avere la stessa indentazione dell'elemento `h1` e del commento. Il suo tag di apertura dovrebbe iniziare a 6 spazi dall'inizio della riga.
+Il tag di apertura `p` dovrebbe avere la stessa indentazione dell'elemento `h2` e del commento. Il suo tag di apertura dovrebbe iniziare a 6 spazi dall'inizio della riga.
```js
-assert(code.toLowerCase().match(/-->\n\s{6}
/));
```
# --seed--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md
index 4be0fc09131..435bf484b8e 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md
@@ -7,7 +7,7 @@ dashedName: step-12
# --description--
-Dato che il progetto prevede tre sezioni distinte nel modulo, aggiungi tre elementi `fieldset` all'interno dell'elemento `form`.
+Dato che il modulo avrà tre sezioni distinte, aggiungi tre elementi `fieldset` all'interno dell'elemento `form`.
# --hints--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md
index 3ae1fd7e0fe..309e744cc30 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md
@@ -7,7 +7,7 @@ dashedName: step-15
# --description--
-Poiché i `label` sono elementi `inline` come impostazione predefinita, appaiono sulla stessa riga del testo corrispondente. Per farli apparire su righe separate, aggiungi `display: block` all'elemento `label`, e aggiungi una proprietà `margin` con il valore `0.5rem 0`, per separarli gli uni dagli altri.
+Visto che gli elementi `label` sono inline di default, vengono visualizzati affiancati sulla stessa riga, rendendo il testo poco leggibile. Per farli apparire su righe separate, aggiungi `display: block` all'elemento `label`, e aggiungi una proprietà `margin` con il valore `0.5rem 0`, per separarli gli uni dagli altri.
# --hints--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md
index 05c720c156c..4438a08a765 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md
@@ -9,7 +9,7 @@ dashedName: step-56
Infine, dovresti separare il pulsante Submit dal `fieldset` superiore e regolare la sua larghezza minima a `300px`.
-Cambia la proprietà `margin` per aggiungere `1em` in alto e in basso, e imposta la larghezza come descritto sopra.
+Cambia la proprietà `margin` per aggiungere `1em` in alto e in basso, lasciando i margini di destra e sinistra impostati su `auto`. Quindi imposta la larghezza come descritto sopra.
# --hints--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md
index de37697e1bc..9cedd1176e3 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md
@@ -7,7 +7,9 @@ dashedName: step-1
# --description--
-Imposta il tuo HTML con gli elementi `DOCTYPE`, `html`, `head` e `body`. Dai all'elemento `head` gli appropriati elementi `meta` per `charset` e `viewport`, un elemento `title` con un titolo appropriato e un elemento `link` per il foglio di stile.
+Imposta il tuo HTML con gli elementi `DOCTYPE`, `html` indicando che il documento è in inglese, `head` e `body`.
+
+Dai all'elemento `head` gli appropriati elementi `meta` per `charset` e `viewport`, un elemento `title` con un titolo appropriato e un elemento `link` per il foglio di stile.
# --hints--
@@ -23,7 +25,7 @@ Il codice dovrebbe avere un elemento `html`.
assert.equal(document.querySelectorAll('html')?.length, 1);
```
-L'elemento `html` dovrebbe avere una tag di apertura con un attributo `lang` di `en`.
+L'elemento `html` dovrebbe avere una tag di apertura con un attributo `lang` del valore di `en`.
```js
assert(code.match(//gi));
@@ -60,7 +62,7 @@ const meta = document.querySelectorAll('meta');
assert.equal(meta?.length, 2);
```
-Un elemento `meta` dovrebbe avere un attributo `name` impostato su `viewport` e un attributo `content` impostato su `width=device-width, initial-scale=1.0`.
+Un elemento `meta` dovrebbe avere un attributo `name` con valore di `viewport` e un attributo `content` con valore di `width=device-width, initial-scale=1.0`.
```js
const meta = [...document.querySelectorAll('meta')];
@@ -68,7 +70,7 @@ const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getA
assert.exists(target);
```
-L'altro elemento `meta` dovrebbe avere l'attributo `charset` impostato su `UTF-8`.
+L'altro elemento `meta` dovrebbe avere l'attributo `charset` con valore di `UTF-8`.
```js
const meta = [...document.querySelectorAll('meta')];
@@ -96,7 +98,7 @@ Il codice dovrebbe avere un elemento `link`.
assert(/[\w\W\s]*[\w\W\s]*<\/head>/i))
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md
index c02a54e110f..2d4df93f4e7 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md
@@ -7,7 +7,9 @@ dashedName: step-1
# --description--
-Inizia a scrivere la struttura HTML di base. Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html`, `head`, `body` e `title`. Aggiungi il testo `Piano` nell'elemento `title`.
+Inizia a scrivere la struttura HTML di base. Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html`, `head`, `body` e `title`.
+
+Imposta la lingua della pagina sull'inglese. Aggiungi il testo `Piano` nell'elemento `title`.
# --hints--
@@ -17,7 +19,7 @@ Il codice dovrebbe contenere il riferimento `DOCTYPE`.
assert(code.match(/`.
assert(code.match(//gi));
```
-L'elemento `html` dovrebbe avere una tag di apertura con un attributo `lang` di `en`.
+L'elemento `html` dovrebbe avere una tag di apertura con un attributo `lang` del valore di `en`.
```js
assert(code.match(//gi));
@@ -53,25 +55,25 @@ La dichiarazione `DOCTYPE` dovrebbe essere all'inizio del tuo HTML.
assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
```
-Dovresti avere un tag `head` di apertura.
+Dovresti avere un tag di apertura `head`.
```js
assert(code.match(/
/i));
```
-Dovresti avere un tag `head` di chiusura.
+Dovresti avere un tag di chiusura `head`.
```js
assert(code.match(/<\/head\s*>/i));
```
-Dovresti avere un tag `body` di apertura.
+Dovresti avere un tag di apertura `body`.
```js
assert(code.match(//i));
```
-Dovresti avere un tag `body` di chiusura.
+Dovresti avere un tag di chiusura `body`.
```js
assert(code.match(/<\/body\s*>/i));
@@ -83,13 +85,13 @@ Gli elementi `head` e `body` dovrebbero essere fratelli.
assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
```
-L'elemento `head` dovrebbe essere all'interno dell'elemento `html`.
+L'elemento `head` dovrebbe trovarsi all'interno dell'elemento `html`.
```js
assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
```
-L'elemento `body` dovrebbe essere all'interno dell'elemento `html`.
+L'elemento `body` dovrebbe trovarsi all'interno dell'elemento `html`.
```js
assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
@@ -102,7 +104,7 @@ const title = document.querySelector('title');
assert.exists(title);
```
-Il progetto dovrebbe avere un titolo di `Piano`.
+Il progetto dovrebbe avere un title del valore di `Piano`.
```js
const title = document.querySelector('title');
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md
index 8c82fed220f..7c393c78ff9 100644
--- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md
+++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md
@@ -9,7 +9,7 @@ dashedName: step-1
Ormai dovresti avere familiarità con gli elementi di base di una pagina HTML.
-Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html`, `head` e `body`.
+Aggiungi la dichiarazione `DOCTYPE` e gli elementi `html` (specificando che la pagina è in inglese), `head` e `body`.
# --hints--
@@ -19,10 +19,10 @@ Il codice dovrebbe includere un tag ``.
assert(code.match(//i));
```
-Il codice dovrebbe avere un elemento `html`.
+Dovresti avere un tag `` di apertura con un attributo `lang` con il valore `en`.
```js
-assert(document.querySelectorAll('html').length === 1);
+assert(code.match(//gi));
```
Il codice dovrebbe avere un elemento `head` all'interno dell'elemento `html`.
diff --git a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
index d370bb3191e..75a3b9645e3 100644
--- a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
+++ b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md
@@ -21,12 +21,12 @@ const arr = [
[[10, 11, 12], 13, 14]
];
-arr[3];
-arr[3][0];
-arr[3][0][1];
+const subarray = arr[3];
+const nestedSubarray = arr[3][0];
+const element = arr[3][0][1];
```
-`arr[3]` は `[[10, 11, 12], 13, 14]`、`arr[3][0]` は `[10, 11, 12]`、`arr[3][0][1]` は `11` になります。
+上の例では、`subarray` の値は `[[10, 11, 12], 13, 14]`、 `nestedSubarray` の値は `[10, 11, 12]`、 `element` の値は `11` となります。
**注:** 「`array [0][0]`」のように、配列名と角括弧 (ブラケット) の間にスペースを入れないでください。また、こうした `array [0] [0]` という記述は使用できません。 JavaScript はこれを正しく処理できますが、このコードを読む他のプログラマーを混乱させる恐れがあります。
diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md
new file mode 100644
index 00000000000..7d74b1442c8
--- /dev/null
+++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md
@@ -0,0 +1,74 @@
+---
+id: 5dfa22d1b521be39a3de7be0
+title: ステップ 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+プレビュー内の画像の隣に、`cat photos` という語が下線付きで表示されています。 これがあなたが作成したリンクです。試しにクリックしても構いません。 では `p` 要素内のテキストについて、`cat photos` という部分を `https://freecatphotoapp.com` へのリンクにしてください。 完了したら、段落の下にある古いアンカータグとテキストを削除してください。
+
+# --hints--
+
+コードにはアンカー (`a`) 要素が 1 つだけ必要です。 余分なアンカー要素は削除してください。
+
+```js
+assert(document.querySelectorAll('a').length === 1);
+```
+
+アンカー (`a`) 要素は `p` 要素内にネストされている必要があります。
+
+```js
+assert($('p > a').length);
+```
+
+リンクの href の値は `https://freecatphotoapp.com` である必要があります。 href の値が設定されていないか、誤字脱字があります。
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.getAttribute('href') === 'https://freecatphotoapp.com'
+);
+```
+
+リンクのテキストは `cat photos` でなければなりません。 テキストに誤字脱字があります。
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.innerText.toLowerCase().replace(/\s+/g, ' ') === 'cat photos'
+);
+```
+
+アンカー (`a`) 要素をネストした後は、ブラウザーに表示される `p` 要素の中身は `Click here to view more cat photos.` だけになるはずです。`p` 要素およびネストされたアンカー要素の、テキスト、スペース、句読点を再確認してください。
+
+```js
+const pText = document
+ .querySelector('p')
+ .innerText.toLowerCase()
+ .replace(/\s+/g, ' ');
+assert(pText.match(/click here to view more cat photos\.?$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+