Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

04D

20H

38M

34S

88

¿Cómo el Grinch se robó la navidad?

88Puntos

hace 4 años

¡El Grinch odiaba la Navidad! ¡Todo lo relacionado a la Navidad!
Ahora, por favor, no preguntes por qué. Nadie sabe con certeza la razón.
“Ya casi es Navidad, debo encontrar una forma de evitar esta atrocidad.”

Es el momento de probar tus conocimientos y resolver los retos del Grinch para robarte la Navidad.

Desde el 16 hasta el 24 de diciembre publicaremos un reto diario. Tendrás 24 horas para resolverlos y ganarte los regalos que Platzi está guardando para Navidad.

Cambia de regalo esta Navidad con Platzi: regálate aprendizaje a precio especial

“Ya sé exactamente cómo hacerlo!” El Grinch rió con la garganta.
Y confeccionó rápidamente un sombrero de Santa.
"¡Qué gran truco amargado!
Con HTML y CSS lo habré logrado”

Reto #1 - Diciembre 16

Qué debes hacer:

Un gorro de Santa utilizando únicamente HTML y CSS.

Reglas:

1. Utiliza CodePenUna plataforma que te permite probar y compartir proyectos de frontend fácilmente.
2. Comparte el enlace de tu proyecto en twitter mencionando a @platzi y usando el hashtag #regalaconocimiento
3. Tienes 24 horas

Regalo:

  • Badge de el Grinch

Tips:

separador.jpg

Ganador:

Fernando Yerena - Grinch - Christmas Hat

Menciones honoríficas:

Carlos Arenas - Grinch Hat Platzi
Wilmer Vera - Feliz Navidad Platzi
Guillermo Linares - Grinch HTML CSS

“Ahora todo lo que necesito es un reno…"
Eran escasos y no había ninguno para ser amaestrado.
“Eso no me detiene y crearé uno de ser necesario.
No solo uno, una nueva marca de renos que jamás serán olvidados”

Reto #2 - Diciembre 17

Qué debes hacer:

Diseña un sticker de Max (el perro del Grinch) disfrazado de reno. Eres libre de usar cualquier técnica o línea gráfica. Datos interesantes sobre Max

Reglas:

1. Publica el diseño en Instagram tagueando a Platzi y usando el hashtag #regalaconocimiento en el caption del post.
2. Tienes 24 horas

Regalo:

  • Badge de el Grinch + 1 mes de suscripción a Platzi

Tips:

separador.jpg

Ganador(es):

¡Empate en el primer lugar!

Eddy Herrera - Max
Jeffrey Smith - Max odia la navidad

Menciones honoríficas:

Diego Cruz - Max
Pedro Vergara - Max
Guillermo Linares - Max

“Me llevaré el banquete, los presentes y el árbol.
Una lista de tareas y no quedará ni rastro”
Cuando todos despierten la navidad se habrá terminado

Reto 3 - Diciembre 18

Qué debes hacer:

Crea una web app para lista de tareas que no necesite backend. Puedes usar CodePen, Github.io o lo que prefieras.

Reglas:

1. La aplicación debe permitir: escribir una lista de tareas, marcarlas como hechas y borrarlas
2. Publica tu proyecto en Facebook mencionando a Platzi y usando el hashtag #regalaconocimiento
3. Tienes 24 horas

Regalo:

  • Badge de el Grinch + 2 meses de suscripción a Platzi

Tips:

separador.jpg

Ganador:

Santiago Molina - Lista de tareas para arruinar la navidad

Menciones honoríficas:

ELe Estrada - Lista de tareas
Miguel Gamarra - Tareas Navideñas
Traña Michael - Lista de tareas

“¡Adelante!” y el trineo comenzó a bajar hacia las casas de la villa.
Todas iguales, los mismos jardines, puertas y perillas.
“Si entro a una, el pueblo entero habré conquistado”
Concluyó nuestro Santa amargado.

Reto 4 - Diciembre 19

Qué debes hacer:

¿Sabes qué es una expresión regular? Explícalo en un tweet.

Reglas:

1. Publica tu explicación en twitter, menciona a @platzi y usa el hashtag #regalaconocimiento
2. Tienes 24 horas

Regalo:

  • Badge de el Grinch + 3 meses de suscripción a Platzi

Tips:

  • Puedes hacer un hilo, pero es importante mantenerlo corto y concreto.
  • Puedes apoyarte en una infografía o pieza visual diseñada por ti.
  • Lo más importante es que cualquier persona pueda entenderlo.
  • Curso de expresiones regulares
separador.jpg

Ganadores:

Victor Daniel - Expresión regular
Amarilis Alveo - Expresión regular

Menciones honoríficas:

Luis Toro - RegEx
Manuel Aguilera - RegEx
Bibliofilica - RegEx

Mientras todos dormían sin preocupación,
la nieve escondía al más determinado ladrón.
Entre cientos de casas, el malvado Claus buscaba la mejor

Reto 5 - Diciembre 20

Qué debes hacer:

Descarga esta lista de casas (es un archivo .csv) que contiene identificador de casa y el número de regalos que contiene cada una.
Escribe un programa que lea este archivo y ordene las casas de mayor a menor cantidad de regalos y genere otro .csv con el resultado.

Reglas:

1. Puedes utilizar Python, Ruby o PHP.
2.No puedes usar funciones nativas como SORT o similares. El objetivo es que programes el algoritmo.
3. Deja el código en los comentarios de este post.

Regalo:

  • Badge de el Grinch + 4 meses de suscripción a Platzi.
separador.jpg

Ganador:

arnoldochavez

Menciones honoríficas:

carlos_toro_12
osho99

Llenó el trineo con los regalos
¡Sus cintas! ¡Sus envoltorios! ¡Sus etiquetas! ¡Sus guirnaldas!
Escapó entre árboles y zanjas con la carga a sus espaldas

Reto 6 - Diciembre 21

Qué debes hacer:

Descarga estos assets (.zip) y programa un juego tipo Road Fighter o tetris race. Un juego dónde el trineo del Grinch pueda esquivar árboles y recolectar estrellas.

Reglas:

1. Puedes usar cualquier motor de videjuegos o lenguaje.
2. El entregable debe correr en el navegador.
3. Publica el enlace de tu juego en Facebook mencionando a Platzi y usando el hashtag #regalaconocimiento
4. Tienes 24 horas

Tips:

Regalo:

  • Badge de el Grinch + 5 meses de suscripción a Platzi.
separador.jpg

Ganador:

Jorge Andres Bocanegra - Juego

Menciones honoríficas:

Rodney Retros - Juego
Nenu011 - Juego
Willie Velázquez - Juego
Duhamel Guerrero - Juego

“Ahora están descubriendo que ninguna Navidad llegará.
Se están despertando, se quedarán con la boca abierta un minuto o dos.
Luego los Quienes de la Villa llorarán Buaaaa"

Reto 7 - Diciembre 22

Qué debes hacer:

El Grinch está orgulloso del robo. Diseña una imagen para instagram que le cuente al mundo cómo se está robando la navidad de Platzi.

Reglas:

1. Publica el diseño en Instagram tagueando a Platzi y usando el hashtag #regalaconocimiento en el caption del post.
2. Tienes 24 horas

Regalo:

  • Badge de el Grinch + 6 meses de suscripción a Platzi

Tips:

separador.jpg

Ganador:

Janez Campo - Post

Menciones honoríficas:

albertogh_01 - Post

“Estamos cerca Max, no puedes desfallecer”
El pobre perro lo intentaba pero estaba a punto de desmayar,
la pendiente lo sobrepasaba y se acercaba el amanecer.
Si el plan quieren salvar, algo deben descartar.

Reto 8 - Diciembre 23

Qué debes hacer:

Hay 5 cajas con dinero y diferente peso:

