0votos

1 + 2 + 34 – 5 + 67 – 8 + 9 = 100 en Clojure

por josejuan hace 3 años

¡Prometo que no está ofuscado!

Encontrar todas las combinaciones tal que insertando + - o nada entre los números 1,2,...,9 (en este orden) dé como resultado 100 exactamente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(require '[clojure.core.match :refer [match]]) 
 
(defn joins [ys] 
  (match [ys] 
         [([      ] :seq)] [[ ]] 
         [([x     ] :seq)] [[x]] 
         [([x & xs] :seq)] (mapcat #(-> [(cons x %) (cons (Integer. (str x (first %))) (rest %))]) (joins xs)))) 
 
(defn signs [ys] 
  (match [ys] 
         [([      ] :seq)] [[ ]] 
         [([x & xs] :seq)] (mapcat #(-> [(cons x %) (cons (- x) %)]) (signs xs)))) 
 
(defn sum100 [] 
  (for [j (joins (range 1 10)) 
        c (map #(cons (first j) %) (signs (rest j))) 
        :when (= 100 (apply + c))] 
    c)) 
 
 
 
 
(defn showSum [xs] 
  (str (first xs) (apply str (map #(if (< % 0) (str %) (str "+" %)) (rest xs))))) 
 
(for [s (sum100)] (println (showSum s))) 
 
;;   user=> (load-file "suma100.clj") 
;;   123-4-5-6-7+8-9 
;;   1+23-4+56+7+8+9 
;;   12+3-4+5+67+8+9 
;;   1+2+34-5+67-8+9 
;;   123+45-67+8-9 
;;   1+2+3-4+5+6+78+9 
;;   1+23-4+5+6+78-9 
;;   12-3-4+5-6+7+89 
;;   12+3+4+5-6-7+89 
;;   123+4-5+67-89 
;;   123-45-67+89 
;;   (nil nil nil nil nil nil nil nil nil nil nil) 
;;   user=> 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.