diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2013-08-25 20:45:11 (GMT) |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2013-08-25 20:45:11 (GMT) |
commit | eb84ab541306f17cf211b4b6223e5adf65af0c45 (patch) | |
tree | fcab78a7e4b47068ac9937b00d61656ffcc84b4a | |
parent | aae0e36cb0e4f551242fd27db25041dc67865e7a (diff) |
Add Spanish versions of the part 2 exercises
-rw-r--r-- | exercises/es/10_def.py | 34 | ||||
-rw-r--r-- | exercises/es/10_def_solucion.py | 51 | ||||
-rw-r--r-- | exercises/es/11_recursividad.py | 28 | ||||
-rw-r--r-- | exercises/es/11_recursividad_solucion.py | 33 | ||||
-rw-r--r-- | exercises/es/12_crear-clase.py | 44 | ||||
-rw-r--r-- | exercises/es/12_crear-clase_solucion.py | 64 | ||||
-rw-r--r-- | exercises/es/13_extender-clase.py | 37 | ||||
-rw-r--r-- | exercises/es/13_extender-clase_solucion.py | 73 | ||||
-rw-r--r-- | exercises/es/14_propriedad.py | 50 | ||||
-rw-r--r-- | exercises/es/14_propriedad_solucion.py | 53 | ||||
-rw-r--r-- | exercises/es/15_métodos-privadas.py | 52 | ||||
-rw-r--r-- | exercises/es/15_métodos-privadas_solucion.py | 55 |
12 files changed, 574 insertions, 0 deletions
diff --git a/exercises/es/10_def.py b/exercises/es/10_def.py new file mode 100644 index 0000000..b68fe44 --- /dev/null +++ b/exercises/es/10_def.py @@ -0,0 +1,34 @@ +#!/usr/bin/python +# coding=utf-8 + +import math + +"""Definir una función para el cálculo de la media aritmética de una lista de +enteros. + +Debe definir una nueva función, arithmetic_mean, que tiene una lista de enteros +como único parámetro, y devuelve un solo número de punto flotante que es la +media aritmética. + +Recuerde documentar su función mediante una docstring! + +Extensión: Definir una segunda función, geometric_mean, que tiene el mismo +parámetro, pero que devuelve un solo número de punto flotante que es la +media geométrica de los parámetros: +http://es.wikipedia.org/wiki/Media_geométrica. Para ello, tendrá la función +math.pow(). +""" + +# Defina sus funciónes aquí. + +# Código de probar sus funciónes. No modifique nada por debajo de esta línea. +assert(arithmetic_mean([5]) == 5) +assert(arithmetic_mean([1, 2, 3]) == 2) +assert(arithmetic_mean([2, 2, 2]) == 2) +assert(arithmetic_mean.__doc__ is not None) + +if geometric_mean is not None: + assert(geometric_mean([5]) == 5) + assert(geometric_mean([2, 2]) == 2) + assert(geometric_mean([1, 2, 3]) == pow(6, 1.0 / 3.0)) + assert(geometric_mean.__doc__ is not None) diff --git a/exercises/es/10_def_solucion.py b/exercises/es/10_def_solucion.py new file mode 100644 index 0000000..460481f --- /dev/null +++ b/exercises/es/10_def_solucion.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +# coding=utf-8 + +import math + +"""Definir una función para el cálculo de la media aritmética de una lista de +enteros. + +Debe definir una nueva función, arithmetic_mean, que tiene una lista de enteros +como único parámetro, y devuelve un solo número de punto flotante que es la +media aritmética. + +Recuerde documentar su función mediante una docstring! + +Extensión: Definir una segunda función, geometric_mean, que tiene el mismo +parámetro, pero que devuelve un solo número de punto flotante que es la +media geométrica de los parámetros: +http://es.wikipedia.org/wiki/Media_geométrica. Para ello, tendrá la función +math.pow(). +""" + +def arithmetic_mean(number_list): + """Calcular la media aritmética de la lista entero de entrada.""" + total = 0 + count = 0 + for i in number_list: + total += i + count += 1 + return float(total) / count + +def geometric_mean(number_list): + """Calcular la media geométrica de la lista entero de entrada.""" + product = 1 + count = 0 + for i in number_list: + product *= i + count += 1 + return pow(product, 1.0 / float(count)) + + +# Código de probar sus funciónes. No modifique nada por debajo de esta línea. +assert(arithmetic_mean([5]) == 5) +assert(arithmetic_mean([1, 2, 3]) == 2) +assert(arithmetic_mean([2, 2, 2]) == 2) +assert(arithmetic_mean.__doc__ is not None) + +if geometric_mean is not None: + assert(geometric_mean([5]) == 5) + assert(geometric_mean([2, 2]) == 2) + assert(geometric_mean([1, 2, 3]) == pow(6, 1.0 / 3.0)) + assert(geometric_mean.__doc__ is not None) diff --git a/exercises/es/11_recursividad.py b/exercises/es/11_recursividad.py new file mode 100644 index 0000000..e1db33f --- /dev/null +++ b/exercises/es/11_recursividad.py @@ -0,0 +1,28 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Definir una función recursiva para calcular el máximo común denominador. + +Debe definir una nueva función, mcd (que significa "máximo común denominador"), +que toma dos enteros como parámetros y devuelve un entero que es el máximo común +denominador de los dos. Este es el número entero más grande que divide los dos +números de manera uniforme. + +Una manera fácil de implementar esto es usar el algoritmo de Euclides: + http://es.wikipedia.org/wiki/Algoritmo_de_Euclides + +Su función debe ser implementado utilizando recursividad. + +Recuerde documentar su función mediante una docstring! +""" + +# Escribe su nuevo función aquí. + + +# Código para probar su función. No modifique nada por debajo de esta línea. +assert(mcd(1, 1) == 1) +assert(mcd(10, 12) == 2) +assert(mcd(12, 10) == 2) +assert(mcd(5, 0) == 5) +assert(mcd(0, 5) == 5) +assert(mcd.__doc__ is not None) diff --git a/exercises/es/11_recursividad_solucion.py b/exercises/es/11_recursividad_solucion.py new file mode 100644 index 0000000..7479b07 --- /dev/null +++ b/exercises/es/11_recursividad_solucion.py @@ -0,0 +1,33 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Definir una función recursiva para calcular el máximo común denominador. + +Debe definir una nueva función, mcd (que significa "máximo común denominador"), +que toma dos enteros como parámetros y devuelve un entero que es el máximo común +denominador de los dos. Este es el número entero más grande que divide los dos +números de manera uniforme. + +Una manera fácil de implementar esto es usar el algoritmo de Euclides: + http://es.wikipedia.org/wiki/Algoritmo_de_Euclides + +Su función debe ser implementado utilizando recursividad. + +Recuerde documentar su función mediante una docstring! +""" + +def mcd(x, y): + """Calcular el máximo común denominador de x e y.""" + if y == 0: + return x + else: + return mcd(y, x % y) + + +# # Código para probar su función. No modifique nada por debajo de esta línea. +assert(mcd(1, 1) == 1) +assert(mcd(10, 12) == 2) +assert(mcd(12, 10) == 2) +assert(mcd(5, 0) == 5) +assert(mcd(0, 5) == 5) +assert(mcd.__doc__ is not None) diff --git a/exercises/es/12_crear-clase.py b/exercises/es/12_crear-clase.py new file mode 100644 index 0000000..bcf499f --- /dev/null +++ b/exercises/es/12_crear-clase.py @@ -0,0 +1,44 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Defina una clase RegularPolygon que implementa algunos métodos +especificados. + +Debe definir una nueva clase, RegularPolygon, para representar un polígono +regular arbitraria. Debe tener los siguientes métodos: + - __init__(self, lados): que almacena el número de lados del polígono tiene + en una variable en la clase + - get_name(self): que siempre vuelve "Desconocido polígono" (que se utilizará + en el ejercicio 13) + - get_sides(self): que devuelve el número de lados del polígono + - get_interior_angle(self): que devuelve el tamaño (en grados) de un único + ángulo interno en el polígono (por ejemplo, 60 + para un triángulo, 90 para un cuadrado, etc) + - get_total_interior_angles(self): que devuelve el ángulo interno total en el + polígono en grados (por ejemplo, 180 para + un triángulo, 360 para un cuadrado, etc) + +Recuerde documentar su clase y todos sus métodos utilizando docstrings! +""" + +# Escribe su clase aquí. + + +# Código de probar su clase. No modifique nada por debajo de esta línea. +triangle = RegularPolygon(3) +assert(triangle.get_name() == 'Desconocido polígono') +assert(triangle.get_sides() == 3) +assert(triangle.get_interior_angle() == 60) +assert(triangle.get_total_interior_angle() == 180) + +square = RegularPolygon(4) +assert(square.get_name() == 'Desconocido polígono') +assert(square.get_sides() == 4) +assert(square.get_interior_angle() == 90) +assert(square.get_total_interior_angle() == 360) + +assert(RegularPolygon.__doc__ is not None) +assert(RegularPolygon.get_name.__doc__ is not None) +assert(RegularPolygon.get_sides.__doc__ is not None) +assert(RegularPolygon.get_interior_angle.__doc__ is not None) +assert(RegularPolygon.get_total_interior_angle.__doc__ is not None) diff --git a/exercises/es/12_crear-clase_solucion.py b/exercises/es/12_crear-clase_solucion.py new file mode 100644 index 0000000..cb62abe --- /dev/null +++ b/exercises/es/12_crear-clase_solucion.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Defina una clase RegularPolygon que implementa algunos métodos +especificados. + +Debe definir una nueva clase, RegularPolygon, para representar un polígono +regular arbitraria. Debe tener los siguientes métodos: + - __init__(self, lados): que almacena el número de lados del polígono tiene + en una variable en la clase + - get_name(self): que siempre vuelve "Desconocido polígono" (que se utilizará + en el ejercicio 13) + - get_sides(self): que devuelve el número de lados del polígono + - get_interior_angle(self): que devuelve el tamaño (en grados) de un único + ángulo interno en el polígono (por ejemplo, 60 + para un triángulo, 90 para un cuadrado, etc) + - get_total_interior_angles(self): que devuelve el ángulo interno total en el + polígono en grados (por ejemplo, 180 para + un triángulo, 360 para un cuadrado, etc) + +Recuerde documentar su clase y todos sus métodos utilizando docstrings! +""" + +class RegularPolygon(object): + """Un polígono regular con un número determinado de lados.""" + def __init__(self, sides): + self._sides = sides + + def get_name(self): + """Obtener el nombre legible del polígono.""" + return 'Desconocido polígono' + + def get_sides(self): + """Obtener el número de lados del polígono.""" + return self._sides + + def get_interior_angle(self): + """Obtener un solo ángulo interior, en grados.""" + return 180 - (360 / self._sides) + + def get_total_interior_angle(self): + """Obtener la suma de los ángulos interiores en el polígono, en + grados.""" + return self._sides * self.get_interior_angle() + + +# Código de probar su clase. No modifique nada por debajo de esta línea. +triangle = RegularPolygon(3) +assert(triangle.get_name() == 'Desconocido polígono') +assert(triangle.get_sides() == 3) +assert(triangle.get_interior_angle() == 60) +assert(triangle.get_total_interior_angle() == 180) + +square = RegularPolygon(4) +assert(square.get_name() == 'Desconocido polígono') +assert(square.get_sides() == 4) +assert(square.get_interior_angle() == 90) +assert(square.get_total_interior_angle() == 360) + +assert(RegularPolygon.__doc__ is not None) +assert(RegularPolygon.get_name.__doc__ is not None) +assert(RegularPolygon.get_sides.__doc__ is not None) +assert(RegularPolygon.get_interior_angle.__doc__ is not None) +assert(RegularPolygon.get_total_interior_angle.__doc__ is not None) diff --git a/exercises/es/13_extender-clase.py b/exercises/es/13_extender-clase.py new file mode 100644 index 0000000..c6885c0 --- /dev/null +++ b/exercises/es/13_extender-clase.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Definir clases Triangle y Square que se extienden RegularPolygon. + +Debe definir dos nuevas clases, Triangle y Square, que representan triángulos +regulares y cuadrados. Ambos deben heredar de RegularPolygon. + +Además de contar con todos los métodos de RegularPolygon, que más prevalecen +tanto el método de RegularPolygon get_name() para que devuelva 'Triángulo' o +'Cuadrado' en vez de 'Desconocido polígono'. + +Recuerde documentar sus clases y sus métodos utilizando docstrings! +""" + +# Copie la clase RegularPolygon del ejercicio anterior aquí, sin modificar. + +# Añada sus nuevas clases hijas aquí. + + +# Código de probar sus clases. No modifique nada por debajo de esta línea. +triangle = Triangle() +assert(triangle.get_name() == 'Triángulo') +assert(triangle.get_sides() == 3) +assert(triangle.get_interior_angle() == 60) +assert(triangle.get_total_interior_angle() == 180) + +square = Square() +assert(square.get_name() == 'Cuadrado') +assert(square.get_sides() == 4) +assert(square.get_interior_angle() == 90) +assert(square.get_total_interior_angle() == 360) + +assert(Triangle.__doc__ is not None) +assert(Triangle.get_name.__doc__ is not None) +assert(Square.__doc__ is not None) +assert(Square.get_name.__doc__ is not None) diff --git a/exercises/es/13_extender-clase_solucion.py b/exercises/es/13_extender-clase_solucion.py new file mode 100644 index 0000000..f0b41e0 --- /dev/null +++ b/exercises/es/13_extender-clase_solucion.py @@ -0,0 +1,73 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Definir clases Triangle y Square que se extienden RegularPolygon. + +Debe definir dos nuevas clases, Triangle y Square, que representan triángulos +regulares y cuadrados. Ambos deben heredar de RegularPolygon. + +Además de contar con todos los métodos de RegularPolygon, que más prevalecen +tanto el método de RegularPolygon get_name() para que devuelva 'Triángulo' o +'Cuadrado' en vez de 'Desconocido polígono'. + +Recuerde documentar sus clases y sus métodos utilizando docstrings! +""" + +class RegularPolygon(object): + """Un polígono regular con un número determinado de lados.""" + def __init__(self, sides): + self._sides = sides + + def get_name(self): + """Obtener el nombre legible del polígono.""" + return 'Desconocido polígono' + + def get_sides(self): + """Obtener el número de lados del polígono.""" + return self._sides + + def get_interior_angle(self): + """Obtener un solo ángulo interior, en grados.""" + return 180 - (360 / self._sides) + + def get_total_interior_angle(self): + """Obtener la suma de los ángulos interiores en el polígono, en + grados.""" + return self._sides * self.get_interior_angle() + +class Triangle(RegularPolygon): + """Un triángulo equilátero regular.""" + def __init__(self): + super(Triangle, self).__init__(3) + + def get_name(self): + """Obtener el nombre legible del triángulo.""" + return 'Triángulo' + +class Square(RegularPolygon): + """Un cuadrado regular.""" + def __init__(self): + super(Square, self).__init__(4) + + def get_name(self): + """Obtener el nombre legible del triángulo.""" + return 'Cuadrado' + + +# Código de probar sus clases. No modifique nada por debajo de esta línea. +triangle = Triangle() +assert(triangle.get_name() == 'Triángulo') +assert(triangle.get_sides() == 3) +assert(triangle.get_interior_angle() == 60) +assert(triangle.get_total_interior_angle() == 180) + +square = Square() +assert(square.get_name() == 'Cuadrado') +assert(square.get_sides() == 4) +assert(square.get_interior_angle() == 90) +assert(square.get_total_interior_angle() == 360) + +assert(Triangle.__doc__ is not None) +assert(Triangle.get_name.__doc__ is not None) +assert(Square.__doc__ is not None) +assert(Square.get_name.__doc__ is not None) diff --git a/exercises/es/14_propriedad.py b/exercises/es/14_propriedad.py new file mode 100644 index 0000000..dbb79a0 --- /dev/null +++ b/exercises/es/14_propriedad.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Convertir un par de métodos en una clase como una propiedad en su lugar. + +La clase más abajo utiliza un par de métodos, get_size() y set_size(), para +leer y escribir el tamaño del triángulo de Pascal que representa. Debe añadir +una nueva propiedad, tamaño de la clase, que envuelve estos dos métodos. + +Usted no tiene que modificar cualquiera de los métodos existentes en la clase. + +Recuerde documentar sus adiciones usando docstrings! +""" + +class PascalTriangle(object): + """Una representación del triángulo de Pascal. + + El tamaño (número de células en la base) del triángulo se puede ajustar. + Los valores de las celdas se almacenan en una lista de tuplas de (índice + de célula, valor) que se adjunta a cada vez que el usuario rellena + correctamente una célula. + """ + def __init__(self, size): + self._size = size + self._cell_values = [] + + def set_cell_value(self, cell, val): + """Establecer el valor de la celda dada con la proporcionada por el + usuario.""" + self._cell_values.append((cell, val)) + + def get_size(self): + """Obtener el tamaño del triángulo.""" + return self._size + + def set_size(self, size): + """Ajuste el tamaño de triángulo y borrar los valores de las celdas + introducidos por el usuario.""" + self._size = size + self._cell_values = [] + + +# Código para revisar sus clases. No modifique nada por debajo de esta línea. +triangle = PascalTriangle(4) +assert(triangle.size == 4) +triangle.size = 5 +assert(triangle.size == 5) + +assert(PascalTriangle.__doc__ is not None) +assert(PascalTriangle.size.__doc__ is not None) diff --git a/exercises/es/14_propriedad_solucion.py b/exercises/es/14_propriedad_solucion.py new file mode 100644 index 0000000..06a4c09 --- /dev/null +++ b/exercises/es/14_propriedad_solucion.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Convertir un par de métodos en una clase como una propiedad en su lugar. + +La clase más abajo utiliza un par de métodos, get_size() y set_size(), para +leer y escribir el tamaño del triángulo de Pascal que representa. Debe añadir +una nueva propiedad, tamaño de la clase, que envuelve estos dos métodos. + +Usted no tiene que modificar cualquiera de los métodos existentes en la clase. + +Recuerde documentar sus adiciones usando docstrings! +""" + +class PascalTriangle(object): + """Una representación del triángulo de Pascal. + + El tamaño (número de células en la base) del triángulo se puede ajustar. + Los valores de las celdas se almacenan en una lista de tuplas de (índice + de célula, valor) que se adjunta a cada vez que el usuario rellena + correctamente una célula. + """ + def __init__(self, size): + self._size = size + self._cell_values = [] + + def set_cell_value(self, cell, val): + """Establecer el valor de la celda dada con la proporcionada por el + usuario.""" + self._cell_values.append((cell, val)) + + def get_size(self): + """Obtener el tamaño del triángulo.""" + return self._size + + def set_size(self, size): + """Ajuste el tamaño de triángulo y borrar los valores de las celdas + introducidos por el usuario.""" + self._size = size + self._cell_values = [] + + # size propriedad + size = property(get_size, set_size) + + +# Código para revisar sus clases. No modifique nada por debajo de esta línea. +triangle = PascalTriangle(4) +assert(triangle.size == 4) +triangle.size = 5 +assert(triangle.size == 5) + +assert(PascalTriangle.__doc__ is not None) +assert(PascalTriangle.size.__doc__ is not None) diff --git a/exercises/es/15_métodos-privadas.py b/exercises/es/15_métodos-privadas.py new file mode 100644 index 0000000..767d4a5 --- /dev/null +++ b/exercises/es/15_métodos-privadas.py @@ -0,0 +1,52 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Factorizar un código común a partir de dos métodos en un nuevo método +privado. + +Parte del código en la clase a continuación se repite. Busque las dos líneas de +código repetido y moverlos a un nuevo método privado que debe ser llamado desde +los lugares se retiró el código duplicado desde. + +Recuerde documentar el nuevo método que utiliza una docstring! +""" + +class Counter(object): + """Un contador que se incrementa o se restablece. + + Esto podría ser utilizado para el recuento de las personas que pasan a + través de una puerta de entrada, para ejemplo. Cada vez que cambia el + valor de venta libre, se imprime el mismo mensaje. + """ + def __init__(self): + self._counter = 0 + + def get_counter(self): + """Devolver el valor del contador.""" + return self._counter + + def increment_counter(self): + """Incrementar el valor del contador e imprimir un mensaje.""" + self._counter += 1 + print('Contador es ahora: %i' % self._counter) + + def reset_counter(self): + """Restablecer el valor del contador a 0 e imprimir un mensaje.""" + self._counter = 0 + print('Contador es ahora: %i' % self._counter) + + +# Código de probar su clase. No modifique nada por debajo de esta línea. +counter = Counter() +assert(counter.get_counter() == 0) +counter.increment_counter() +assert(counter.get_counter() == 1) +counter.increment_counter() +assert(counter.get_counter() == 2) +counter.reset_counter() +assert(counter.get_counter() == 0) + +assert(Counter.__doc__ is not None) +assert(Counter.get_counter.__doc__ is not None) +assert(Counter.increment_counter.__doc__ is not None) +assert(Counter.reset_counter.__doc__ is not None) diff --git a/exercises/es/15_métodos-privadas_solucion.py b/exercises/es/15_métodos-privadas_solucion.py new file mode 100644 index 0000000..2d3ced6 --- /dev/null +++ b/exercises/es/15_métodos-privadas_solucion.py @@ -0,0 +1,55 @@ +#!/usr/bin/python +# coding=utf-8 + +"""Factorizar un código común a partir de dos métodos en un nuevo método +privado. + +Parte del código en la clase a continuación se repite. Busque las dos líneas de +código repetido y moverlos a un nuevo método privado que debe ser llamado desde +los lugares se retiró el código duplicado desde. + +Recuerde documentar el nuevo método que utiliza una docstring! +""" + +class Counter(object): + """Un contador que se incrementa o se restablece. + + Esto podría ser utilizado para el recuento de las personas que pasan a + través de una puerta de entrada, para ejemplo. Cada vez que cambia el + valor de venta libre, se imprime el mismo mensaje. + """ + def __init__(self): + self._counter = 0 + + def get_counter(self): + """Devolver el valor del contador.""" + return self._counter + + def __set_counter(self, counter): + """Establezca el valor del contador e imprimir un mensaje.""" + self._counter = counter + print('Contador es ahora: %i' % self._counter) + + def increment_counter(self): + """Incrementar el valor del contador e imprimir un mensaje.""" + self.__set_counter(self._counter + 1) + + def reset_counter(self): + """Restablecer el valor del contador a 0 e imprimir un mensaje.""" + self.__set_counter(0) + + +# Código de probar su clase. No modifique nada por debajo de esta línea. +counter = Counter() +assert(counter.get_counter() == 0) +counter.increment_counter() +assert(counter.get_counter() == 1) +counter.increment_counter() +assert(counter.get_counter() == 2) +counter.reset_counter() +assert(counter.get_counter() == 0) + +assert(Counter.__doc__ is not None) +assert(Counter.get_counter.__doc__ is not None) +assert(Counter.increment_counter.__doc__ is not None) +assert(Counter.reset_counter.__doc__ is not None) |