Caja A: $100 usd, 40kg
Caja B: $20 usd, 10kg
Caja C: $40 usd, 120kg
Caja D : $20 usd, 20kg
Caja E: $10 usd, 10kg

La bolsa del Grinch tiene una capacidad de 150kg.

Crea el algoritmo que encuentre la combinación de cajas con mayor cantidad de dinero y que no sobrepase la capacidad de la bolsa.

Reglas:

1. Puedes usar cualquier lenguaje de programación.
2. Crea un Gist de Github con tu algoritmo, publica el enlace en twitter, menciona a @platzi y usa el hashtag #regalaconocimiento

Regalo:

  • Badge de el Grinch + 7 meses de suscripción a Platzi

Tips:

  • Dale una mirada al Knapsack problem
separador.jpg

Ganador:

Israel Elias Laura - Platzi boxes

Menciones honoríficas:

William Velazquez - Box.java
German Blandin - Entrada.in
Angel Laguna - Reto8.c
Hugo Belman - platzi.cpp

La última caja entró y la oreja levantó
Un sonido desde la villa llegaba pero no era lo que él esperaba
¡No era triste! ¿Porque aquel sonido no era triste?
¿Será que la navidad persiste?

Reto 9 - Diciembre 24

Qué debes hacer:

Escribe el final de esta historia.

Reglas:

1. Publica el final de la historia en Twitter, menciona a @platzi y usa el hashtag #regalaconocimiento
2. Puedes crear un hilo o usar imágenes. Lo más importante es mantener la línea y estilo narrativo.

Regalo:

  • Badge de el Grinch + 8 meses de suscripción a Platzi

Tips:

Curso de storytelling

separador.jpg

Ganadora:

Bibliofílica - Fin de la historia

Menciones honoríficas:

Sen - No puede ser!
Valeria Salas - Mientras el Grinch…
Omar - El malvado Claus…
Diego Cruz - La última caja entró

Grinch
Grinch
grinch

88Puntos

hace 4 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
9
3947Puntos
System.out.println("Challenge accepted");
8
32431Puntos

“Los árboles tienen una vida secreta que sólo les es dado conocer a los que se trepan a ellos” (Reinaldo Arenas)

Pueden ver a detalle los recorridos de árboles.

Invitados todos a conocer los tipos árboles, la cantidad de aplicaciones de cada uno son incontables.

Árbol binario
<?php

$data = array();
$header = NULL;

//Paso 1. Cargar archivo a un arreglo.
if (($input = fopen("casa.csv", "r")) !== FALSE) {
    while (($line = fgetcsv($input, 20, ",")) !== FALSE) {
        if(!$header)
            $header = $line;
        else
            $data [$line[0]] = $line[1];
    }
    fclose($input);
}
//print_r($data); //Validsar Paso 1.

//Paso 2. Crear arbol binario.
$tree = new Tree();
foreach($data as $key => $value){
    $tree->insertNode(new Node($key,$value));
}
//print_r($tree); //Validar Paso 2.

//Paso 3. Imprime el arbol binario Descendente como "InOrden Invertido" (derecho, raíz, izquierdo).
$dataResult = array();
$output = fopen('casaordenada.csv', 'w');
fputcsv($output, $header);
$tree->reverseInOrdenRoot($dataResult);
foreach($dataResult as $dataValue){
    fputcsv($output, $dataValue);
}
fclose($output);
echo "Reto #5 completado 7:^)";


class Tree {
    public $root;

    //Recorre árbol mientras inserta en función de valores.
    public function insertNode($node){
        $track = &$this->root;
        $pivot;
        while ($track != null){
            $pivot = $track;
            if($node->value < $track->value)
                $track =&$track->leftNode;
            else
                $track =&$track->rightNode;
        }
        if ($this->root == null)
            $this->root = $node;
        else if ($node->value < $pivot->value)
            $pivot->leftNode = $node;
        else //valores duplicados van a la derecha.
            $pivot->rightNode = $node;
    }

    public function reverseInOrdenRoot(&$dataResult){
        $this->reverseInOrden($this->root, $dataResult);
    }
    //Impresión recursiva
    public function reverseInOrden($node, &$dataResult){
        if ($node != null ){
            $this->reverseInOrden($node->rightNode, $dataResult);
            $dataResult[] = array($node->key, $node->value);
            $this->reverseInOrden($node->leftNode, $dataResult);
        }
    }
}

class Node {
    public $key;
    public $value;
    public $leftNode;
    public $rightNode;

    public function __construct($key, $value) {
        $this->key = $key;
        $this->value = $value;
    }
}

?>
7
3836Puntos

Que la fuerza nos acompañe…
Y QUE COMIENCE EL JUEGO

6
3083Puntos

Nunca me cansaré de elogiar la manera en la que Platzi logra motivar el aprendisaje constante de sus estudiantes. Los felicito, simplemente excelente!.

Espero con gran entusiasmo el RETO, y si es en JavaScriptMejor, jajajaja. Saludos!.

1
7206Puntos
4 años

Yo igual espero un reto que sea algún algoritmo o algo de código de por medio…
No sólo diseño…vamos Platzi! Sorprendannos!

5
15780Puntos

Las novenas en Platzi son con retos educativos. Genial.

5
1690Puntos

Que emoción he ganado! 😄 Gracias Platzi, trate de igual manera participar en el del videojuego pero no alcance a terminar a tiempo, saludos!

5
6202Puntos

Hola, me encanta la idea de los retos de grinch. Tengo una idea que quiero compartir.

Que tal si hacen este tipo de retos mas seguidos ? y de premios den punto que puedas canjear
al obtener una cierta cantidad lo puedas canjear por 1 mes de suscripción o incluso 1 semana.
O en su defecto solo puntos del perfil de usuario

4
7206Puntos

Por favor no solo temas de frontend… Tambien pongan algo de backend o algoritmos

4
11117Puntos

Reto + Regalos… La mejor navidad.

4
227Puntos

Para el reto #5 utilicé el método de ordenamiento por inserción el cual mantiene una sublista de items ordenados a medida que se realiza una nueva vuelta del algoritmo.

Excelentes retos!

#!/usr/bin/pythonimport csv

defordenamiento(lista):#generar lista de solo regalos para ser ordenados
    listaReg = []
    for i in range(0,len(lista)):
        listaReg.append(int(lista[i][1]))

    #Ciclo de ordenamientofor i in range(1,len(listaReg)):

        valorActual = listaReg[i]
        valorActualList = lista[i]
        posicion = i

        while posicion>0and listaReg[posicion-1]<valorActual:
            listaReg[posicion]=listaReg[posicion-1]
            lista[posicion] = lista[posicion-1]
            posicion = posicion-1

        listaReg[posicion]=valorActual
        lista[posicion]=valorActualList

