Skip to content

Instantly share code, notes, and snippets.

@rwaldron
Forked from Janiczek/ProjectEuler.coffee
Created June 1, 2011 01:30
Show Gist options
  • Save rwaldron/1001618 to your computer and use it in GitHub Desktop.
Save rwaldron/1001618 to your computer and use it in GitHub Desktop.
First few Project Euler problems solved in CoffeeScript. Comments on how to make it more beautiful (in terms of CoffeeScript, not algorithm) highly appreciated!
@_1 = ->
# sum of multiples of 3 or 5 (not both) under 1K
answer = 0
for n in [1...1000]
if n % 3 == 0 or n % 5 == 0
answer += n
answer
@_2 = ->
# sum of even fibonacci numbers up to 4M
answer = 0
[f,s,t] = [0,1,1]
while t <= 4000000
[f,s,t] = [s,t,s+t]
if t % 2 == 0
answer += t
answer
@_3 = ->
# highest factor of a large number
factor(600851475143).max()
@_4 = ->
# highest palindromic number that is product of two 3-digit numbers
max = 0
isP = (n) ->
n.toString() == n.toString().reverse()
for x in [100..999]
for y in [100..999]
tmp = x*y
if isP(tmp) and max < tmp
max = tmp
max
@_5 = ->
# lowest number divisible by numbers 1..20
answer = 1
for prime in primes_upto 20
tmp = prime
while tmp < 20
answer *= prime
tmp *= prime
answer
@_6 = ->
# difference between squared sum of 1..100 and sum of squares of 1..100
sum = (x for x in [1..100])
sqs = (x*x for x in sum)
sqsum = Math.pow sum.sum(), 2
sumsqs = sqs.sum()
answer = sqsum - sumsqs
@_7 = ->
# 10001th prime
prime 10001
@_8 = ->
# highest product of 5 consecutive digits of 1000-digit number
max = 0
num = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
for i in [0..num.length-5]
tmp = 1
for char in num.substr i,5
tmp *= parseInt char
if tmp > max
max = tmp
max
@_9 = ->
# pythagorean triple such that a+b+c = 1K
for a in [1...1000]
aa = a*a
for b in [a...1000-a]
bb = b*b
c = 1000-a-b
if aa + bb == c*c
return a*b*c
@_10 = ->
# sum of primes up to 2M
primes_upto(2000000).sum()
# ==============
# helper methods
# ==============
String::reverse = ->
# "abc" -> "cba"
this.split('').reverse().join('')
Array::max = ->
# [1,3,2] -> 3
Math.max.apply Math, this
Array::min = ->
# [1,3,2] -> 1
Math.min.apply Math, this
Array::sum = ->
# [1,3,5] -> 9
a = 0
for i in [0...this.length]
a += this[i]
a
@isPrime = (n) ->
# is n prime?
if n == 1
return false
if n < 4
return true
if n % 2 == 0
return false
if n < 9
return true
if n % 3 == 0
return false
r = Math.floor Math.sqrt n
f = 5
while f <= r
if n % f == 0
return false
if n % (f+2) == 0
return false
f += 6
return true
@primes_upto = (n) ->
# all primes up to n
(x for x in [1..n] when isPrime x)
@primes = (n) ->
# n primes
rank = 0
i = 1
ps = []
while rank < n
if isPrime ++i
ps.push i
rank++
ps
@prime = (n) ->
# nth prime
rank = 1
i = 2
while rank < n
if isPrime ++i
rank++
i
@factor = (n) ->
# 60 -> [2,2,3,5]
facs = []
divisor = 2
while n > 1
while n % divisor == 0
facs.push divisor
n /= divisor
divisor++
facs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment