Duda para ordenar arreglos en Ruby.

Iniciado por Saito_25, 29 Marzo 2015, 01:10 AM

0 Miembros y 1 Visitante están viendo este tema.

Saito_25

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

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

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#2
La solución es:
Código (ruby) [Seleccionar]
libros.sort! {
   |primerLibro, segundoLibro|
   segundoLibro <=> primerLibro
}


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








Saito_25

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.

Eleкtro

#4
Cita de: Saito_25 en 29 Marzo 2015, 12:37 PMTampoco 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 (ruby) [Seleccionar]
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).

Cita de: Saito_25 en 29 Marzo 2015, 12:37 PMSigo 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 (ruby) [Seleccionar]
# -*- coding: WINDOWS-1252 -*-

col = [ "d", "a", "e", "c", "b" ]

ascendantCol =
col.sort {
   |a, b|  
   case
       when a > b
           +1
       when b > a
           -1
       else
           0
   end
}

descendantCol =
col.sort {
   |a, b|  
   case
       when a > b
           -1
       when b > a
           +1
       else
           0
   end
}

print "Ascendant : #{ ascendantCol.join(', ')}\n"
print "Descendant: #{descendantCol.join(', ')}\n"

__END__


Saludos








Saito_25

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.