Skip to content

Instantly share code, notes, and snippets.

@timmc
Last active July 5, 2022 13:34
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save timmc/3036120 to your computer and use it in GitHub Desktop.
Save timmc/3036120 to your computer and use it in GitHub Desktop.
Factorial in Clojure without using alphanumeric characters
;; It all started here: http://clojure-log.n01se.net/date/2011-04-06.html#19:04
(#((% (+(*))) %) ;; call arg 1 with all args
[;; data
(+ (*)(*)(*)(*)(*)(*)(*))
;; main fn -- simulate 'if' with map lookup and closures
#(({(+) (% (+(*)(*)))} ;; if zero return 'then' clause
(% (+)) ;; dispatch on first arg
(% (+(*)(*)(*)))) ;; call 'else' clause (n not found in map)
%)
;; These clauses are given the same args as main fn.
;; base case ('then')
#({} % (+(*))) ;; constant fn of 1
;; recursive case ('else')
#(* ((% (+(*)))
[(- (% (+)) (+(*)))
(% (+(*)))
(% (+(*)(*)))
(% (+(*)(*)(*)))])
(% (+)))])
;; => 5040
;; Here's a simpler version that uses "if":
(#(% [% (+ (*)(*)(*)(*)(*)(*)(*))])
#(if (= (% (*)) (+))
(*)
(* ((% (+))
[(% (+)) (- (% (*)) (*))])
(% (*)))))
;; => 5040
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment