Files
doormanserver/static/coffee/services/rationals.coffee
T
2015-07-05 17:17:01 -04:00

81 lines
2.6 KiB
CoffeeScript

define ["app", "angularAMD", "lodash"], (app, angularAMD, _) ->
app.service "rationals", () ->
service =
getNominator: (rat) ->
if _.contains(rat, "/")
return Number(rat.substr(0, rat.indexOf("/")))
Number(rat)
getDenominator: (rat) ->
if _.contains(rat, "/")
return Number(rat.substr(rat.indexOf("/") + 1))
1
getNomDenom: (rat) ->
return [service.getNominator(rat), service.getDenominator(rat)]
gcd: (a, b) ->
if b == 0
return a
return service.gcd(b, a % b)
lcm: (a, b) ->
return a * b / service.gcd(a, b)
changeDenominator: (rat, newDenom) ->
[nom, denom] = service.getNomDenom(rat)
return service.newRat( nom * newDenom / denom, newDenom)
add: (rat1, rat2) ->
[nom, denom] = service.getNomDenom(rat2)
[nNom, nDenom] = service.getNomDenom(rat1)
gcd = service.gcd(nDenom, denom)
rNom = nom*nDenom + nNom * denom
rDenom = denom * nDenom
return service.newRat(rNom/gcd , rDenom/gcd)
minus: (rat1, rat2) ->
return service.add(rat1, service.opposite(rat2))
reduce: (rat) ->
[nom, denom] = service.getNomDenom(rat)
gcd = service.gcd(nom, denom)
return service.newRat(nom/gcd, denom/gcd)
opposite: (rat) ->
[nom, denom] = service.getNomDenom(rat)
return service.newRat(-nom, denom)
sum: (rats...) ->
ret = "0/1"
for rat in rats
ret = service.add(ret, rat)
return service.reduce(ret)
equal: (rat1, rat2) ->
[nom1, denom1] = service.getNomDenom(rat1)
[nom2, denom2] = service.getNomDenom(rat2)
return nom1 * denom2 == nom2 * denom1
pp: (x) ->
[num, denum] = service.getNomDenom(service.reduce(x))
if denum == 1
return num
return "#{num}/#{denum}"
newRat: (nom , denom) ->
if nom * denom >= 0
return "#{Math.abs(nom)}/#{Math.abs(denom)}"
return "#{-Math.abs(nom)}/#{Math.abs(denom)}"
return service
app.filter "ratpp", ["rationals", (rationals) ->
filter = (n) ->
return rationals.pp(n)
]