if __name__ == "__main__":
    #Leer csv y aignarlo a una lista sin el headerwith open('casa.csv','r') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        headers = [next(reader)]
        lista = list(reader)

    #metodo de ordenamiento
    ordenamiento(lista)

    #Escribir nuevo csv
    listaFinal = headers+lista
    with open('casa_ordenadas.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(listaFinal)

3
23566Puntos

El último reto no hace la cuenta regresiva.

2
11650Puntos
4 años

ya está funcionando correctamente

3
11042Puntos

se equivocarón con la fecha de este reto.

Dice Reto 3 - Diciembre 17

y esa fue la fecha del reto de ayer.

3
7206Puntos

Reto 8!!!

3
23566Puntos
4 años

jajajaja ya he recargado esta página más de 500 veces.

2
7206Puntos
4 años

Soy yo!!! Gracias platzi!!!

3
11042Puntos

muchas gracias Platzi, de corazón muchisimas gracias!!!

3
919Puntos

Los retos están súper buenos, pero me gustaría que siguieran todo el año, no solamente para estas fechas. Gracias Platzi.

3
2147Puntos
4 años

concuerdo, deberian realizar mas retos y como no pueden estar todo el tiempo regalando meses de subscripcion que cada cierta cantidad de retos que completen podrian dar una al usuario claro dependiendo de la dificultad algo similar a un sistema de puntuacion separado de la reputacion

3
13133Puntos

seria también bueno algo con javascript

1
7206Puntos
4 años

y algo de backend… o de algoritmos…

3
3768Puntos

A qué hora salen los ganadores del reto #8?

3
11042Puntos

Querido @grinch
Muchisimas gracias por esta actividad fue bastante divertido.
¿Cuándo y cómo se entregarán los regalos?

2
11650Puntos
4 años

El equipo se está contactando con los ganadores y asignando los premios

3
4325Puntos

Siguiente reto:

Averiguar por qué el Grinch odiaba la Navidad.

4
11650Puntos
4 años

Nadie sabe pero dicen que era porque sus zapatos estaban muy ajustados y su corazón tenía la mitad del tamaño de uno normal 😉

3
612Puntos

Saludos a todos…
Para la solución de este retor #5 utilice el método de ordenamiento QuickSort, código hecho en python.

El método QuickSort permite realizar un ordenamiento mucho más rápido que los método convencionales como inserción, selección y burbuja que se puede observar
aqui. consiste en la implementación de recursividad, funciona perfecto para elementos que estén en total desorden, es por eso que en una cantidad de elementos tan grande como la de este reto es perfecto. Se basa en el famoso principio de divide y vencerás, facilitando el ordenamiento de dos arreglos pequeños de una manera mas rapida que con uno arreglo grande…

De paso Gracias, pero muchas gracias platzi por estos espacios de participación tan geniales, #regalaconocimiento …

''' @__AndresToro
Created By: 
Carlos Andres Toro
    Estudent of System Engineer
    Universiti of Nariño
Country: Colombia
City: Pasto
'''import csv

defpartition_index(arr, low, high):
    pivot = int(arr[high][1])
    i = low-1for j in range(low, high):
        point = int(arr[j][1])
        if point >= pivot:
            i = i+1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return i+1defquick_sort(arr, low, high):if low < high:
        index = partition_index(arr, low, high)
        quick_sort(arr, low, index-1)
        quick_sort(arr, index+1, high)

defsort_array(arr):
    head = arr[0]
    arr = arr[1:]
    n = len(arr)
    quick_sort(arr, 0, n-1)
    # array sorted
    arr.insert(0, head)
    return arr

defread_file_csv():with open('casa.csv') as File:
        reader = csv.reader(File, delimiter=',')
        arr = []
        for row in reader:
            arr.append(row)
    return arr

defwrite_new_file_csv(arr):with open('sort_casa.csv', 'w') as new_file:
        write = csv.writer(new_file)
        write.writerows(arr)

if __name__ == "__main__":
    # read file casa.csv and create arr
    arr = read_file_csv()
    # Sort arr, used QuickSort method
    arr = sort_array(arr)
    # Write a new file sorted
    write_new_file_csv(arr)****
3
6002Puntos

Reto #5 en PHP

<?php

//Variables
$row = 1;
$casas = array();
$filename = "casa.csv";
//Obtener los datos del csv
if (($handle = fopen($filename, "r")) !== FALSE) {
   while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
      $num = count($data);
      $row++;
      $casas[] = $data;
}
fclose($handle);
}

//Ordenar de mayor a menor según la cantidad de regalos
for($j = 0; $j < count($casas); $j ++) {
    for($i = 0; $i < count($casas)-1; $i ++){

        if($casas[$i][1] < $casas[$i+1][1]) {
            $temp = $casas[$i+1][1];
            $casas[$i+1][1]=$casas[$i][1];
            $casas[$i][1]=$temp;
        }       
    }
}

