Skip to content

Instantly share code, notes, and snippets.

@st
Created November 19, 2011 21:48
Show Gist options
  • Save st/1379405 to your computer and use it in GitHub Desktop.
Save st/1379405 to your computer and use it in GitHub Desktop.
(def rules {7 "Qix" 5 "Bar" 3 "Foo"})
(defn div [[n s]]
(fn [[x accu]]
[x (str accu (when (= 0 (rem x n)) s))]))
(defn to-ints [x]
(map #(- (int %) 48) (seq (str x))))
(defn has [[x accu]]
[x (apply str accu (mapcat rules (to-ints x)))])
(def all (cons has (map div (seq rules))))
(defn fbq [n]
(let [[n s] ((apply comp all) [n nil])]
(if (seq s) s n)))
(doseq
[i (range 1 101)]
(println (fbq i)))
@st
Copy link
Author

st commented Nov 19, 2011

@martinsson
Copy link

C'est concis mais j'ai un peu mal à la tête :)

D'où sort le 48?

@st
Copy link
Author

st commented Nov 19, 2011

C'est tout simple en fait. Je fabrique des fonctions (avec make) qui exécutent une règle.
Chaque règle (sorte de prédicat amélioré) est décrite par une fonction de comptage et une chaîne en cas de succés.
Le 48 c'est le code entier du caractère 0.
Mais ça ne marche pas tout à fait ! Il faut appliquer les fonctions (de type has) dans l'ordre de lecture du nombre en entrée :-(

@martinsson
Copy link

j'ai l'impression que ça pourrait être plus clair avec un
for [c (str x) :when (= c n)] ....
ou
(re-seq (re-pattern n) (str x))

j'ai pas testé :)

@laurentpetit
Copy link

Je suis arrivé à ça : https://gist.github.com/1507832

@laurentpetit
Copy link

Salut Stef, j'étais parti un peu comme toi au début, dans l'idée de faire générique générique, mais quand je me suis heurté au meme problème que toi (à savoir on n'applique pas dans le meme ordre les règles), je suis revenu à de l'application manuelle, et à vrai dire, pour 2 fonctions connues à l'avance, c'est moins overkill ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment