Elementos finales
Definir la función
finales :: Int -> [a] -> [a]
tal que (finales n xs)
es la lista formada por los n
finales elementos de xs
. Por ejemplo,
finales 3 [2,5,4,7,9,6] == [7,9,6]
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import Test.QuickCheck -- 1ª definición finales1 :: Int -> [a] -> [a] finales1 n xs = drop (length xs - n) xs -- 2ª definición finales2 :: Int -> [a] -> [a] finales2 n xs = reverse (take n (reverse xs)) -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_finales :: Int -> [Int] -> Bool prop_finales n xs = finales1 n xs == finales2 n xs -- La comprobación es -- λ> quickCheck prop_finales -- +++ OK, passed 100 tests.
El código se encuentra en GitHub
Soluciones en Python
from typing import TypeVar from hypothesis import given, strategies as st A = TypeVar('A') # 1ª definición def finales1(n: int, xs: list[A]) -> list[A]: if len(xs) <= n: return xs return xs[len(xs) - n:] # 2ª definición def finales2(n: int, xs: list[A]) -> list[A]: if n == 0: return [] return xs[-n:] # 3ª definición def finales3(n: int, xs: list[A]) -> list[A]: ys = list(reversed(xs)) return list(reversed(ys[:n])) # La propiedad de equivalencia es @given(st.integers(min_value=0), st.lists(st.integers())) def test_equiv_finales(n, xs): assert finales1(n, xs) == finales2(n, xs) == finales3(n, xs) # La comprobación es # src> poetry run pytest -q elementos_finales.py # 1 passed in 0.18s
El código se encuentra en GitHub
Comentarios
- La longitud de la lista
xs
se calcula - en Haskell, con
length xs
y - en Python, con
len(xs)
.