26 lines
783 B
Clojure
26 lines
783 B
Clojure
(ns rosettacode.24game.solve
|
|
(:require [clojure.math.combinatorics :as c]
|
|
[clojure.walk :as w]))
|
|
|
|
(def ^:private op-maps
|
|
(map #(zipmap [:o1 :o2 :o3] %) (c/selections '(* + - /) 3)))
|
|
|
|
(def ^:private patterns '(
|
|
(:o1 (:o2 :n1 :n2) (:o3 :n3 :n4))
|
|
(:o1 :n1 (:o2 :n2 (:o3 :n3 :n4)))
|
|
(:o1 (:o2 (:o3 :n1 :n2) :n3) :n4)))
|
|
|
|
(defn play24 [& digits]
|
|
{:pre (and (every? #(not= 0 %) digits)
|
|
(= (count digits) 4))}
|
|
(->> (for [:let [digit-maps
|
|
(->> digits sort c/permutations
|
|
(map #(zipmap [:n1 :n2 :n3 :n4] %)))]
|
|
om op-maps, dm digit-maps]
|
|
(w/prewalk-replace dm
|
|
(w/prewalk-replace om patterns)))
|
|
(filter #(= (eval %) 24))
|
|
(map println)
|
|
doall
|
|
count))
|