Menu Close

Día: 23 agosto, 2022

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).