-
-
Save Janiczek/1001364 to your computer and use it in GitHub Desktop.
| @_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 | |
| this.reduce (x,y) -> x+y | |
| @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 |
Related: I've taken the time to solve a few problems on rosettacode.org, but there are still plenty left. Javascript is lacking too.
@DarrenN: Thanks for the link, interesting implementation of the sieve! This is the first time I see it done recursively... :)
@ricardobeat: Wow! Didn't know about that site. Looks AMAZING. Thanks!
Nice Solutions, however is the factor() function gone ? I cannot seem to make it work.
it's the one at the bottom of the code, I didn't change it ... maybe there are scope issues? I prefixed the functions with @, so I can call them from Chrome dev console (you know, other than window.someFunction() ) ...
does the _3() work for you? it uses the factor() and should find it without problems ...
oh im such an idiot :) Yes that looks much better, what is the purpose of the /= operator?
it's okay, happens to me too :)
x /= y gets translated to: x = x / y, similar to += etc.
edit: you probably asked because of the weird syntax highlighting here, didn't you? :)
what's I especially like are these:
a? # is 'a' defined?
a ?= b # if 'a' isn't defined, a = b
a or= b # a or (a = b), uses lazy evaluation - the (a=b) block doesn't get executed if a is true
I was doing something similar a while back - https://gist.github.com/750315