# lispy.el demo 4: Project Euler p100 and Clojure

## Intro

This demo will showcase expanding Clojure's `iterate` with Emacs macros.

See a step-by-step solution of https://projecteuler.net/problem=100.

## Screencast

The screencast for this demo is here: http://youtu.be/tcI4gZ3eHaw

## Step-by-step

### step 1

Start with this code (sorry for spoiling):

```;; If a box contains twenty-one coloured discs, composed of fifteen blue
;; discs and six red discs, and two discs were taken at random, it can be
;; seen that the probability of taking two blue discs, P(BB) =
;; (15/21)×(14/20) = 1/2.

;; The next such arrangement, for which there is exactly 50% chance of
;; taking two blue discs at random, is a box containing eighty-five blue
;; discs and thirty-five red discs.

;; By finding the first arrangement to contain over 1012 =
;; 1,000,000,000,000 discs in total, determine the number of blue discs
;; that the box would contain.

;; 1+4*r+√(8*r^2+1)>2e12=x
;; 8*r^2+1>(x-1)^2+16*r^2-8*r*(x-1)
;; 8*r*r-8*r(x-1)+(x-1)^2-1<0
;; solve=> r> 292893218813
;; for blue to be integer, the req is 8*r*r+1 is square
(defn blue [red]
(BigInteger/valueOf (/ (+ 1 (* 2 red) (Math/sqrt (+ 1 (* 8 red red)))) 2)))
(defn next-red [[a b]]
[b (- (* b 6) a)])
(defn solution []
(->> (filter #(> (+ % (blue %)) 1e12)
(map first (iterate next-red [6N 35N]))) first blue))
(solution)
```

### step 2

Fire up `cider` and eval everything with ejeje.

### step 3

• k3f to jump to the `filter` statement
• 2m to select the lambda
• n to copy
• A jump to beginning of defun
• j C-n C-n navigate to some empty space

### step 4

• ( C-y C-j
• (first}6N 35N

You should now have:

```(#(> (+ % (blue %)) 1e12)
(first [6N 35N]))
```

### step 5

• C-f A navigate to the start
• e eval to get `false`

### step 6

• <f3> to start recording a macro
• fjf to navigate to the array
• 2(next-red to wrap the array
• [xr to eval and replace
• A to navigate to the start
• E to eval and insert
• <f4> to finish the macro

### step 7

Keep spamming <f4> until you get `true`.

### step 8

• fj2(blue[E to get the solution
• hkE to double-check