Skip to content

Instantly share code, notes, and snippets.

@GATEJECA
Last active December 21, 2018 07:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GATEJECA/d08b57e8b0e4aa9c214ce11916995427 to your computer and use it in GitHub Desktop.
Save GATEJECA/d08b57e8b0e4aa9c214ce11916995427 to your computer and use it in GitHub Desktop.
Platzi Reto 5 - Diciembre 20 (2018) Separación y ordenamiento Casas Grinch
<?php
/*
Reto 5 - Diciembre 20 (2018)
https://platzi.com/blog/grinch/
Nombre: Carlos E. Garcia
@GATEJECA
Notas:
1- La separación del archivo CSV es por , y por salto de linea
2- el archivo CSV original tiene un header inicial (ID,Number)
3- los regalos de las casas son enteros (uso int_val)
4- se usó quickSort para ordenar
*/
// Obtengo la información de la fuente y posteriormente se valida
$csv = @file_get_contents("http://i.platzi.com/casa.csv");
if ($csv !== false) {
// Obtengo el contenido de la información (su separación es por , y espacio)
$csvSeparadoArreglos = explode("\n", $csv);
// Obtengo el encabezado para que no interfiera con el ordenamiento
$encabezado = array_shift($csvSeparadoArreglos);
// Encabezados para la descarga del nuevo archivo CSV
header('Content-Description: File Transfer');
header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: inline; filename=CasasGrinchPlatzi.csv');
header('Expires: 0');
header('Pragma: no-cache');
// Pasos de derecha a izquierda
// 1- Otengo el resultado de la funcion quicksort
// 2- vuelvo a unir en un string
// 3- al incio concateno el encabezado original
// 4- se descarga el archivo
echo $encabezado . "\n" . implode("\n", quickSort($csvSeparadoArreglos));
exit;
} else {
echo "Ocurrió un error al obtener la información";
}
function quickSort($lista)
{
// Caso base, si la longitud del arreglo es 0 lo retorno
if (count($lista) <= 1) {
return $lista;
} else {
/*
se selecciona el punto de partida tomando como base la primera posición del arreglo
tomando como partida que nuestro elemento es un string y necesita obtener las casas
que se encuentra en la posición 2 (una vez separado por coma) ejemplo: Casa 1,75741
*/
$elementoInicial = intval(explode(",", $lista[0])[1]);
// se declaran dos arreglos para hacer una particion si es menor o si es mayor
$izquierdo = $derecho = [];
/*
se hace un ciclo for desde el segundo elemento (el primero es el elemento inicial) y se
va comparando cada elemento (haciendo su correspondiente explode para obtener la parte entera)
y dependiendo del resultado se va al arreglo izquierdo (la cantidad es menor) o al derecho
(la canrtidad es mayor)
*/
for ($i = 1; $i < count($lista); $i++) {
if (intval(explode(",", $lista[$i])[1]) < $elementoInicial) {
$izquierdo[] = $lista[$i];
} else {
$derecho[] = $lista[$i];
}
}
/*
por ultimo se hace recursión para los arreglos izquierdo y derecho
hasta que ya no haya comparación y al final se une en un solo arreglo, tomando en cuenta que el ordenamiento es con base en las casas de mayor a menor cantidad de regalos
*/
return array_merge(quickSort($derecho), array($lista[0]), quickSort($izquierdo));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment