Someone I respect recommended Brilliant to me, and it turned out to be fun indeed; wish I had encountered it sooner.
Lots of little examples, to play with, and to learn from. I was stuck at something else today, so wrote a tiny program for one of these.
The problem is extremely simple (this post is more about using a flexible programming language recreationally, nothing else):
Are there basic arithmetic operators (one of
/) that can be inserted into the blanks to get the desired result?
10 __ 10 __ 10 __ 10 = 100
So, a simple, brute-force solution:
(ns clj-playground.core (:require [clojure.math.combinatorics :as combo])) (def n 10) (def ops [+ - * /]) ;; Evaluate a given set of operators. (defn compute [n opv] (reduce (fn [v op] (op v n)) n opv)) ;; Generate all possible 3-tuples of operators (defn all-variations  (mapcat identity (map clojure.math.combinatorics/permutations (clojure.math.combinatorics/combinations ops 3)))) (defn find-values [val]  (->> (all-variations) (map #(vec [% (compute n %)])) (filter (fn [[o v]] (= v val))) (clojure.pprint/pprint)))
And to use it:
user> (clj-playground.core/find-values 100) ([(#function[clojure.core/+] #function[clojure.core/-] #function[clojure.core/*]) 100] [(#function[clojure.core/-] #function[clojure.core/+] #function[clojure.core/*]) 100] [(#function[clojure.core/*] #function[clojure.core/+] #function[clojure.core/-]) 100] [(#function[clojure.core/*] #function[clojure.core/-] #function[clojure.core/+]) 100])
So, there are ways to get there, and here they are.
I know, I know, toy example, but still.