Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
|
|
@ -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) ))))
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue