Skip to content

Instantly share code, notes, and snippets.

@amsterdatech
Created December 12, 2011 04:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amsterdatech/5207019f56522e4c8866 to your computer and use it in GitHub Desktop.
Save amsterdatech/5207019f56522e4c8866 to your computer and use it in GitHub Desktop.
Quem o Luca deve convidar para dividir uma pizza que tenha um gosto mais parecido com o dele?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Distancia Euclideana é um metodo para calcular uma pontuação baseada em quanto 2 coisas são similares.
;O valores sempre estão no intervalo entre 0 e 1, onde 1 significa que 2 coisas são identicas e 0 que não ;possuem nada em comum.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def pizza_prefs
{"Renato" {"Margarita" 4 "Quatro queijos" 5
"Escarola" 4 "Portuguesa" 5
"Frango+Catupiry" 4 "Napolitana" 3}
"Marcelo" {"Margarita" 2 "Quatro queijos" 2
"Escarola" 1 "Portuguesa" 3
"Frango+Catupiry" 5 "Napolitana" 2}
"Lennon" {"Margarita" 4 "Quatro queijos" 5
"Escarola" 2 "Portuguesa" 1
"Frango+Catupiry" 1 "Napolitana" 3}
"Renata" {"Margarita" 4 "Quatro queijos" 5
"Escarola" 1 "Portuguesa" 1
"Frango+Catupiry" 3 "Napolitana" 4}
"Washington" {"Margarita" 1 "Quatro queijos" 1
"Escarola" 2 "Portuguesa" 3
"Frango+Catupiry" 4 "Napolitana" 3}
"Tino"{"Margarita" 1 "Quatro queijos" 5
"Escarola" 1 "Portuguesa" 4
"Frango+Catupiry" 3 "Napolitana" 2}
"Luca"{"Margarita" 5 "Quatro queijos" 3
"Escarola" 3 "Portuguesa" 4
"Frango+Catupiry" 3 "Napolitana" 2}})
(defn euclidean [pessoa1 pessoa2]
(let [items-em-comum (filter pessoa1 (keys pessoa2))
score (reduce (fn[scr mv]
(let [score1 (pessoa1 mv)
score2 (pessoa2 mv)]
(+ scr (Math/pow (- score1 score2) 2))))
0 items-em-comum)]
(if (= (count items-em-comum) 0)
0
(/ 1 (+ 1 score)))))
(defn sort-by-similarity [pizza-prefs pessoa]
(sort-by second
(reduce (fn[h p]
(let [name (first p)
prefs (second p)
similarity (euclidean pessoa prefs)]
(assoc h name similarity) )) {} pizza_prefs)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Para achar quem o Luca deve convidar para dividir uma pizza
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(sort-by-similarity pizza_prefs (pizza_prefs "Luca"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment