Funciones en Clojure

{:deps {org.clojure/clojure {:mvn/version "1.10.3"}
        ;; complient is used for autocompletion
        ;; add your libs here (and restart the runtime to pick up changes)
        compliment/compliment {:mvn/version "0.3.9"}}}
Extensible Data Notation
{:hello (clojure-version)}
0.1s
(defn cuadrado
  "Devuelve n al cuadrado" 
  [n]
  {:pre [(int? n)]
   :post [(fn [x] (int? x))]}
  (* n n))
0.0s
(cuadrado 2.8 20)
0.0s
(cuadrado 10)
0.0s
(macroexpand '(defn cuadrado
                [n]
                (* n n)))
0.0s
(ns-interns *ns*)
0.0s

Crear una función que reparta una mano de cartas españolas.

  • El input serán dos colecciones representando los naipes y pintas respectivamente, y en un entero representando el número de cartas a repartir.

  • El output debe ser una colección, por ejemplo un vector, que contenga las cartas representadas en pares [numero :pinta]

Algoritmo:

  • Crear una colección de elementos aleatorios de los naipes

    • Obtener un elemento aleatorio de los naipes

  • Crear una colección de los elementos aleatorios de las pintas

    • Obtener un elemento aleatorio de las pintas

  • Devolver una colección donde cada elemento sea el producto de la unión de un elemento aleatorio de los naipes y un elemento aleatorio de las pintas.

(def numero-carta (concat (range 1 8) (range 10 13)))
0.0s
(def pintas [:bastos :oros :espadas :copas])
0.0s

(rand-nth numero-carta)
0.0s
(rand-nth pintas)
0.0s
(repeatedly 10 #(rand-nth pintas))
0.0s
(repeatedly 5 (fn [] (rand-nth numero-carta)))
0.0s
(def reparto-carta-num 10) 
0.0s
(let [reparto-carta-num (repeatedly 10 (fn [] (rand-nth numero-carta)))
      reparto-pintas (repeatedly 10 (fn [] (rand-nth pintas)))]
  (mapv (fn [carta-num pinta] [carta-num pinta]) reparto-carta-num reparto-pintas))
0.0s
(defn repartir-cartas
  "Devuelve una mano de n cartas del tipo de mazo codificado numeración de cartas y pintas"
  [n cartas pintas]
  (let [reparto-carta-num (repeatedly n (fn [] (rand-nth cartas)))
        reparto-pintas (repeatedly n (fn [] (rand-nth pintas)))]
    (mapv (fn [carta-num pinta] [carta-num pinta]) reparto-carta-num reparto-pintas)))
0.0s
(def resultado (repartir-cartas 9 numero-carta pintas))
0.0s
(sort-by second resultado)
0.0s
Runtimes (1)