Hola :-)
En realidad, podría no haber creado las funciones take-left y take-right, ambas existen
en una librería llamada SRFI-1 (listas), que viene en la mayoría de intérpretes de Scheme.
(o está disponible aquí: http://srfi.schemers.org/srfi-1/srfi-1.html )
Crearlas ha servido para aprender cómo funcionan por dentro, que era el objetivo del rollo. : -P
La solución en si, son las últimas 5 lineas.
En Scheme puedes meter cualquier cosa dentro de una lista, incluyendo una macro, un vector
otra lista, funciones, ficheros, clases, continuaciones.... equal? te asegura que compara los
elementos internos de cada átomo en una lista al comparar aunque esos elementos sean
a su vez listas, vectores o hash tables.
Ejemplillo... list-overlap comparando dos listas
que contienen sublistas, funciones y vectores...
(y que contienen además al propio list-overlap!)
(define (square x) (* x x))
(list-overlap '(square 20 (20 square) list-overlap #(vector 9 9 1))
'((20 square) list-overlap #(vector 9 9 1) 20)))
El programa muestra 3 por pantalla. : -)
Sobre tu primer algoritmo...
a = ["a", "b", "c", "p", "d", "d", "g"]
b = ["d", "d", "g", "h", "i"]
print solapamiento(a, b)
imprime 0, alguna cosilla hay mal por ahí : -P
El segundo funciona perfecto, es esencialmente lo mismo que recoger
elementos por izquierda o derecha, usando slices en Python. Como en Python
los slices son sintaxis propia del lenguaje queda muy limpio, es genial : -)
Sobre el método de los números perfectos...
El algoritmo de Euclides no es perfecto.
Se desconoce si hay por ejemplo números perfectos impares actualmente.
De todos modos, en la práctica es suficientemente bueno, puesto que usando el algoritmo
directo de todos los divisores sería tan lento que apenas conseguirías resultados.
EDIT: Sobre lo de C++...
Python o Scheme son lenguajes muy dinámicos, no sólo hay cosas que son mucho
más simples de hacer que en C++, sino que de hecho hay cosas que puedes hacer
en ellos que serían imposibles de hacer en C++. (por ejemplo, las continuaciones de
Scheme, o cosas que usen reflexión dinámica, las funciones anónimas...)
También hay que decir que C++ es más eficiente en velocidad de proceso y tiene acceso
a un bajo nivel que ni Python ni Scheme (ni Perl, Ruby etc...) tocan. El tipado fuerte de C++
también ayuda a ver errores en tiempo de compilación. En Python suelen suceder en tiempo
de ejecución. En Scheme lo mismo. (salvo en Typed Scheme o Oaklisp que son estáticos).
(PD: Tanta parrafada para decir que su objetivo es diferente xD)