ejercicios-ruby-v1.pdf

9
Ejercicios de Programaci´ on con Ruby Ingenier´ ıa de Sistemas de Informaci´ on Departamento de Sistemas Telem´ aticos y Computaci´ on (GSyC) 18 de septiembre de 2012 Notas: 1. Al lado de cada ejercicio aparecen una o m´ as cruces, en funci´ on de su dificultad y de la cantidad de tiempo estimado que requiere. Cuantas m´ as cruces tenga un ejercicio m´ as dif´ ıcil es o m´ as tiempo puede requerir. 2. Aparte de las transparencias que estamos usando en clase, utiliza ri y la siguiente documentaci´ on de Ruby: Documentaci´ on online de Ruby: http://ruby-doc.org/core-1.9.3/ API de la biblioteca est´ andar de Ruby: http://ruby-doc.org/ Libro Programming Ruby : http://ruby-doc.org/docs/ProgrammingRuby/ 3. Utiliza este resumen sobre el uso de expresiones regulares en Ruby: Figura 1: Fuente: Engineering Long-Lasting Software. Armando Fox, David Patterson 1

Upload: cesar-denova-lozano

Post on 16-Nov-2015

24 views

Category:

Documents


2 download

TRANSCRIPT

  • Ejercicios de Programacion con Ruby

    Ingeniera de Sistemas de Informacion

    Departamento de Sistemas Telematicos y Computacion (GSyC)

    18 de septiembre de 2012

    Notas:

    1. Al lado de cada ejercicio aparecen una o mas cruces, en funcion de su dificultad y de la cantidad de tiempoestimado que requiere. Cuantas mas cruces tenga un ejercicio mas difcil es o mas tiempo puede requerir.

    2. Aparte de las transparencias que estamos usando en clase, utiliza ri y la siguiente documentacion de Ruby:

    Documentacion online de Ruby: http://ruby-doc.org/core-1.9.3/

    API de la biblioteca estandar de Ruby: http://ruby-doc.org/

    Libro Programming Ruby : http://ruby-doc.org/docs/ProgrammingRuby/

    3. Utiliza este resumen sobre el uso de expresiones regulares en Ruby:

    Figura 1: Fuente: Engineering Long-Lasting Software. Armando Fox, David Patterson

    1

  • Ejercicio 1 +Dada esta definicion de un metodo:

    def foo(arg, hash1, hash2)end

    Cual de las siguientes NO es una llamada legal al metodo foo?

    1. foo a, {:x=>1, :y=>2}, :z=>3

    2. foo(a, :x=>1, :y=>2, :z=>3)

    3. foo(a, {:x=>1, :y=>2}, {:z=>3})

    4. foo(a, {:x=>1}, {:y=>2, :z=>3})

    Ejercicio 2 +Dada la siguiente declaracion de la clase SavingsAccount:

    class SavingsAccount < Accountdef initialize(starting_balance=0)@balance = starting_balance

    enddef balance@balance

    enddef balance=(new_amount)@balance = new_amount

    enddef deposit(amount)@balance += amount

    end

    @@bank_name = "MyBank.com"def self.bank_name@@bank_name

    endend

    Indica cuales de las siguientes lneas son correctas:

    1. SavingsAccount.new.@balance

    2. SavingsAccount.new.balance

    3. SavingsAccount.new.balance()

    2

  • Ejercicio 3 +Dada esta asignacion:

    rx = {:primero=>/^rub/,primero=>[/RA(IL)$/, /ra(il)/i]}

    Cual de las siguientes expresiones se evaluara correctamente, devolviendo algo que no sea nil?

    1. "rubyonrails" =~ rx{:primero}

    2. rx[:primero][1] =~ "RUBYONRAILS"

    3. rx[primero][1] =~ "RUBYONRAIL"

    4. "rubyonrails" =~ rx[primero, 1]

    5. "rubyonrails" =~ rx[primero][0]

    Ejercicio 4 +Dada esta extension de la clase String:

    class Stringdef curvy?

    !("AEFHIKLMNTVWXYZ".include?(self.upcase))end

    end

    Cual de las siguientes lneas es correcta?:

    1. String.curvy?("foo")

    2. "foo".curvy?

    3. self.curvy?("foo")

    4. curvy?("foo")

    3

  • Ejercicio 5 +Se ha extendido la clase Numeric de la siguiente forma:

    class Numericdef euros

    self * 1.292end

    end

    Ahora se desea poder ejecutar esta lnea:

    5.euros.in(:rupias)

    Cual de los siguientes mecanismos sera mas apropiado?

    1. Cambiar Numeric.method_missing para que detecte llamadas al metodo in

    2. Cambiar Numeric#method_missing para que detecte llamadas al metodo in

    3. Definir un metodo Numeric#in

    4. Definir un metodo Numeric.in

    Ejercicio 6 +Cual de los siguientes string NO aparecera como resultado de ejecutar este codigo?:

    [banana, anana, naan].map do |food|food.reverse

    end.select { |f| f.match /^a/ }

    1. "naan"

    2. "ananab"

    3. "anana"

    4. El codigo no funcionara debido a errores de sintaxis

    Ejercicio 7 +Cuales de las siguientes expresiones de Ruby son equivalentes entre s?:

    A) :foo

    B) %q{foo}

    C) %Q{foo}

    D) foo.to_sym

    E) :foo.to_s

    4

  • Ejercicio 8 +Que se captura en $1 buscando en el string 25 to 1 las siguientes expresiones regulares?:

    /(\d+)$/

    /^\d+([^0-9]+)/

    Ejercicio 9 +Cuando es correcto utilizar la siguiente lnea en Ruby?:

    Fixnum num=3

    Ejercicio 10 +Por que al ejecutar 5.superclass se eleva una excepcion undefined method?.

    Ejercicio 11 +Escribe utilizando send las siguientes expresiones:

    1. a1, :b => 2

    Ejercicio 13 +Por que esta expresion es incorrecta en Ruby?:

    movie.@year=1998

    5

  • Ejercicio 14 ++Time.now devuelve el numero de segundos que han pasado desde las 00:00 GMT del 1/1/1970, que es la forma

    en que se representa una hora en Unix. Se ha extendido la clase Fixnum para poder hacer aritmetica con las horasutilizando expresiones como las siguientes:

    Time.now# => Mon Nov 07 10:18:10 -0800 20115.minutes.ago# => Mon Nov 07 10:13:15 -0800 20115.minutes - 4.minutes# => 603.hours.from_now# => Mon Nov 07 13:18:15 -0800 2011

    A continuacion se muestra la extension del codigo de la clase Fixnum que permite hacer este tipo de operaciones:

    class Fixnumdef seconds ; self ; enddef minutes ; self * 60 ; enddef hours ; self * 60 * 60 ; enddef ago ; Time.now - self ; enddef from_now ; Time.now + self ; end

    end

    Sin embargo, esta sentencia no se puede ejecutar: 1.minute.ago

    La razon es que no existe el metodo minute.

    El siguiente codigo soluciona este problema:

    class Fixnumdef method_missing(method_id, *args)name = method_id.to_sif name =~ /^(second|minute|hour)$/self.send(name + s)

    elsesuper # se llama al mismo metodo (method_missing) de clases ancestro

    endend

    end

    Explica por que son necesarios $ y ^ en la expresion regular de la lnea 4. Una pista: piensa que ocurrira si omitimosalguno de estos dos caracteres e intentamos hacer la siguiente llamada: 5.milliseconds o 5.secondary.

    6

  • Ejercicio 15 ++Anadele a la clase String un metodo palindromo? que devuelva true si la cadena es un palndromo (se lee igual delderecho que del reves), y false si no lo es. Ejemplos:

    "reconocer".palindromo? # => true"Reconocer".palindromo? # => true"Se van sus naves".palindromo? # => true"Pepe".palindromo? # => false

    Utiliza unicamente metodos de la siguiente lista (consulta la documentacion para saber que hacen):

    map, select, reject, uniqreverse, compact, flatten, partitionsort, sort_by, max, min,downcase

    Ejercicio 16 +Explica que ocurre cuando se ejecuta el siguiente codigo:

    class Fooinclude Enumerable

    endFoo.new.map { |e| puts e }

    Ejercicio 17 ++Explica para que sirve el siguiente codigo:

    module Enumerabledef every_nth(count)index = 0self.each do |elt|yield elt if index % count == 0index += 1

    endend

    end

    Ejercicio 18 +Cuantas clases ancestro tiene el objeto 5? Los siguientes metodos te ayudaran: class, superclass.

    7

  • Ejercicio 19 +Sabiendo que el metodo superclass devuelve nil cuando se le manda a BasicObject, escribe el codigo del metodoancestros que reciba como argumento cualquier objeto y muestre en pantalla la clase del objeto y sus clases ancestrohasta BasicObject.

    Ejercicio 20 +++Escribe codigo que permita que se puedan ejecutar sentencias como la siguiente:

    Time.now.at_beginning_of_year + 1.day# => 2012-01-02 00:00:00 -0800

    Estudia antes el codigo que se proporciona en el ejercicio 14, no siendo necesario que resuelvas aquel ejercicio antesde resolver este.

    Te vendra bien consultar la documentacion de Time.local y utilizar este metodo de clase.

    Ejercicio 21 +++Define un metodo attr_accessor_with_history que proporcione la misma funcionalidad que attr_accessor peroque lleve guarde la lista de valores que el atributo ha ido adoptando. Ejemplo de uso:

    class Fooattr_accessor_with_history :bar

    endf = Foo.new # => #f.bar = 3 # => 3f.bar = :wowzo # => :wowzof.bar = boo! # => boo!f.history(:bar) # => [3, :wowzo, boo!]

    8

  • Ejercicio 22 ++El modulo Enumerable define el iterador each_with_index que devuelve cada uno de los elementos enumerablejunto a un ndice que empieza en cero. Veamos un ejemplo de su uso:

    %w(alice bob carol).each_with_index do |person,index|puts ">> #{person} is number #{index}"

    end>> alice is number 0>> bob is number 1>> carol is number 2

    Escribe un iterador each_with_custom_index en el modulo Enumerable que permita fijar el valor inicial del ndiceque devolvera para el primer elemento, y el numero de saltos que debe ir dando el ndice al ir iterando. Ejemplo deuso:

    include Enumerable%w(alice bob carol).each_with_custom_index(3,2) do |person,index|puts ">> #{person} is number #{index}"

    end>> alice is number 3>> bob is number 5>> carol is number 7

    Ejercicio 23 ++En la sucesion de Fibonacci los dos primeros enteros son 1 y 1, y cada numero sucesivo es la suma de los dos previos.Crea una clase FibSequence que devuelva un iterador para los n primeros numeros de Fibonacci. Ejemplo de uso:

    f = FibSequence.new(6) # devuelve un iterador para los 6 primeros numeros# de la sucesion de Fibonacci

    f.each { |s| print(s,:) } # => 1:1:2:3:5:8:f.reject { |s| s.odd? } # => [2, 8]f.map { |x| 2*x } # => [2, 2, 4, 6, 10, 16]

    Recuerda que si la clase FibSequence implementa each, al incluir el modulo mix-in Enumerable se anaden losmetodos definidos en este modulo como reject, map,...

    Ejercicio 24 +++Implementa un iterador each_with_flattening que se comporte del siguiente modo:

    [1, [2, 3], 4, [[5, 6], 7]].each_with_flattening { |s| print "#{s}," }>> 1, 2, 3, 4, 5, 6, 7

    Ejercicio 25 +Anade al modulo Enumerable un nuevo iterador, each_permuted que devuelva los elementos de una coleccion enorden aleatorio. El iterador puede asumir que la coleccion responde al metodo each pero no debe esperar nada decada elemento.

    Utiliza el metodo rand.

    9