Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Add challenge-05 solution #78

Merged
merged 2 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions 2024/05-valor-y-referencia/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Reto 05: Valor y referencia

## Enunciado

- Muestra ejemplos de asignación de variables "por valor" y "por referencia", según su tipo de dato.
- Muestra ejemplos de funciones con variables que se les pasan "por valor" y "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas. **(Entender estos conceptos es algo esencial en la gran mayoría de lenguajes)**

DIFICULTAD EXTRA (opcional):

Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente.

- Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas.

Comprueba también que se ha conservado el valor original en las primeras.
72 changes: 72 additions & 0 deletions 2024/05-valor-y-referencia/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/* eslint-disable no-console */

// Ejemplo de asignación por valor para tipos primitivos
const num1 = 10;
let num2 = num1; // Asignación por valor
num2 = 20;

console.log(num1); // Salida: 10 (valor original no cambia)
console.log(num2); // Salida: 20

// Ejemplo de asignación por referencia para objetos
const obj1 = { nombre: 'Juan' };
const obj2 = obj1; // Asignación por referencia
obj2.nombre = 'Carlos';

console.log(obj1.nombre); // Salida: Carlos (el valor original cambia)
console.log(obj2.nombre); // Salida: Carlos

// Ejemplo de función que recibe parámetros por valor
function duplicar(numero) {
numero *= 2;
return numero;
}

const original = 5;
const resultado = duplicar(original);

console.log(original); // Salida: 5 (el valor original no cambia)
console.log(resultado); // Salida: 10

// Ejemplo de función que recibe parámetros por referencia (objeto)
function cambiarNombre(persona) {
persona.nombre = 'Pedro';
}

const personaOriginal = { nombre: 'Juan' };
cambiarNombre(personaOriginal);

console.log(personaOriginal.nombre); // Salida: Pedro (el valor original cambia)

console.log(`${'\n'}${'*'.repeat(50)}${'\n'}`);

// Función que intercambia valores por valor
function intercambiarValoresPorValor(a, b) {
const temp = a;
a = b;
b = temp;
return [a, b];
}

// Función que intercambia valores por referencia
function intercambiarValoresPorReferencia(obj) {
const copia = { ...obj }; // Crear una copia del objeto original
const temp = copia.valor1;
copia.valor1 = copia.valor2;
copia.valor2 = temp;
return copia; // Devolver la copia del objeto modificado
}

// Ejemplos
const valorA = 3;
const valorB = 7;

const [nuevoValorA, nuevoValorB] = intercambiarValoresPorValor(valorA, valorB);
console.log(valorA, valorB); // Salida: 3 7
console.log(nuevoValorA, nuevoValorB); // Salida: 7 3

const valores = { valor1: 10, valor2: 5 };

const nuevosValores = intercambiarValoresPorReferencia(valores);
console.log(valores.valor1, valores.valor2); // Salida: 10 5
console.log(nuevosValores.valor1, nuevosValores.valor2); // Salida: 5 10
71 changes: 71 additions & 0 deletions 2024/05-valor-y-referencia/solution.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Ejemplo de asignación por valor para tipos primitivos
const num1: number = 10;
let num2: number = num1; // Asignación por valor
num2 = 20;

console.log(num1); // Salida: 10 (valor original no cambia)
console.log(num2); // Salida: 20

// Ejemplo de asignación por referencia para objetos
interface Persona {
nombre: string;
}

const obj1: Persona = { nombre: 'Juan' };
const obj2: Persona = obj1; // Asignación por referencia
obj2.nombre = 'Carlos';

console.log(obj1.nombre); // Salida: Carlos (el valor original cambia)
console.log(obj2.nombre); // Salida: Carlos

// Ejemplo de función que recibe parámetros por valor
function duplicar(numero: number): number {
numero *= 2;
return numero;
}

const original: number = 5;
const resultado: number = duplicar(original);

console.log(original); // Salida: 5 (el valor original no cambia)
console.log(resultado); // Salida: 10

// Ejemplo de función que recibe parámetros por referencia (objeto)
function cambiarNombre(persona: Persona): void {
persona.nombre = 'Pedro';
}

const personaOriginal: Persona = { nombre: 'Juan' };
cambiarNombre(personaOriginal);

console.log(personaOriginal.nombre); // Salida: Pedro (el valor original cambia)

console.log(`${'\n'}${'*'.repeat(50)}${'\n'}`);

// Función que intercambia valores por valor
function intercambiarValoresPorValor(a: any, b: any): [any, any] {
const temp = a;
a = b;
b = temp;
return [a, b];
}

// Función que intercambia valores por referencia
function intercambiarValoresPorReferencia(obj: { valor1: any; valor2: any }): { valor1: any; valor2: any } {
const { valor1, valor2 } = obj;
return { valor1: valor2, valor2: valor1 }; // Devolver un nuevo objeto con valores intercambiados
}

// Ejemplos
const valorA: number = 3;
const valorB: number = 7;

const [nuevoValorA, nuevoValorB]: [number, number] = intercambiarValoresPorValor(valorA, valorB);
console.log(valorA, valorB); // Salida: 3 7
console.log(nuevoValorA, nuevoValorB); // Salida: 7 3

const valores: { valor1: number; valor2: number } = { valor1: 10, valor2: 5 };

const nuevosValores: { valor1: number; valor2: number } = intercambiarValoresPorReferencia(valores);
console.log(valores.valor1, valores.valor2); // Salida: 10 5
console.log(nuevosValores.valor1, nuevosValores.valor2); // Salida: 5 10
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ npm run test 'year'/'folder-name'/solution.test.js
| 01 | [Operadores y Estructuras de Control](https://retosdeprogramacion.com/roadmap/) | 🟢 | [Here](https://github.com/marcode24/weekly-challenges/tree/main/2024/01-operadores-y-estructuras-de-control) |
| 02 | [Funciones y alcance](https://retosdeprogramacion.com/roadmap/) | 🟢 | [Here](https://github.com/marcode24/weekly-challenges/tree/main/2024/02-funciones-y-alcance) |
| 03 | [Estructuras de Datos](https://retosdeprogramacion.com/roadmap/) | 🟡 | [Here](https://github.com/marcode24/weekly-challenges/tree/main/2024/03-estructuras-de-datos) |
| 04 | [Cadena de Caracteres](https://retosdeprogramacion.com/roadmap/) | 🟡 | [Here](https://github.com/marcode24/weekly-challenges/tree/main/2024/04-cadena-de-caracteres) |
| 05 | [Valor y Referencia](https://retosdeprogramacion.com/roadmap/) | 🟢 | [Here](https://github.com/marcode24/weekly-challenges/tree/main/2024/05-valor-y-referencia) |

Difficulties legend:
🟢 Easy 🟡 Medium 🔴 Hard
Expand Down
Loading