Add tasks for all the new languages

This commit is contained in:
Tina Müller 2016-12-05 23:44:36 +01:00
parent 9dc3c2bb62
commit bba7bfd280
13208 changed files with 134745 additions and 0 deletions

View file

@ -0,0 +1,58 @@
(lib 'math)
(lib 'match)
(math-precision 1.e-10)
;; formally derive (tan ..) expressions
;; copied from Racket
;; adapted and improved for performance
(define (reduce e)
;; (set! rcount (1+ rcount)) ;; # of calls
(match e
[(? number? a) a]
[('+ (? number? a) (? number? b)) (+ a b)]
[('- (? number? a) (? number? b)) (- a b)]
[('- (? number? a)) (- a)]
[('* (? number? a) (? number? b)) (* a b)]
[('/ (? number? a) (? number? b)) (/ a b)] ; patch
[( '+ a b) (reduce `(+ ,(reduce a) ,(reduce b)))]
[( '- a b) (reduce `(- ,(reduce a) ,(reduce b)))]
[( '- a) (reduce `(- ,(reduce a)))]
[( '* a b) (reduce `(* ,(reduce a) ,(reduce b)))]
[( '/ a b) (reduce `(/ ,(reduce a) ,(reduce b)))]
[( 'tan ('arctan a)) (reduce a)]
[( 'tan ( '- a)) (reduce `(- (tan ,a)))]
;; x 100 # calls reduction : derive (tan ,a) only once
[( 'tan ( '+ a b))
(let ((alpha (reduce `(tan ,a))) (beta (reduce `(tan ,b))))
(reduce `(/ (+ ,alpha ,beta) (- 1 (* ,alpha ,beta)))))]
[( 'tan ( '+ a b c ...)) (reduce `(tan (+ ,a (+ ,b ,@c))))]
[( 'tan ( '- a b))
(let ((alpha (reduce `(tan ,a))) (beta (reduce `(tan ,b))))
(reduce `(/ (- ,alpha ,beta) (+ 1 (* ,alpha ,beta)))))]
;; add formula for (tan 2 (arctan a)) = 2 a / (1 - a^2))
[( 'tan ( '* 2 ('arctan a))) (reduce `(/ (* 2 ,a) (- 1 (* ,a ,a))))]
[( 'tan ( '* 1 ('arctan a))) (reduce a)] ; added
[( 'tan ( '* (? number? n) a))
(cond [(< n 0) (reduce `(- (tan (* ,(- n) ,a))))]
[(= n 0) 0]
[(= n 1) (reduce `(tan ,a))]
[(even? n)
(let ((alpha (reduce `(tan (* ,(/ n 2) ,a))))) ;; # calls reduction
(reduce `(/ (* 2 ,alpha) (- 1 (* ,alpha ,alpha)))))]
[else (reduce `(tan (+ ,a (* ,(- n 1) ,a))))])]
))
(define (task)
(for ((f machins))
(if (~= 1 (reduce f))
(writeln '👍 f '⟾ 1 )
(writeln '❌ f '➽ (reduce f) ))))

View file

@ -0,0 +1,42 @@
(define machins
'((tan (+ (arctan 1/2) (arctan 1/3)))
(tan (+ (* 2 (arctan 1/3)) (arctan 1/7)))
(tan (- (* 4 (arctan 1/5)) (arctan 1/239)))
(tan (+ (* 5 (arctan 1/7)) (* 2 (arctan 3/79))))
(tan (+ (* 5 (arctan 29/278)) (* 7 (arctan 3/79))))
(tan (+ (arctan 1/2) (arctan 1/5) (arctan 1/8)))
(tan (+ (* 4 (arctan 1/5)) (* -1 (arctan 1/70)) (arctan 1/99)))
(tan (+ (* 5 (arctan 1/7)) (* 4 (arctan 1/53)) (* 2 (arctan 1/4443))))
(tan (+ (* 6 (arctan 1/8)) (* 2 (arctan 1/57)) (arctan 1/239)))
(tan (+ (* 8 (arctan 1/10)) (* -1 (arctan 1/239)) (* -4 (arctan 1/515))))
(tan (+ (* 12 (arctan 1/18)) (* 8 (arctan 1/57)) (* -5 (arctan 1/239))))
(tan (+ (* 16 (arctan 1/21)) (* 3 (arctan 1/239)) (* 4 (arctan 3/1042))))
(tan (+ (* 22 (arctan 1/28)) (* 2 (arctan 1/443)) (* -5 (arctan 1/1393)) (* -10 (arctan 1/11018))))
(tan (+ (* 22 (arctan 1/38)) (* 17 (arctan 7/601)) (* 10 (arctan 7/8149))))
(tan (+ (* 44 (arctan 1/57)) (* 7 (arctan 1/239)) (* -12 (arctan 1/682)) (* 24 (arctan 1/12943))))
(tan (+ (* 88 (arctan 1/172)) (* 51 (arctan 1/239)) (* 32 (arctan 1/682))
(* 44 (arctan 1/5357)) (* 68 (arctan 1/12943))))
(tan (+ (* 88 (arctan 1/172)) (* 51 (arctan 1/239)) (* 32 (arctan 1/682))
(* 44 (arctan 1/5357)) (* 68 (arctan 1/12944))))))
(task)
👍 (tan (+ (arctan 1/2) (arctan 1/3))) ⟾ 1
👍 (tan (+ (* 2 (arctan 1/3)) (arctan 1/7))) ⟾ 1
👍 (tan (- (* 4 (arctan 1/5)) (arctan 1/239))) ⟾ 1
👍 (tan (+ (* 5 (arctan 1/7)) (* 2 (arctan 3/79)))) ⟾ 1
👍 (tan (+ (* 5 (arctan 29/278)) (* 7 (arctan 3/79)))) ⟾ 1
👍 (tan (+ (arctan 1/2) (arctan 1/5) (arctan 1/8))) ⟾ 1
👍 (tan (+ (* 4 (arctan 1/5)) (* -1 (arctan 1/70)) (arctan 1/99))) ⟾ 1
👍 (tan (+ (* 5 (arctan 1/7)) (* 4 (arctan 1/53)) (* 2 (arctan 1/4443)))) ⟾ 1
👍 (tan (+ (* 6 (arctan 1/8)) (* 2 (arctan 1/57)) (arctan 1/239))) ⟾ 1
👍 (tan (+ (* 8 (arctan 1/10)) (* -1 (arctan 1/239)) (* -4 (arctan 1/515)))) ⟾ 1
👍 (tan (+ (* 12 (arctan 1/18)) (* 8 (arctan 1/57)) (* -5 (arctan 1/239)))) ⟾ 1
👍 (tan (+ (* 16 (arctan 1/21)) (* 3 (arctan 1/239)) (* 4 (arctan 3/1042)))) ⟾ 1
👍 (tan (+ (* 22 (arctan 1/28)) (* 2 (arctan 1/443)) (* -5 (arctan 1/1393)) (* -10 (arctan 1/11018)))) ⟾ 1
👍 (tan (+ (* 22 (arctan 1/38)) (* 17 (arctan 7/601)) (* 10 (arctan 7/8149)))) ⟾ 1
👍 (tan (+ (* 44 (arctan 1/57)) (* 7 (arctan 1/239)) (* -12 (arctan 1/682)) (* 24 (arctan 1/12943)))) ⟾ 1
👍 (tan (+ (* 88 (arctan 1/172)) (* 51 (arctan 1/239)) (* 32 (arctan 1/682))
(* 44 (arctan 1/5357)) (* 68 (arctan 1/12943)))) ⟾ 1
❌ (tan (+ (* 88 (arctan 1/172)) (* 51 (arctan 1/239)) (* 32 (arctan 1/682))
(* 44 (arctan 1/5357)) (* 68 (arctan 1/12944)))) ➽ 0.9999991882257442

View file

@ -0,0 +1,68 @@
var equationtext = <<'EOT'
pi/4 = arctan(1/2) + arctan(1/3)
pi/4 = 2*arctan(1/3) + arctan(1/7)
pi/4 = 4*arctan(1/5) - arctan(1/239)
pi/4 = 5*arctan(1/7) + 2*arctan(3/79)
pi/4 = 5*arctan(29/278) + 7*arctan(3/79)
pi/4 = arctan(1/2) + arctan(1/5) + arctan(1/8)
pi/4 = 4*arctan(1/5) - arctan(1/70) + arctan(1/99)
pi/4 = 5*arctan(1/7) + 4*arctan(1/53) + 2*arctan(1/4443)
pi/4 = 6*arctan(1/8) + 2*arctan(1/57) + arctan(1/239)
pi/4 = 8*arctan(1/10) - arctan(1/239) - 4*arctan(1/515)
pi/4 = 12*arctan(1/18) + 8*arctan(1/57) - 5*arctan(1/239)
pi/4 = 16*arctan(1/21) + 3*arctan(1/239) + 4*arctan(3/1042)
pi/4 = 22*arctan(1/28) + 2*arctan(1/443) - 5*arctan(1/1393) - 10*arctan(1/11018)
pi/4 = 22*arctan(1/38) + 17*arctan(7/601) + 10*arctan(7/8149)
pi/4 = 44*arctan(1/57) + 7*arctan(1/239) - 12*arctan(1/682) + 24*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12944)
EOT
func parse_eqn(equation) {
var eqn_re = /
( ^ \s* pi\/4 \s* = \s* )? # LHS of equation
(?: # RHS
\s* ( [+-] )? \s*
(?: ( \d+ ) \s* \*)?
\s* arctan\( (\d+) \/ (\d+) \)
)/x
gather {
for lhs,sign,mult,numer,denom in (equation.findall(eqn_re)) {
take([
[+1, -1][sign == '-'] * (mult ? Num(mult) : 1),
Num(join('/', numer, denom ? denom : 1))
])
}
}
}
func tanEval((1), f) { f }
func tanEval(coef {.is_neg}, f) {
-tanEval(-coef, f)
}
func tanEval(coef, f) {
var ca = coef//2
var cb = coef-ca
var (a, b) = (tanEval(ca, f), tanEval(cb, f))
(a + b) / (1 - a*b)
}
func tans(xs {.len == 1}) {
tanEval(xs[0]...)
}
func tans(xs) {
var (aa, bb) = @|(xs/2)
var (a, b) = (tans(aa), tans(bb))
(a + b) / (1 - a*b)
}
var machins = equationtext.lines.map(parse_eqn)
for machin,eqn in (machins ~Z equationtext.lines) {
var ans = tans(machin)
printf("%5s: %s\n", (ans == 1 ? 'OK' : 'ERROR'), eqn)
}