Ya que por todos lados dicen que para ser un groso programador hay que saber Lisp con mi amigo Cucu nos pusimos a aprenderlo.
El primer reto fue implementar RLE (Run Lentgth Encoding), o sea dada una lista
rle '(1 1 1 2 2 3) = ((1 3) (2 2) 3)
A mi no gustó que Cucu haya definido el tipo de dato es distinto dependiendo de si hay o no repeticiones pero no iba a discutir un detalle tan nimio.
Y sin más acá les dejo mi solución:
(defun make-elem (c n)
(cond ((eq 1 n) (list c))
(t (list (list c n))))
)
(defun acum (c n r)
(cond ((null r) (make-elem c n))
((eq c (first r)) (acum c (+ 1 n) (rest r)))
(t (append (make-elem c n) (rle r))))
)
(defun rle (l)
(cond ((null l) nil)
(t (acum (first l) 1 (rest l))))
)
PD: Mi solución es más elegante que de Cucu, espero que se anime a postear la suya o al menos que pique en el amor propio para mejorarla!!
Ya vas a ver cuando aprenda un poco mas, te la voy a “menjorar” (SIC) un monton!
Ya mejore la entrada. Pero no vale encontrar errores en la redacción para escaparse por la tangente.
Aguante lisp y sus parentesis, como los extranio!