Yesterday I watched Dan Weinreb talking about ITA, Lisp, and well, really, really complex stuff 😉
The kind-of conclusion that he drew on the future of Lisp is that Clojure is the next Common Lisp. I’ve been dodging Clojure for about a year now. I bought the book from The Pragmatic Programmers when the book was in beta and eagerly followed the examples and decided it had promise. But, I figured that if I needed to really learn it (and by that I mean use it, not just talk about using it) it would have to come to me. It would do this, I reasoned, by being hard-to-ignore.
Well there seem to be more than enough smart-folks on-board now (like: Eric Normand, Bill Clementson to name only two) so I guess I better not miss the party. Not because I’m smart but because if I don’t make too much noise I can blend in and no one will notice I’m there.
So I came to the conclusion that I should try and use it for ad-hoc things that might cross-my-dome and are hard(er) to solve in non-functional languages.
For instance, this very afternoon I wanted to know how many possible hand distributions by suit there are in the card game Bridge. So four possible distributions might be:
- All 13 hearts
- 12 hearts, one diamond
- 11 hearts, one diamond, one club
- 10 hearts, one diamond, one club, one spade
The question is how many total distributions are possible?
I banged my head on the table-hard trying to figure out the answer to this. At first it seemed like a simple counting problem, but if it is I’m too simple to see it. Then I wondered if it could be an additive patitioning problem, but ordering is important so I don’t think it is. It didn’t feel NP complete. I know one thing though, at this late hour it might as well be.
1:57 bridge=> (count (for [spades (range 0 14) hearts (range 0 14) diamonds (range 0 14) clubs (range 0 14) :when (= 13 (+ spades hearts diamonds clubs))] [spades hearts diamonds clubs])) 560
Functional programming rocks.
2 replies on “REPL to the rescue!”
There is a counting solution to the bridge problem. It’s equivalent to counting possible arrangements of 13 cards and 3 spacer markers separating hearts, diamonds, clubs, spades
3h 5d 3c 2s
so this is equivalent to choosing 3 items out of 16
16!/(3!13!) = 560
Ha! I would never have thought of that, simple now you mention it.