Autor Tema: L-99 Problems, soluciones a algunos problemas en Clojure  (Leído 16 veces)

Aureo

  • Dioses
  • Noobs
  • *
  • Mensajes: 8
  • Karma: +0/-0
  • UTC -5
    • Ver Perfil
    • QuantoPi Systems
L-99 Problems, soluciones a algunos problemas en Clojure
« en: Enero 06, 2021, 02:32:12 am »
Bienvenue voyageur !
Coucou tous le monde, espero que estén teniendo unas buenas vacaciones ...
Hace unas semanas encontré que hace mucho un profesor que enseñaba Prolog en una universidad, escribió en su web un conjunto de problemas para Prolog y tener una mayor practica en este lenguaje, sin embargo, esta lista ha sido resuelta en otros lenguajes: Lisp, Haskell, Python, Ocaml, entre muchos otros más. He decido traer las primeras 6 soluciones referente a listas; escritas en un dialecto de Lisp, Clojure, que en teoria podrian servir en cualquier otro lenguaje de la familia Lisp(Scheme, Common Lisp o Racket).
Si quieres solucionar o darle un vistazo a los problemas puedes encontrarlos aquí:
P-99 | Versión de Prolog
L-99 | Versión de Lisp
Editor e interprete de Clojure en Linea





Encontrar el ultimo elemento de una lista
Esto lo podemos solucionar facilmente haciendo lo siguiente: Contamos cuantos elementos tiene la lista y entonces le pedimos a la computadora que de ese total de elementos que hay en la lista, le reste uno (ya que en Clojure las listas se cuentan desde el 0) y devuelva de la lista el elemento ubicado en esa resta. Para esto nos apoyaremos de dos funciones en el catalogo de Clojure: nth y count, nth devuelve la ubicacion respecto a un parametro dentro de una lista osea:
(nth lista numero)
Donde le pasamos una lista y un número, el cual es la ubicación que quieres devolver
(count lista)
En esta solo nos pide una lista y nos devuelve cuantos elementos tiene

Código: [Seleccionar]
(defn ultimo [list-A]
    (list (nth list-A (- (count list-A) 1))))

(Ojo: hay que devolver una lista, el problema no lo dice, así que si devuelves un número tampoco hay problema, pero lo correcto es una lista.)
Encontrar los últimos dos elementos de una lista
Este es como el anterior solo que sera diferente

Código: [Seleccionar]
(defn penultimos [list-B]
    (list (nth list-B (- (count list-B) 2)
    (nth list-B (- (count list-B) 1)))))

Aquí explicare un par de cosas: la función no hace nada más que crear una lista(La cual retorna) de dos parámetros, que son iguales a la función del problema anterior, solo que el primer "nth" hace referencia a la cardinalidad de la lista menos 2 para obtener el penúltimo elemento y el otro parámetro devuelve el último.


Encontrar el k-ésimo elemento de una lista
Este problema es muy sencillo en realidad, ya hay una función en Clojure que puede hacer eso por ti, que ya mencionamos, pero para resolverla nosotros podemos hacer lo siguiente:

Código: [Seleccionar]
(defn elemento-en [list-C index-A]
    (nth list-C (- index-A 1))) ; En este caso solamente le restamos 1 para obtener el elemento correcto.


Encontrar el número de elementos de una lista
También hay una función en Clojure que devuelve esto, aquí una solución usando doseq:
Código: [Seleccionar]
(defn num-items [list-D]
    (doseq [n list-D] (def elements n)))

Esto es igual a hacer un foreach, "Por cada elemento de n en list-D, hacer: definir elements igual a n". y al final retorna elements.

Encontrar el reverso de una lista
Este no tiene mucho sentido ya que hay una función que lo hace por ti, de hecho no tiene en sí una descripción.
Código: [Seleccionar]
(defn reverso [lista] (reverse lista))En otro momento editare esta parte poniendo un código diferente que lo resuelva.
Encontrar si una lista es palindromo
Un palindromo es aquel conjunto o palabra que al revés es lo mismo que si no lo estuviera, ejemplo: "radar" al revés es "radar". aquí usaremos un operador de comparación: "=" que es quizás diferente a lo que vemos en otros lenguajes, jeje.
Código: [Seleccionar]
(defn palindromo? [lista-E] (= listaE (reverse lista E)))
En esta solución se puede resumir en que hemos pedido a la función a que compare si "lista-E" es igual al reverso de esa misma lista, la cual debe de retornar Verdad si es palindromo y falso si no, ¿Sencillo no?





Los dialectos de Lisp son muy interesantes, en este caso Clojure es un poco tanto cercano a lenguajes tipo C++ y Java y la ventaja de usar librerías de este ultimo le puede dar un empujón a ser más importante en algunos años como dialecto, aunque actualmente tiene aplicaciones siendo usado del lado del servidor, pero el aporte de Java y poder llamar a hacer ciertas acciones le da una gran ventaja a este lenguaje, espero esto les haya interesado, iré cambiando algunas cosas mañana, hay unos problemas que no me gusto dejarlos así y que quiero cambiar, pero bueno, un saludo a todos ustedes =).
Je suis le wolf du Nord
-Aurelio Kacynski
https://quantosystems.neocities.org/