Ejercicios

  1. Explique porque es ineficiente esta forma de ordenar:
    >> system 'ls -l c*.rb'
    -rw-r--r--  1 casianorodriguezleon  staff  296 17 oct 22:12 calif.rb
    -rw-r--r--  1 casianorodriguezleon  staff  320 26 sep 08:12 case.rb
    -rw-r--r--  1 casianorodriguezleon  staff  526 10 oct 12:51 chuchu.rb
    -rw-r--r--  1 casianorodriguezleon  staff   95  7 oct 16:27 closure.rb
    => true
    >> files = Dir['c*.rb']
    => ["calif.rb", "case.rb", "chuchu.rb", "closure.rb"]
    >> fs = files.sort { |a,b| File.new(b).mtime <=> File.new(a).mtime }
    => ["calif.rb", "chuchu.rb", "closure.rb", "case.rb"]
    
  2. El método stat de la clase File nos permite consultar el estado de un fichero:
    >> File.stat("calif.rb")
    => #<File::Stat dev=0xe000002, ino=29688777, mode=0100644, nlink=1, uid=501, gid=20, rdev=0x0, size=296, blksize=4096, blocks=8, atime=Tue Oct 18 12:17:42 +0100 2011, mtime=Mon Oct 17 22:12:56 +0100 2011, ctime=Mon Oct 17 22:12:56 +0100 2011>
    
    Por ejemplo, el método mtime permite ver la fecha de la última modificación de un fichero:
    >> File.stat("calif.rb").mtime
    => Mon Oct 17 22:12:56 0100 2011
    >> File.stat("calif.rb").mtime.class
    => Time
    >> File.stat("calif.rb").mtime.to_i
    => 1318885976
    >> File.stat("case.rb").mtime
    => Mon Sep 26 08:12:29 0100 2011
    >> File.stat("case.rb").mtime.to_i
    => 1317021149
    >> File.stat("case.rb").mtime < File.stat("calif.rb").mtime
    => true
    
    ¿Cuales son las salidas de los siguientes comandos?
    >> files = Dir['c*.rb']
    => ["calif.rb", "case.rb", "chuchu.rb", "closure.rb"]
    >> sf = files.collect { |f| [File.stat(f).mtime, f] }
    => [[Mon Oct 17 22:12:56 0100 2011, "calif.rb"], [Mon Sep 26 08:12:29 0100 2011, "case.rb"], [Mon Oct 10 12:51:38 0100 2011, "chuchu.rb"], [Fri Oct 07 16:27:40 0100 2011, "closure.rb"]]
    >> tf = sf.sort
    => 
    >> tf.collect { |f| f[1] }
    =>
    
    Esta forma de ordenar un Array según ciertos valores, denominada Schwartzian Transform, consiste en tres pasos:
    1. Crear un array de pares manteniendo la correspondencia entre cada elemento del array y el valor asociado
    2. Ordenar el array de pares de acuerdo a la primera componente. El orden de arrays es el lexicográfico:
      >> [2,"a"] <=> [2,"b"]
      => -1
      >> [2,"b"] <=> [2,"a"]
      => 1
      >> [2,"b"] <=> [2,"b"]
      => 0
      
    3. Proyectar el array ordenado en la segunda componente
  3. El método sort_by ordena utilizando un conjunto de claves generadas a partir de los valores usando un bloque dado:
    >> %w{apple pear fig}.sort_by { |w| -w.length }
    => ["apple", "pear", "fig"]
    
    Para hacerlo utiliza el algoritmo Schwartzian Transform.

    ¿Cuál es la salida de esta sentencia?

    >> Dir['c*.rb'].sort_by { |f| File.stat(f).mtime }
    =>
    
  4. ¿Cuales son las salidas de los siguientes comandos?
    >> h = { :a => 3, :b => 2, :c => 1 }
    => {:b=>2, :c=>1, :a=>3}
    >> h.sort_by { |x| x[1] }
    => [[:c, 1], [:b, 2], [:a, 3]]
    >> h.sort_by { |x| x[1] }.collect { |z| z[0] }
    =>
    

Casiano Rodriguez León 2015-01-07