My second Project Euler solution.
Project Euler No. 2
This was a little tougher to solve than No. 1. I decided to use recursion to solve it, and as I haven’t had to write anything that used recursion since I was at Uni, it took me a while go remember how to do it. Also, it was an elisp learning exercise.
Things I learnt:
- successive statements inside an if statement need to be inside a progn.
- passing in the evens variable was the way to solve this without needing a static variable. Thanks to spacebat for that one. Apparently that is the functional programming way of doing things.
;; Project Euler no 2. Calculate the sum of all even terms in the
;; fibonacci sequence of numbers that do not exceed 4,000,000
(defun fibonacci (x y)
"calculate the next number in the fibonacci sequenece"
(+ x y))
(defun fibonacci-sum (fib1 fib2 target &optional evens)
"find the next fibonacci number bigger than target, given fib1 and fib2"
(setq evens 0))
(let ((fib3 (fibonacci fib1 fib2 ))
(if (<= fib3 target)
(progn (if (zerop (mod fib3 2))
(setq evens (+ fib3 evens)))
(message (format "fib3 is: %d, evens: %d" fib3 evens))
(setq fib3 (fibonacci-sum fib2 fib3 target evens)))
(format "fib3: %d > %d target, evens = %d" fib3 target evens)
(fibonacci-sum 0 1 4000000)
So you’ve downloaded a really cool perl script but it has 200 module dependencies? You could just install them one by one with cpanm or, you could use lib::xi. It automatically installs modules your perl script uses.
# to install missing libaries automatically
$ perl -Mlib::xi script.pl
Finally managed to authenticate against WordPress.com using the oauth2 library.
Here is my sample code which returns an access token.
(let ((code (oauth2-request-authorization "https://public-api.wordpress.com/oauth2/authorize?blog=jasonblewis.wordpress.com" "2194" "" "" "http://emacstragic.net")
(oauth2-request-access "https://public-api.wordpress.com/oauth2/token" "2194" "" code "http://emacstragic.net" )
WordPress at least seems to be fussy about what you use as the Redirect URI. It needs to match the uri you set in the app settings of the wordpress developer page or you denied access.
My first Project Euler solution, and my first emacs elisp program.
Multiples of 3 and 5.
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
(defun divisibleby (dividend divisor)
"check if dividend is divisible by divisor"
(if (not(integerp dividend))
(error "dividend must be an integer"))
(if (not(integerp divisor))
(error "divisor must be an integer"))
(zerop (mod dividend divisor))
(let ((lower 1)
(loop for i from lower to (- upper 1) do (if (or (divisibleby i 3)
(divisibleby i 5))
(setq sum (+ sum i)))
(message "sum is: %d" sum)
For a long time I have wanted to learn elisp in emacs. I tried the various tutorials but I get bored of them too quickly. Too many words not enough action for me. I was reminded of Project Euler by Daniel Silverstone so I thought I’d have a crack at one of the problems. No. 1, Multiples of 3 and 5 seemed like a good place to start.
Here are my first attempts and questions I came up against. Many thanks to the people of #emacs on freenode for answering my questions.
Q: Why doesn’t the elisp doco within emacs have examples?
A: Often it does. But if not, check the elisp info pages. info-apropos. Or use s in an info buffer to search.
Q: is there a printf equivalent in lisp?
A: format – at first this confused me as I thought it would just format a string and not print it. I think it was a fundamental misunderstanding of what print actually does.
Q: in a defun, what should you do if the caller supplies an invalid parameter? like supplying a float instead of an int?
A: (error “Fail!”), check with integerp
(error ‘wrong-type-argument “Foo is bad, and you should feel bad.”)
Q: how would I check if a number is divisible by another number? (to give an integer result)
A: ijp | k-man:
(defun (divisiblep x y) "is x divisible by y?" (zerop (mod x y)))
My final hurdle was having too many brackets around an if statement. I had written
if (or ((divisibleby i 3))
if (or (divisibleby i 3)
Once I had fixed that my program worked.