//Guardar el orden en otro archivo csv
$fp = fopen('result.csv', 'w');
foreach ($casas as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
?>
3

Saludos, para el reto #5 he implementado Radix Sort que es un algoritmo de ordenamiento no-comparativo con una complejidad en el peor caso de O(wn) donde w es la cantidad de dígitos que tienen los números y n la cantidad de elementos en la lista. 😃

import timeit
import csv

defgetMax(ar):
    m = ar[0][1]
    for x in ar:
        if x[1] > m:
            m = x[1]
    return m

defcountSort(ar, n, e):
    count = [0]*10
    output = [None]*n
    for x in ar:
        count[(x[1]//e)%10] += 1for i in range(1,10):
        count[i] += count[i-1]
    for x in reversed(ar):
        output[count[(x[1]//e)%10]-1] = x
        count[(x[1]//e)%10] -= 1for i in range(n):
        ar[i] = output[i]

defradix_sort(ar):
    m = getMax(ar)
    e = 1
    n = len(ar)
    while m//e>0:
        countSort(ar,n,e)
        e *= 10with open('casa.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    array = []
    first = Truefor row in reader:
        if first:
            first = Falseelse:
            array.append([row[0], int(row[1])])

print('Iniciando ordenamiento')
s = timeit.default_timer()
radix_sort(array)
x = timeit.default_timer()
print('Ordenamiento finalizando\nTiempo:\n', x - s)

with open('casa_sorted.csv', 'w') as new_file:
    write = csv.writer(new_file)
    write.writerows(array)
3
2671Puntos

No gané pero me alegra que mi trabajo estuvo en las menciones honorificas, sin decir que me diverti haciendolo 😄 ojala haya más retos con tematicas aunque no pongan premios, el simple hecho de luchar con un reto es gratificante

3
27545Puntos

Reto #5 Completado

<?php

$filenameRead = 'casa.csv';
$arrayDataFileRead = []; 

// Abrir el archivo para leerlo
if (($openFile = fopen("{$filenameRead}", "r")) !== false)
{
  while (($data = fgetcsv($openFile, 1000, ",")) !== false)
  {
    // Cada array individual se está insertando en un array anidado
    $arrayDataFileRead[] = $data;   
  }
  // cerrar el archivo
  fclose($openFile);
}

$i = 0;
$change = true;
$x = 0;

while ($change)
{
  $change = false;
  for($i=0;  $i < count($arrayDataFileRead)-1; $i++)
  {
    if ($arrayDataFileRead[$i][1] < $arrayDataFileRead[$i+1][1] )
    {
      $x = $arrayDataFileRead[$i];
      // Intercambiar los datos
      $arrayDataFileRead[$i] = $arrayDataFileRead[$i+1];
      $arrayDataFileRead[$i+1] = $x;
      $change = true; // mostrar que ocurrió un intercambio
    }
  }
}

function convertToCsv($inputArray, $outputFileName, $delimiter)
{
  $tempMemory = fopen('php://memory', 'w');
  // recorrer el array
  foreach ($inputArray as $line) 
  {
    fputcsv($tempMemory, $line, $delimiter);
  }
  fseek($tempMemory, 0);
  // Modificar el encabezado para que sea en formato CSV.
  header('Content-Type: application/csv');
  header('Content-Disposition: attachement; filename="'.$outputFileName.'";');
  // salida el archivo a descargar
  fpassthru($tempMemory);
}

// Llamando la funcion que convierte y descarga el archivo
convertToCsv($arrayDataFileRead, 'otro.csv', ',');

?>
2

Reto 2 completado
Espero sea bien calificado, gracias fue entretenido.

2
1690Puntos

Esta es mi participación, hecho en PHP utilizando el algoritmo QuickSort

<?php
$csvFileName = 'casa.csv';
$csvFinalFilename = 'casas_ordenadas.csv';

//Cargamos el archivo csv
$csvFile = file_get_contents($csvFileName);

//Convertimos el archivo CSV a Array
$csvArray = csvToArray($csvFile);

//Ordenamos los valores con el algoritmo de QuickSort
quick_sort($csvArray, 1, count($csvArray)-2);

//Convertimos de Array a CSV
$csvFinal = arrayToCSV($csvArray);

//Guardamos el archivo
file_put_contents($csvFinalFilename, $csvFinal);

//@ Convierte los datos CSV a Array//# Con explode creamos un array delimitado por PHP_EOL (salto de linea)//# Recorremos el array creado empezando por el espacio 2 (para ignorar//# la primer fila que contine el nombre de las columnas) y realizamos//# lo mismo con explode pero esta vez delimitado por ',' así separamos//# los dos valores (ID y Number)functioncsvToArray($csv){
    $arr = explode(PHP_EOL, $csv);
    for ($i=1; $i<count($arr); $i++) {
        $arr[$i] = explode(',', $arr[$i]);
        $arr[$i][1] = intval($arr[$i][1]);
    }
    return $arr;
}

//@ Convierte los datos Array a CSV//# Simplemente recorremos el array y aplicamos implode para unirlos con//# primero por comas y despues por PHP_EOL (saltos de lineas)//* Los titulos no los unimos porque ya estan unidosfunctionarrayToCSV($arr){
    $lineArr = [];
    $lineArr[] = $arr[0];
    for ($i=1; $i<count($arr); $i++) {
        $lineArr[] = implode(',', $arr[$i]);
    }
    $csv = implode(PHP_EOL, $lineArr);
    return $csv;
}

//@ Este es el algoritmo QuickSort//@ Lo que este algoritmo hace es tomar como un pivote un valor del array y comparar//@ los valores del array con este, si el valor es menor al pivote lo ordenamos del//@ lado izquierda del array//@ si el valor es mayor al pivote lo ordenamos del lado derecho del array//# Comenzamos con un inicio y offset dado//# Tomamos como pivote el ultimo valor del array//# Comenzamos a comparar y trasladar los valores del array//# Comparamos los valores izquierda (empezando en el valor inicio)//# y derecha (empezando en el valor final del array - 1, para no tomar el pivote)//# Si el valor izquierdo es mayor al valor del pivote y si valor derecho es menor//# al pivote los intercambiamos//# y movemos la posicion izquierda un paso a la derecha y la posicion derecha un paso//# a la izquierda//# Si el valor izquierdo es mayor al valor del pivote pero el derecho es mayor tambien//# disminuimos un paso la posicion derecha//# Si el valor izquierdo es menor al valor del pivote entonces aumentamos un paso a la//# posicion izquierda//# Repetimos la comparación y traslado hasta que la posicion izquierda sea mayor o igual//# que la posicion derecha//# Terminando de comparar y trasladar checamos el valor de la posicion izquierda y si es//# menor que el valor del pivote movemos su posicion hasta la derecha, una vez que terminemos//# de posicionar el lado derecho en un valor mayor o igual al valor del pivote, intercambiamos//# de lugar el pivote y la posicion izquierda//# Terminando calculamos la cantidad de valores que hay en el array a la izquierda y derecha//# del pivote (que ahora debera de estar posicionado en el lugar que le corresponde en el array//# oredenado) y si la cantidad de valores del lado izquierdo es mayor a 0 aplicamos el algoritmo//# de QuickSort al pedazo izquierdo, y de igual manera si la cantidad de valores del lado derecho//# es mayor a 0 aplicamos el algoritmo de Quicksort al pedazo derecho, y así se creara una//# recursividad que una vez finalizada nos devolvera el array ordenadofunctionquick_sort(&$arr, $start, $offset){
    $pivot = $start + $offset;
    $pivotValue = $arr[$pivot];
    $checkStart = $start;
    $checkEnd = $pivot - 1;
    while ($checkStart <= $checkEnd) {
        if ($arr[$checkStart][1]>$pivotValue[1]) {
            if ($arr[$checkEnd][1]<=$pivotValue[1]) {
                $tmpValue = $arr[$checkStart];
                $arr[$checkStart] = $arr[$checkEnd];
                $arr[$checkEnd] = $tmpValue;
                $checkStart++;
                $checkEnd--;
            }
            else {
                $checkEnd--;
            }
        }
        else {
            $checkStart++;
        }
    }
    while ($arr[$checkStart][1]<$pivotValue[1]) {
        $checkStart++;
    }
    $arr[$pivot] = $arr[$checkStart];
    $arr[$checkStart] = $pivotValue;
    $offsetLeft = $checkStart - $start - 1;
    $offsetRight = $start + $offset - $checkStart - 1;
    if ($offsetLeft > 0) {
        quick_sort($arr, $start, $offsetLeft);
    }
    if ($offsetRight > 0) {
        quick_sort($arr, $checkStart + 1, $offsetRight);
    }
}
?>
2
1690Puntos
4 años

Aquí esta la correción (porqué lo habia realizado de menor a mayor primero 😛)

<?php
$csvFileName = 'casa.csv';
$csvFinalFilename = 'casas_ordenadas.csv';

//Cargamos el archivo csv
$csvFile = file_get_contents($csvFileName);

//Convertimos el archivo CSV a Array
$csvArray = csvToArray($csvFile);

//Ordenamos los valores con el algoritmo de QuickSort
quick_sort($csvArray, 1, count($csvArray)-2);

//Convertimos de Array a CSV
$csvFinal = arrayToCSV($csvArray);

//Guardamos el archivo
file_put_contents($csvFinalFilename, $csvFinal);

//@ Convierte los datos CSV a Array//# Con explode creamos un array delimitado por PHP_EOL (salto de linea)//# Recorremos el array creado empezando por el espacio 2 (para ignorar//# la primer fila que contine el nombre de las columnas) y realizamos//# lo mismo con explode pero esta vez delimitado por ',' así separamos//# los dos valores (ID y Number)functioncsvToArray($csv){
    $arr = explode(PHP_EOL, $csv);
    for ($i=1; $i<count($arr); $i++) {
        $arr[$i] = explode(',', $arr[$i]);
        $arr[$i][1] = intval($arr[$i][1]);
    }
    return $arr;
}

//@ Convierte los datos Array a CSV//# Simplemente recorremos el array y aplicamos implode para unirlos con//# primero por comas y despues por PHP_EOL (saltos de lineas)//* Los titulos no los unimos porque ya estan unidosfunctionarrayToCSV($arr){
    $lineArr = [];
    $lineArr[] = $arr[0];
    for ($i=1; $i<count($arr); $i++) {
        $lineArr[] = implode(',', $arr[$i]);
    }
    $csv = implode(PHP_EOL, $lineArr);
    return $csv;
}

//@ Este es el algoritmo QuickSort//@ Lo que este algoritmo hace es tomar como un pivote un valor del array y comparar//@ los valores del array con este, si el valor es menor al pivote lo ordenamos del//@ lado izquierda del array//@ si el valor es mayor al pivote lo ordenamos del lado derecho del array//# Comenzamos con un inicio y offset dado//# Tomamos como pivote el ultimo valor del array//# Comenzamos a comparar y trasladar los valores del array//# Comparamos los valores izquierda (empezando en el valor inicio)//# y derecha (empezando en el valor final del array - 1, para no tomar el pivote)//# Si el valor izquierdo es menor o igual al valor del pivote y si valor derecho es mayor//# al pivote los intercambiamos//# y movemos la posicion izquierda un paso a la derecha y la posicion derecha un paso//# a la izquierda//# Si el valor izquierdo es menor o igual al valor del pivote pero el derecho es menor//# o igual tambien, disminuimos un paso la posicion derecha//# Si el valor izquierdo es mayor al valor del pivote entonces aumentamos un paso a la//# posicion izquierda//# Repetimos la comparación y traslado hasta que la posicion izquierda sea mayor o igual//# que la posicion derecha//# Terminando de comparar y trasladar checamos el valor de la posicion izquierda y si es//# mayor o igual que el valor del pivote movemos su posicion hasta la derecha, una vez que//# terminemos de posicionar el lado derecho en un valor mayor o igual al valor del pivote,//# intercambiamos de lugar el pivote y la posicion izquierda//# Terminando calculamos la cantidad de valores que hay en el array a la izquierda y derecha//# del pivote (que ahora debera de estar posicionado en el lugar que le corresponde en el array//# oredenado) y si la cantidad de valores del lado izquierdo es mayor a 0 aplicamos el algoritmo//# de QuickSort al pedazo izquierdo, y de igual manera si la cantidad de valores del lado derecho//# es mayor a 0 aplicamos el algoritmo de Quicksort al pedazo derecho, y así se creara una//# recursividad que una vez finalizada nos devolvera el array ordenadofunctionquick_sort(&$arr, $start, $offset){
    $pivot = $start + $offset;
    $pivotValue = $arr[$pivot];
    $checkStart = $start;
    $checkEnd = $pivot - 1;
    while ($checkStart <= $checkEnd) {
        if ($arr[$checkStart][1]<=$pivotValue[1]) {
            if ($arr[$checkEnd][1]>$pivotValue[1]) {
                $tmpValue = $arr[$checkStart];
                $arr[$checkStart] = $arr[$checkEnd];
                $arr[$checkEnd] = $tmpValue;
                $checkStart++;
                $checkEnd--;
            }
            else {
                $checkEnd--;
            }
        }
        else {
            $checkStart++;
        }
    }
    while ($arr[$checkStart][1]>=$pivotValue[1]) {
        $checkStart++;
    }
    $arr[$pivot] = $arr[$checkStart];
    $arr[$checkStart] = $pivotValue;
    $offsetLeft = $checkStart - $start - 1;
    $offsetRight = $start + $offset - $checkStart - 1;
    if ($offsetLeft > 0) {
        quick_sort($arr, $start, $offsetLeft);
    }
    if ($offsetRight > 0) {
        quick_sort($arr, $checkStart + 1, $offsetRight);
    }
}
?>
2
6122Puntos

Vamo a darle

2
763Puntos
alert("Reto Aceptado.");
2
22046Puntos

me gustó más el juego de Rodney Retros 😃 el ganador es imposible de ganar 😦

1
22046Puntos
4 años

*el juego de el ganador

2
8914Puntos

Estos retos parecen estar enfocados en diseñadores y desarrolladores frontend 😦

2
11076Puntos
4 años

En cada reto aumenta la recompensa
Valoro mucho la programación y creo que Platzi también
Por eso ese esfuerzo quizás quede mejor al último, como el postre 😃

2

Excelente este tipo de retos, nos anima a practicar y aplicar los conocimientos.

2
1546Puntos
print("Challenge accepted! 👩‍💻")
2
2503Puntos

Hola, hay un error en el contador, sino recargas la pagina solo pasan y se reinician los segundos y queda en el mismo minuto.

1
3140Puntos
4 años

A mi si me funciona el contador

2
3960Puntos

Listo y preparado 💪💪💪

2
30421Puntos

Esto se pone bueno… jo jo jo!

2
174Puntos

¡Hasta el 31 de Diciembre!

2
3149Puntos

Bueh almenos tuve mención honorifica :v nada mal para hacer todo en una hora xD

2
2900Puntos

Challenger aceptado

2
3171Puntos

excelente ; #regalaconocimiento
Acepto el reto
Una expresión regular: es modo de búsqueda donde se utilizan secuencias de caracteres alfabéticos, números o caracteres especiales, para dar un resultado y reconocer o descartar una cadena de texto.
Ejemplo:
/?( Grinch*)(?! Grinch) encontrar al Grinch en texto.

2
2620Puntos

Hola!
Aqui está mi código del reto #5 del Grinch 😃
Use como base el algoritmo Quicksort  por si a alguno le interesa y tambien lo quiere implementar

import csv

defsort(sortList, KEYS):
    sortedLeftList = []
    sortedRightList = []
    pivotList = []

    # Selecciono un numero para tenerlo como base
    pivot = int(sortList[0][KEYS[1]])

    # Ordeno la lista usando el pivot como punto intermediofor row in sortList:
        num = int(row[KEYS[1]])
        if num == pivot:
            pivotList.append({KEYS[0]: row[KEYS[0]], KEYS[1]: num})
        elif num < pivot:
            sortedLeftList.append({KEYS[0]: row[KEYS[0]], KEYS[1]: num})
        else:
            sortedRightList.append({KEYS[0]: row[KEYS[0]], KEYS[1]: num})

    # Se sigue ejecutando la funcion hasta que quede un elemento en cada listaif len(sortedLeftList) > 1:
        sortedLeftList = sort(sortedLeftList, KEYS)
    if len(sortedRightList) > 1:
        sortedRightList = sort(sortedRightList, KEYS)

    # Regreso la nueva lista ya ordenada
    sortedList = [*sortedLeftList, *pivotList, *sortedRightList]

    return sortedList


defmain():with open('casa.csv', mode='r') as csvFileRead:
        csv_reader = csv.DictReader(csvFileRead)
        KEYS = csv_reader.fieldnames
        sorted_csv = sort(list(csv_reader), KEYS)

        with open('sorted.csv', mode='w', newline='') as csvFileWrite:
            newCsvFile = csv.writer(
                csvFileWrite, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

            newCsvFile.writerow(['ID', 'Number'])

            for row in sorted_csv:
                newCsvFile.writerow([row[KEYS[0]], row[KEYS[1]]])


main()
2
4581Puntos

Hola que tal Platzi, dejo mi aporte para el Reto 5, Utilicé el ordenamiento quickSort en PHP partiendo desde la obtención del archivo CSV hasta su descarga. (Comenté cada parte dentro del código)

¿Por qué quickSort?

Al establecer el lineamiento de que nosotros teníamos que hacer el ordenamiento opté por la decisión de dos mundos burbuja o quicksort, sin embargo la cantidad no es muy grande lo que hace a quicksort mas eficiente a la hora de clasificar los elementos y recursar esa misma función.

Sin mas preámbulos dejo mi código en GIST de Githbub

Reto 5 Carlos Garcia - GATEJECA

2
67714Puntos

Saludos. Para ordenar las casas utilicé Heapsort. Heapsort tiene 2 ventajas sobre quicksort, la primera es una complejidad en peor caso de O(nlogn), mientras que quicksort tiene una complejidad en el peor caso de O(n^2). La segunda es una complejidad espacial de O(1), mientras que quicksort tiene una complejidad espacial de O(n). La implementación de heapsort esta basada en esta https://rosettacode.org/wiki/Sorting_algorithms/Heapsort#Python

import csv
arr=[]
header=[]

def heapsort(lst):
 
  for startinrange(int((len(lst)-2)/2), -1, -1):
    siftdown(lst, start, len(lst)-1)
 
  forendinrange(len(lst)-1, 0, -1):
    lst[end][1], lst[0][1] = lst[0][1], lst[end][1]
    siftdown(lst, 0, end - 1)
  return lst
 
def siftdown(lst, start, end):
  root = startwhileTrue:
    child = root * 2 + 1ifchild > end: break
    ifchild + 1 <= endandint(lst[child][1]) > int(lst[child + 1][1]):
      child += 1ifint(lst[root][1]) > int(lst[child][1]):
      lst[root][1], lst[child][1] = lst[child][1], lst[root][1]
      root = childelse:
      break

withopen('casa.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    
    for idx, line in enumerate(reader):
        if idx==0:
            header.append(line)
        else:
            arr.append(line)
    arr=header+heapsort(arr)

    withopen('casa_ordenado.csv','w') as new_file:
        writer=csv.writer(new_file)
        forrowin arr:
            writer.writerow(row)
2
13425Puntos

Teoria de complejidad,
Viva el algoritmo heapsort
Feliz navidad amigos!!!

<?php

//leer archivo csv y retornar array associativo
function leer_csv($rutaArchivo){
  $arraydedatos = [];
  $archivo = @fopen($rutaArchivo, "r");
  $encabezado = fgetcsv($archivo, 20);
  while ($dato = fgetcsv($archivo, 20)) {
    $dato = [$encabezado[0] => $dato[0], $encabezado[1] => (int) $dato[1]];
    array_push($arraydedatos,$dato);
  }
  fclose($archivo);
  return $arraydedatos;
}


//ordena los elememntos usando algoritmo heapsort y retorna datos ordenados
function ordenar($datos){
  $longitud = count($datos);

  while ($longitud > 0){

    $ultima_posision = $longitud - 1;
    $ultimo_padre = (int) floor(($ultima_posision - 1) / 2);

    while ($ultimo_padre >= 0) {
      $posision_hijo_izquierdo = (2 * $ultimo_padre) + 1;
      $posision_hijo_derecho = (2 * $ultimo_padre) + 2;

      //verficar propiedad heap
      $tempval_padre = $datos[$ultimo_padre];
      $tempval_hijoizquierdo = $datos[$posision_hijo_izquierdo];
      $tempval_hijoderecho = $posision_hijo_derecho > $ultima_posision ? false : $datos[$posision_hijo_derecho];

      //permutar datos
      if ($tempval_hijoderecho){
        if ($tempval_padre['Number'] < $tempval_hijoderecho['Number']){
          $datos[$ultimo_padre] = $tempval_hijoderecho;
          $datos[$posision_hijo_derecho] = $tempval_padre;
          $tempval_padre = $datos[$ultimo_padre];
        }
      }

      if ($tempval_padre['Number'] < $tempval_hijoizquierdo['Number']){
        $datos[$ultimo_padre] = $tempval_hijoizquierdo;
        $datos[$posision_hijo_izquierdo] = $tempval_padre;
      }
      $ultimo_padre--;
    }

    //permutar valor calculado
    $primer_valor = $datos[0];
    $ultimo_valor = $datos[$ultima_posision];
    $datos[$ultima_posision] = $primer_valor;
    $datos[0] = $ultimo_valor;
    $longitud--;
  }

  return $datos;
}

//crea un nuevo archivos CSV con los datos ordenados
function crear_csv($datos){
  $nuevo_archivo = fopen('casa_ordenado.csv', 'w');
  fputcsv($nuevo_archivo, ['ID', 'Number'], ',', ' ');
  foreach ($datos as $dato) {
    fputcsv($nuevo_archivo, $dato, ',', ' ');
  }
  rewind($nuevo_archivo);
  fclose($nuevo_archivo);
2

He corregido mi código, no me había fijado que era de mayor a menor 😮

import timeit
import csv

defgetMax(ar):
    m = ar[0][1]
    for x in ar:
        if x[1] > m:
            m = x[1]
    return m

defcountSort(ar, n, e):
    count = [0]*10
    output = [None]*n
    for x in ar:
        try:
            count[9-(x[1]//e)%10] += 1except:
            count[9] += 1for i in range(1,10):
        count[i] += count[i-1]
    for x in reversed(ar):
        try:
            output[count[9-(x[1]//e)%10]-1] = x
            count[9-(x[1]//e)%10] -= 1except:
            output[count[9]-1] = x
            count[9] -= 1for i in range(n):
        ar[i] = output[i]

defradix_sort(ar):
    m = getMax(ar)
    e = 1
    n = len(ar)
    while m//e>0:
        countSort(ar,n,e)
        e *= 10with open('casa.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    array = []
    first = Truefor row in reader:
        if first:
            first = Falseelse:
            array.append([row[0], int(row[1])])

print('Iniciando ordenamiento')
s = timeit.default_timer()
radix_sort(array)
x = timeit.default_timer()
print('Ordenamiento finalizando\nTiempo:\n', x - s)

with open('casa_sorted.csv', 'w') as new_file:
    write = csv.writer(new_file)
    write.writerows(array)
2
13425Puntos

Codigo corregido
ordenar de menor a mayor
algoritmo Heapsort
Feliz navidad!!

<?php

//leer archivo csv y retornar array associativo
function leer_csv($rutaArchivo){
  $arraydedatos = [];
  $archivo = @fopen($rutaArchivo, "r");
  $encabezado = fgetcsv($archivo, 20);
  while ($dato = fgetcsv($archivo, 20)) {
    $dato = [$encabezado[0] => $dato[0], $encabezado[1] => (int) $dato[1]];
    array_push($arraydedatos,$dato);
  }
  fclose($archivo);
  return $arraydedatos;
}


//ordena los elememntos usando algoritmo heapsort y retorna datos ordenados
function ordenar($datos){
  $longitud = count($datos);

  while ($longitud > 0){

    $ultima_posision = $longitud - 1;
    $ultimo_padre = (int) floor(($ultima_posision - 1) / 2);

    while ($ultimo_padre >= 0) {
      $posision_hijo_izquierdo = (2 * $ultimo_padre) + 1;
      $posision_hijo_derecho = (2 * $ultimo_padre) + 2;

      //verficar propiedad heap
      $tempval_padre = $datos[$ultimo_padre];
      $tempval_hijoizquierdo = $datos[$posision_hijo_izquierdo];
      $tempval_hijoderecho = $posision_hijo_derecho > $ultima_posision ? false : $datos[$posision_hijo_derecho];

      //permutar datos
      if ($tempval_hijoderecho){
        if ($tempval_padre['Number'] > $tempval_hijoderecho['Number']){
          $datos[$ultimo_padre] = $tempval_hijoderecho;
          $datos[$posision_hijo_derecho] = $tempval_padre;
          $tempval_padre = $datos[$ultimo_padre];
        }
      }

      if ($tempval_padre['Number'] > $tempval_hijoizquierdo['Number']){
        $datos[$ultimo_padre] = $tempval_hijoizquierdo;
        $datos[$posision_hijo_izquierdo] = $tempval_padre;
      }
      $ultimo_padre--;
    }

    //permutar valor calculado
    $primer_valor = $datos[0];
    $ultimo_valor = $datos[$ultima_posision];
    $datos[$ultima_posision] = $primer_valor;
    $datos[0] = $ultimo_valor;
    $longitud--;
  }

  return $datos;
}

//crea un nuevo archivos CSV con los datos ordenados
function crear_csv($datos){
  $nuevo_archivo = fopen('casa_ordenado.csv', 'w');
  fputcsv($nuevo_archivo, ['ID', 'Number'], ',', ' ');
  foreach ($datos as $dato) {
    fputcsv($nuevo_archivo, $dato, ',', ' ');
  }
  rewind($nuevo_archivo);
  fclose($nuevo_archivo);
}

//ejecucionde las funciones paso a paso
$casas = leer_csv('casa.csv');
$casas = ordenar($casas);
crear_csv($casas);
2
7362Puntos

Acá va el codigo, lo hice en PHP. Para que funcione, el archivo ‘casa.csv’ tiene que estar en el mismo directorio que el script PHP.

<?php

$casas = leerDatosDeArchivos();

//obtenemos las claves del arreglo obtenido
$claves = array_keys($casas);

//Ordenamos las claves
$clavesOrdenadas = mergeSort($claves);

//Armamos el arreglo a imprimir en el csv de salida
$salida = [];
for($i = 0; $i < count($clavesOrdenadas); $i++) {
    $salida[$casas[$clavesOrdenadas[$i]]] = $clavesOrdenadas[$i];
}

guardarDatosEnArchivo($salida);


function mergeSort($arreglo) {

    if(count($arreglo) <= 1) {
        //El arreglo ya está ordenado
        return $arreglo;
    }

    //Dividimos el arreglo en dos
    $medio = count($arreglo) / 2;

    $izquierda = [];
    for($i = 0; $i < $medio; $i++) {
        $izquierda[] = $arreglo[$i];
    }

    $derecha = [];
    for($i = $medio; $i < count($arreglo); $i++) {
        $derecha[] = $arreglo[$i];
    }

    $izquierda = mergeSort($izquierda);
    $derecha = mergeSort($derecha);

    //Comparamos si el ultimo elemento del primer arreglo es menor que el primer elemento del segundo arreglo
    if($izquierda[count($izquierda) - 1] <= $derecha[0]) {
        //Concatenamos el arreglo de la derecha al de la izquierda
        return array_merge($izquierda, $derecha);
    }

    return combinar($izquierda, $derecha);
}


function combinar($izquierda, $derecha) {
    $res = [];
    while (count($izquierda) > 0 && count($derecha) > 0) {
        // Agregamos el elemento con menor valor entre los dos de cada arreglo
        if ($izquierda[0] <= $derecha[0]) {
            $res[] = $izquierda[0];
            //eliminamos el elemento añadido
            array_shift($izquierda);
        } else {
            $res[] = $derecha[0];
            //eliminamos el elemento añadido
            array_shift($derecha);
        }
    }

    //vaciamos los restos de los arreglos, segun corresponda
    while (count($izquierda) > 0) {
        $res[] = $izquierda[0];
        array_shift($izquierda);
    }
    while (count($derecha) > 0) {
        $res[] = $derecha[0];
        array_shift($derecha);
    }
    return $res;
}


function leerDatosDeArchivos()
{
    $datosArchivo = file_get_contents('casa.csv');

    $datos = array_map(function ($element) {
        return explode(',', $element);
    }, explode(PHP_EOL, $datosArchivo));
    array_shift($datos);

    $arreglo = [];
    for ($i = 0; $i < count($datos); $i++) {
        $arreglo[$datos[$i][1]] = $datos[$i][0];
    }

    return $arreglo;
}

function guardarDatosEnArchivo($datos) {

    $fp = fopen('casa_salida.csv', 'wb');
    
    // agregamos los headers al archivo
    fputcsv($fp, ['ID','Number']);

    foreach($datos as $idCasa => $numero) {
        $linea = [$idCasa, $numero];
        fputcsv($fp, $linea);
    }

    fclose($fp);
}




1
7362Puntos
4 años

Como hago para eliminar un comentario. ¿Se puede?

2
2126Puntos

Reto #5. Utilizando el algoritmo de ordenamiento Shell Sort, inventado por Donald Shell en 1959. Es util, ya que no consume mucha memoria.

<?php
$arrayCSV = readFileCSV('casa.csv');

$arrayOrder = shellSort($arrayCSV);

$csv_modificado = makeCSV($arrayOrder, "casaOrdenada.csv");

    function readFileCSV($file){

        $file = fopen("{$file}", "r");

        $data = [];

        while (($datos = fgetcsv($file, ","))){
            $data[] = [
                'id' => $datos[0],
                'cantidad' => $datos[1]
            ];
        }

        fclose($file);
        return $data;
    }

    function shellSort($arrayData){
	    $inc = round(count($arrayData)/2);
	    while($inc > 0){
            for($i = $inc; $i < count($arrayData);$i++){
                $temp = $arrayData[$i];
                $j = $i;
                while($j >= $inc && $arrayData[$j-$inc]['cantidad'] < $temp['cantidad']){
                    $arrayData[$j] = $arrayData[$j - $inc];
                    $j -= $inc;
                }
                $arrayData[$j] = $temp;
            }
		    $inc = round($inc/2.2);
	    }
	    return $arrayData;
    }

    function makeCSV($data, $fileName){
        $tempMemory = fopen('php://memory', 'w');

        foreach ($data as $line) {
            fputcsv($tempMemory, $line, ",");
        }
        fseek($tempMemory, 0);

        header('Content-Type: application/csv');
        header('Content-Disposition: attachement; filename="' . $fileName . '";');

        fpassthru($tempMemory);
    }

?>```
2
2710Puntos

**CODE FTW 😄
**

<code>

<?PHP
function readCSV($csvFile){
    $file = fopen($csvFile, 'r');
    while (!feof($file) ) {
        $line[] = fgetcsv($file,1024,",");
    }
    fclose($file);
    return $line;
}

function orderDESC($doc){
for($i=1;$i<count($doc);$i++)
	{
		for($j=$i+1;$j<count($doc);$j++)
		{
			if($doc[$j][1]>$doc[$i][1])
			{
				$tmp=$doc[$i];
				$doc[$i]=$doc[$j];
				$doc[$j]=$tmp;
			}
		}
	}
	return ($doc);
}
	
function toCSV($doc){
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="Grinch.csv"');	
$fp = fopen('php://output', 'w');

foreach ($doc as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
}


$csvFile = 'casa.csv';
$csv = readCSV($csvFile);
toCSV(orderDESC($csv));

?>

2
3520Puntos

Reto # 5
Realizado en Python

from time import time
import csv

with open('casa.csv', 'r') as File:  
    casas = File.read().splitlines()
    casas.remove(casas[0])
    aux = []
    for c in casas:
        aux.append(int(c.split(',')[1]))

defordenar():
    mitad = len(aux)//2while mitad > 0:
        for i in range(mitad):
            for i in range(i+mitad,len(aux),mitad):
                val = aux[i]
                pos = i
                while pos>=mitad and aux[pos-mitad]<val:
                    aux[pos]=aux[pos-mitad]
                    casas[pos] = casas[pos-mitad]
                    pos = pos-mitad
                aux[pos]=val
                casas[pos] = casas[i]
        mitad = mitad // 2

t1 = time()
ordenar()
t2 = time()
with open('casas2.csv', 'w', newline='') as File:
    writer = csv.writer(File)
    writer.writerows(casas)
print(aux)
print(t2-t1)

2
7362Puntos

Acá va de nuevo el código en PHP. Ahora ordena de mayor a menor, y no de menor a mayor. Para que funcione, el archivo ‘casa.csv’ tiene que estar en el mismo directorio que el script PHP.

Saludos

<?php


$casas = leerDatosDeArchivos();

//obtenemos las claves del arreglo obtenido
$claves = array_keys($casas);

//Ordenamos las claves
$clavesOrdenadas = mergeSort($claves);

//Armamos el arreglo a imprimir en el csv de salida
$salida = [];
for($i = 0; $i < count($clavesOrdenadas); $i++) {
    $salida[$casas[$clavesOrdenadas[$i]]] = $clavesOrdenadas[$i];
}

guardarDatosEnArchivo($salida);


function mergeSort($arreglo) {

    if(count($arreglo) <= 1) {
        //El arreglo ya está ordenado
        return $arreglo;
    }

    //Dividimos el arreglo en dos
    $medio = count($arreglo) / 2;

    $izquierda = [];
    for($i = 0; $i < $medio; $i++) {
        $izquierda[] = $arreglo[$i];
    }

    $derecha = [];
    for($i = $medio; $i < count($arreglo); $i++) {
        $derecha[] = $arreglo[$i];
    }

    $izquierda = mergeSort($izquierda);
    $derecha = mergeSort($derecha);

    //Comparamos si el ultimo elemento del primer arreglo es mayor que el primer elemento del segundo arreglo
    if($izquierda[count($izquierda) - 1] > $derecha[0]) {
        //Concatenamos el arreglo de la derecha al de la izquierda
        return array_merge($izquierda, $derecha);
    }

    return combinar($izquierda, $derecha);
}


function combinar($izquierda, $derecha) {
    $res = [];
    while (count($izquierda) > 0 && count($derecha) > 0) {
        // Agregamos el elemento con mayor valor entre los dos de cada arreglo
        if ($izquierda[0] > $derecha[0]) {
            $res[] = $izquierda[0];
            //eliminamos el elemento añadido
            array_shift($izquierda);
        } else {
            $res[] = $derecha[0];
            //eliminamos el elemento añadido
            array_shift($derecha);
        }
    }

    //vaciamos los restos de los arreglos, segun corresponda
    while (count($izquierda) > 0) {
        $res[] = $izquierda[0];
        array_shift($izquierda);
    }
    while (count($derecha) > 0) {
        $res[] = $derecha[0];
        array_shift($derecha);
    }
    return $res;
}


function leerDatosDeArchivos()
{
    $datosArchivo = file_get_contents('casa.csv');

    $datos = array_map(function ($element) {
        return explode(',', $element);
    }, explode(PHP_EOL, $datosArchivo));
    array_shift($datos);

    $arreglo = [];
    for ($i = 0; $i < count($datos); $i++) {
        $arreglo[$datos[$i][1]] = $datos[$i][0];
    }

    return $arreglo;
}

function guardarDatosEnArchivo($datos) {

    $fp = fopen('casa_salida.csv', 'wb');
    
    // agregamos los headers al archivo
    fputcsv($fp, ['ID','Number']);

    foreach($datos as $idCasa => $numero) {
        $linea = [$idCasa, $numero];
        fputcsv($fp, $linea);
    }

    fclose($fp);
}



2
1272Puntos

Reto 5
lenguaje: python

import csv
 
# subir datos de archivo a vector
results = []
withopen('casa.csv') as File:
    reader = csv.DictReader(File)
    for row in reader:
        results.append(row)

size  = len(results)

# ordenamientofor i in range(0, size):
    datI = results[i]
    for j in range(0, size):
        datJ = results[j]
        if(datI['Number'] > datJ['Number']):
            aux        = results[j]
            results[j] = results[i]
            results[i] = aux

# crear archivo ordenadowithopen('casaO.csv', 'w') as csvfile:
    fieldnames = ['\xef\xbb\xbfID', 'Number']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(results)

2
7206Puntos

Utilice el algoritmo Quicksort. Traté de hacer en una linea algunos loops, al estilo ruby, pero resultaba menos eficiente.

Tambien intente mapear los datos en una clase pero era menos eficiente. Espero que el jurado de los Quién lo aprecie. 😄
#regalaconocimiento

require 'csv'

start_at = Time.now

# @param [Array] houses
# @param [Integer] low_index
# @param [Integer] high_index
def pivot(houses, low_index, high_index)
  pivot = houses[(low_index + high_index) / 2]
  i = low_index - 1
  j = high_index + 1

  loop doloopdo
      i += 1
      break unless houses[i][1] < pivot[1]
    endloopdo
      j -= 1
      break unless houses[j][1] > pivot[1]
    endreturn j if i >= j

    # switch them
    aux = houses[i]
    houses[i] = houses[j]
    houses[j] = aux
  endend

# @param [Array] houses
# @param [Integer] min
# @param [Integer] maxdef quick_sort(houses, min, max)
  return unless min < max

  p = pivot(houses, min, max)
  quick_sort(houses, min, p)
  quick_sort(houses, p + 1, max)
end

houses = CSV.read('casa.csv')
header = houses.shift
houses.map! { |house| [house[0], house[1].to_i] }

algorithm_at = Time.now
quick_sort(houses, 0, houses.size - 1)
puts "El malvado Claus encontró las mejores casas en : #{Time.now - algorithm_at}"data = houses.unshift(header).map { |house| house.join(',') }.join("\n")
File.write('sorted_houses.csv', data)

puts "Inició su fechoría en                          : #{Time.now - start_at}"
puts "#regalaconomiento"
1
7206Puntos
4 años

Erre la versión al pegar.

para obtener primero los mayores simplemente es necesario invertir la comparacion del while en los dos loops en las lineas 16 y 20.

require 'csv'

start_at = Time.now

# @param [Array] houses
# @param [Integer] low_index
# @param [Integer] high_index
def pivot(houses, low_index, high_index)
  pivot = houses[(low_index + high_index) / 2]
  i = low_index - 1
  j = high_index + 1

  loop doloopdo
      i += 1
      break unless houses[i][1] > pivot[1]
    endloopdo
      j -= 1
      break unless houses[j][1] < pivot[1]
    endreturn j if i >= j

    # switch them
    aux = houses[i]
    houses[i] = houses[j]
    houses[j] = aux
  endend

# @param [Array] houses
# @param [Integer] min
# @param [Integer] maxdef quick_sort(houses, min, max)
  return unless min < max

  p = pivot(houses, min, max)
  quick_sort(houses, min, p)
  quick_sort(houses, p + 1, max)
end

houses = CSV.read('casa.csv')
header = houses.shift
houses.map! { |house| [house[0], house[1].to_i] }

algorithm_at = Time.now
quick_sort(houses, 0, houses.size - 1)
puts "El malvado Claus encontró las mejores casas en : #{Time.now - algorithm_at}"data = houses.unshift(header).map { |house| house.join(',') }.join("\n")
File.write('sorted_houses.csv', data)

puts "Inició su fechoría en                          : #{Time.now - start_at}"
puts "#regalaconomiento"
2
7206Puntos
4 años

y creo que esto nos pasa siempre en el trabajo. Tomamos el requerimiento y sin prestar atencion a los detalles nosotros decidimos libremente como va a quedar el finalmente el aplicativo que estemos desarrollando. Sin tomar en cuenta absolutamente todo lo que el cliente, producto owner nos esta pidiendo

2
12934Puntos

Reto #9
El grinch puedo robar la navidad este año en @platzi y en el mundo entero.

Quizá el espíritu navideño de cada persona no fue lo suficiente para que el grinch no se robará está navidad. 😔

El siguiente año le ganaremos.

Revisa el storytelling aquí 👇🏻✅
https://twitter.com/AppsAlejandro/status/1077672017631928320

1
7206Puntos

No me aparece bien en contador de tiempo para el reto 8. Sólo me ocurre a mi?

1
35891Puntos

Challenge accepted

1
8657Puntos

Uh que bueno. Me gustan los retos! 😄

1

Hola, he visto varios post que utilizan funciones como quicksort o en tu caso Heapsort. Como en el enunciado dice que no se pueden utilizar funciones nativas como Sort o similares se me genero la duda si ¿utilizar estas funciones es valido?

1
32Puntos
4 años

Si entendí bien, la idea es que implementes tú uno de los varios métodos de ordenación. El ganador sera quien implemente cualquier método pero de la forma más eficiente.

1
845Puntos

Buenas tardes, no entendí dónde hay que publicar el reto #5. Alguien sabe? Muchas gracias!

1
67714Puntos
4 años

aquí en los comentarios

1
6121Puntos
WRITE TPERROR(CHR(cc_clear_win), 'Challenge accepted')
1
32431Puntos

Maravilloso, toda la comunidad platzi dando lo mejor!!

1
3084Puntos

Qué buena idea, haré los retos apenas salgan

1
4948Puntos

Porfis regalen también un mes de suscripción a las menciones honoríficas. Nos esforzamos igual en hacer el mejor trabajo posible

2
4948Puntos
4 años

Les agradezco igual la oportunidad de alguna manera incentivarnos a aprender a través de estos retos.

1
8914Puntos

Hasta ahora me di cuenta del reto 😐 para los demas debo haber completado este?

2
11650Puntos
4 años

No, puedes participar en los retos que quieras 😉

1
32241Puntos

Acepto el Reto!!!

1
3391Puntos
print("Challenge accepted!")