Harry Potter
ProgramaciónProcesar un array bidimensional
Todo el mundo sabe que el Expreso de Hogwarts sale del andén 9 y 3/4 de la estación de trenes de King’s Cross, en Londres, y llega a al pueblo de Hogsmeade, donde se encuentra el Colegio Hogwarts de Magia y Hechicería. Sin paradas. Del tirón.
Por lo visto, quieren facilitar a sus estudiantes la movilidad entre el colegio y sus localidades de origen sin necesidad de tener que viajar a Londres, así que está montando una aplicación que controle, entre otras cosas, cómo es ese movimiento de pasajeros.
El mismo Albus Dumbledore se puso en contacto conmigo a través de su fénix, Fawkes, para transmitirme una de las funcionalidades que necesitan en su nuevo programa de gestión de trenes.
Señorita Ada:
Necesitamos controlar el número de pasajeros que llegan al final de un trayecto teniendo en cuenta cuántos suben y bajan en cada parada.
Le facilitaremos una lista del tipo: [s1,b1][s2,b2][s3,b3]… donde en cada par de elementos va el número de pasajeros que se suben (s) y el número de pasajeros que se bajan (b). Así, procesando esa lista, sabremos el número de pasajeros finales que debería llegar a fin de trayecto.
Ejemplo de entrada: [7,0][8,2][9,5][3,1]
Ejemplo de salida: 19 pasajeros
* Nota: En el primer par de números, el segundo siempre será 0 porque en la estación de origen no se baja nadie. No hace falta controlar ese número: se lo facilitaremos siempre de manera correcta.
Y cómo no, Edu con sus preguntas:
¿Vas a utilizar un for para recorrer los arrays? ¿O crees que necesitarás dos? ¿Has oído hablar de las funciones reductoras? ¿Los que no somos magos también podemos ir a Hogwarts? ¿Crees que habrá vagón bar en el tren?
Esta vez tenía mucho más clara la propuesta y cómo resolverla… aunque, sin duda, y como siempre… no había una única manera de hacerlo.
¿Tú cómo lo harías? ¡Deja tus ideas en los comentarios!
Y si quieres compartir código, te recomiendo que utilices alguna herramienta online de testing de código como Codepen, JSFiddle, PlayCode, etc. o repositorios como GitHub, GitLab, BitBucket…
Manuel Valenzuela says
solución en SQL SERVER (lenguaje para manipulación de base de datos):
–[7,0][8,2][9,5][3,1]
DECLARE @tblPasajeros AS TABLE
(
id int
, suben int
, bajan int
)
INSERT INTO @tblPasajeros(id, suben, bajan)VALUES(1, 7, 0)
INSERT INTO @tblPasajeros(id, suben, bajan)VALUES(2, 8, 2)
INSERT INTO @tblPasajeros(id, suben, bajan)VALUES(3, 9, 5)
INSERT INTO @tblPasajeros(id, suben, bajan)VALUES(4, 3, 1)
DECLARE
@vuelta INT
, @totalVueltas INT
, @finalPasajeros INT
SET @vuelta = 1
SET @finalPasajeros = 0
SELECT @totalVueltas = COUNT(1) FROM @tblPasajeros
–SELECT @totalVueltas
WHILE @vuelta <= @totalVueltas
BEGIN
SELECT /*id,*/ @finalPasajeros = @finalPasajeros + (suben – bajan) FROM @tblPasajeros WHERE id = @vuelta
SET @vuelta = @vuelta + 1
END
SELECT @finalPasajeros as [Pasajeros Llegan al Final]
Resultado: 19 pasajeros llegan al final.
Ada Lovecode says
¡¡Uau!! Me quito el sombrero, Manuel, no se me habría ocurrido la posibilidad de hacerlo con SQL Server. ¡Mil gracias por tu aporte! 🙂
Manuel Valenzuela says
Gracias por tu comentario, dejo tambien la solución en C# (CSharp), saludos!
Manuel Valenzuela says
using System;
using System.Data;
namespace Pasajeros
{
class Program
{
static void Main(string[] args)
{
// Step 1: get the DataTable.
DataTable data = GetTable();
int finalPasajeros = 0;
// … Loop over all rows.
foreach (DataRow row in data.Rows)
{
// … Write value of first field as integer.
//Console.WriteLine(row.Field(0));
finalPasajeros += Convert.ToInt32(row[1]) – Convert.ToInt32(row[2]);
Console.WriteLine(
Convert.ToInt32(row[1]).ToString() + ” – ” +
Convert.ToInt32(row[2]).ToString() + ” = ” +
(Convert.ToInt32(row[1]) – Convert.ToInt32(row[2])).ToString());
}
Console.WriteLine(finalPasajeros.ToString() + ” Pasajeros Llegan al Final “);
Console.ReadKey();
}
//Fuente Consultada:
//https://www.dotnetperls.com/datatable
static DataTable GetTable()
{
// Step 2: here we create a DataTable.
// … We add 3 columns, each with a Type.
DataTable table = new DataTable();
table.Columns.Add(“id”, typeof(int));
table.Columns.Add(“suben”, typeof(int));
table.Columns.Add(“bajan”, typeof(int));
// [7,0][8,2][9,5][3,1]
// Step 3: here we add 3 rows.
table.Rows.Add(1, 7, 0);
table.Rows.Add(2, 8, 2);
table.Rows.Add(3, 9, 5);
table.Rows.Add(4, 3, 1);
return table;
}
}
}
Ada Lovecode says
¡De 10, qué bien, Manuel! ¡Mil gracias por el aporte! 🙂
Maria del Carmen says
Solución básica usando JavaScript.
data = [
[7,0],
[8,2],
[9,5],
[3,1]
];
const pasajerosFinales =
data.reduce((total, pasajeros) => {
return total += pasajeros[0]-pasajeros[1]
}, 0);
console.log(`El número de pasajeros al final del trajecto es: ${pasajerosFinales}.`);
Ada Lovecode says
¡Buena respuesta, María del Carmen! De hecho, es muy parecida a la solución que os he hecho en el reto resuelto utilizando reduce.
¡Buen trabajo! 🙂
https://didacticode.com/reto-resuelto-harry-potter/
Maria del Carmen says
Que bueno ver todas las maneras de llegar a una misma respuesta. Hoy me puse a darle un poco de forma (y complicarlo :p ). Todavia se puede arreglar mas (por ejemplo, como esta hasta ahora viernes deja que mas pasajeros se bajen de los que hay en el tren), pero me pongo en eso mas adelante. https://codepen.io/santiagocodes/pen/oNbdQma
didacticode says
¡Uau, María del Carmen!
No había visto este comentario ni tu código y ¡¡está muy bien!! No solo desde el punto de vista algorítmico sino también desde el diseño. ¡Buen trabajo!