Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Saito_25 en 29 Marzo 2015, 01:10 am



Título: Duda para ordenar arreglos en Ruby.
Publicado por: Saito_25 en 29 Marzo 2015, 01:10 am
Bueno, estoy siguiendo uno de los tutoriales que me dejó un usuario en está página, pero me tiene un poco confuso la parte en la que estoy, y por poco me refiero a mucho.

Estoy en esta parte: http://www.codecademy.com/es/courses/ruby-beginner-en-F7psT/3/4?curriculum_id=5106fd5d36edd4ef76000149 (http://www.codecademy.com/es/courses/ruby-beginner-en-F7psT/3/4?curriculum_id=5106fd5d36edd4ef76000149)

Bueno, no tengo ni idea de qué hacer para ordenar el array descendentemente de la forma en la que me lo pide el ejercicio... lo mas gracioso es que la forma que se me ocurre es más fácil... que es simplemente poner "libros.sort!.reverse!" Hace lo mismo, y mucho más sencillo, al menos eso creo.

Espero vuestra ayuda, gracias


Título: Re: Duda para ordenar arreglos en Ruby.
Publicado por: engel lex en 29 Marzo 2015, 01:40 am
realmente no se ruby... pero lo que el usuario me parece que hace ahí es un ordenamiento personalizado, solo que lo usa en su modo más simple que es inversión... pero cuando quieras ordenar algo de manera poco común, el es tu solución


Título: Re: Duda para ordenar arreglos en Ruby.
Publicado por: Eleкtro en 29 Marzo 2015, 10:14 am
La solución es:
Código
  1. libros.sort! {
  2.    |primerLibro, segundoLibro|
  3.    segundoLibro <=> primerLibro
  4. }

La solución que pensaste sobre hacerle un reversal (inversión) a la colección también sería válida fuera del ejercicio,
pero supongo que el ejercicio no lo puede tomar por válido ya que obviamente la intención del ejercicio es demostrar la implementación de un bloque de código que compare entre A y B, devolviendo -1, 0, o +1,
vamos, que en mi opinión los algoritmos de validación de Code Academy no parecen permitir mucho "libre albedrio".

PD: Formula futuras preguntas sobre Ruby en el foro de Scripting.

Saludos


Título: Re: Duda para ordenar arreglos en Ruby.
Publicado por: Saito_25 en 29 Marzo 2015, 12:37 pm
Siento las molestia causadas. A partir de ahora, hago las preguntas en este foro.

Supuse que lo que yo hice también era válido, y me estaba rallando bastante la fórmula que me daban ellos, o mejor dicho, el cómo pedían que lo hicieran.

Sigo sin entender muy bien ese código, por no decir que, además de saber que ordena, no tengo ni idea de cómo. Tampoco sé si hay alguna diferencia entre el código mío y ese, si cambiará en algo el resultado a corto o largo plazo.

A ver si me podéis ayudar un poco más. Gracias.


Título: Re: Duda para ordenar arreglos en Ruby.
Publicado por: Eleкtro en 29 Marzo 2015, 14:04 pm
Tampoco sé si hay alguna diferencia entre el código mío y ese, si cambiará en algo el resultado a corto o largo plazo.

La diferencia deberias tenerla clara ya que el propio nombre de las funciones Reverse y Sort indican su funcionalidad:

Reverse invierte el orden de los elementos de la secuencia.
Sort ordena los elementos de la secuencia, según el resultado de una evaluación entre los elementos.

En el código de Code Academy la colección ya te la dan ordenada de manera ascendente:
Citar
Código
  1. libros.sort! { |primerLibro, segundoLibro| primerLibro <=> segundoLibro }

Entonces, si le haces un Reverse lo que estás haciendo es invertir el orden de Ascendente a Descendente, por ese motivo y en este caso específico la solución de usar Reverse sería perfectamente aplicable, sólo que Code Academy no acepta esa solución por el motivo que sea (el motivo podría ser lo que ya epxliqué en mi comentario anterior).

Sigo sin entender muy bien ese código.

El operador <=> toma dos objetos, A y B, los compara y devuelve -1, 0, o 1:

Si A es mayor que B, devolverá -1
Si B es mayor que A, devolverá 1
Si A y B son iguales, devolverá 0

El algoritmo de ordenación utiliza el resultado de esa evaluación para determinar en que posición de la colección deben ir los elementos:

Si el resultado de la evaluación es -1, A debe posicionarse despues de B.
Si el resultado de la evaluación es 1, B debe posicionarse despues de A.
Si el resultado de la evaluación es 0, no importa le orden.

Slaudos



EDITO:

He escrito este ejemplo por si te ayuda a entenderlo mejor utilizando un bloque de código para una evaluación personalizada:

Código
  1. # -*- coding: WINDOWS-1252 -*-
  2.  
  3. col = [ "d", "a", "e", "c", "b" ]
  4.  
  5. ascendantCol =
  6. col.sort {
  7.    |a, b|  
  8.    case
  9.        when a > b
  10.            +1
  11.        when b > a
  12.            -1
  13.        else
  14.            0
  15.    end
  16. }
  17.  
  18. descendantCol =
  19. col.sort {
  20.    |a, b|  
  21.    case
  22.        when a > b
  23.            -1
  24.        when b > a
  25.            +1
  26.        else
  27.            0
  28.    end
  29. }
  30.  
  31. print "Ascendant : #{ ascendantCol.join(', ')}\n"
  32. print "Descendant: #{descendantCol.join(', ')}\n"
  33.  
  34. __END__

Saludos


Título: Re: Duda para ordenar arreglos en Ruby.
Publicado por: Saito_25 en 29 Marzo 2015, 15:54 pm
Ahora sí, mucho más claro.  :D.

Tenía algunas dudas por cómo era el patrón por el cuál se guiaba el método para ordenar, ya me la solucionaste, thank you so much.