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

Back to github | This file in org-mode | Function reference |

## Intro

This demo will showcase expanding Clojure's `iterate`

with Emacs macros.

## Task summary

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