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
102
Task/Quaternion-type/Eero/quaternion-type.eero
Normal file
102
Task/Quaternion-type/Eero/quaternion-type.eero
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
interface Quaternion : Number
|
||||
// Properties -- note that this is an immutable class.
|
||||
double real, i, j, k {readonly}
|
||||
end
|
||||
|
||||
implementation Quaternion
|
||||
|
||||
initWithReal: double, i: double, j: double, k: double, return instancetype
|
||||
self = super.init
|
||||
if self
|
||||
_real = real; _i = i; _j = j; _k = k
|
||||
return self
|
||||
|
||||
+new: double real, ..., return instancetype
|
||||
va_list args
|
||||
va_start(args, real)
|
||||
object := Quaternion.alloc.initWithReal: real,
|
||||
i: va_arg(args, double),
|
||||
j: va_arg(args, double),
|
||||
k: va_arg(args, double)
|
||||
va_end(args)
|
||||
return object
|
||||
|
||||
descriptionWithLocale: id, return String = String.stringWithFormat:
|
||||
'(%.1f, %.1f, %.1f, %.1f)', self.real, self.i, self.j, self.k
|
||||
|
||||
norm, return double =
|
||||
sqrt(self.real * self.real +
|
||||
self.i * self.i + self.j * self.j + self.k * self.k)
|
||||
|
||||
negative, return Quaternion =
|
||||
Quaternion.new: -self.real, -self.i, -self.j, -self.k
|
||||
|
||||
conjugate, return Quaternion =
|
||||
Quaternion.new: self.real, -self.i, -self.j, -self.k
|
||||
|
||||
// Overload "+" operator (left operand is Quaternion)
|
||||
plus: Number operand, return Quaternion
|
||||
real := self.real, i = self.i, j = self.j, k = self.k
|
||||
if operand.isKindOfClass: Quaternion.class
|
||||
q := (Quaternion)operand
|
||||
real += q.real; i += q.i; j += q.j; k += q.k
|
||||
else
|
||||
real += (double)operand
|
||||
return Quaternion.new: real, i, j, k
|
||||
|
||||
// Overload "*" operator (left operand is Quaternion)
|
||||
multipliedBy: Number operand, return Quaternion
|
||||
real := self.real, i = self.i, j = self.j, k = self.k
|
||||
if operand.isKindOfClass: Quaternion.class
|
||||
q := (Quaternion)operand
|
||||
real = self.real * q.real - self.i* q.i - self.j * q.j - self.k * q.k
|
||||
i = self.real * q.i + self.i * q.real + self.j * q.k - self.k * q.j
|
||||
j = self.real * q.j - self.i * q.k + self.j * q.real + self.k * q.i
|
||||
k = self.real * q.k + self.i * q.j - self.j * q.i + self.k * q.real
|
||||
else
|
||||
real *= (double)operand
|
||||
i *= (double)operand; j *= (double)operand; k *= (double)operand
|
||||
return Quaternion.new: real, i, j, k
|
||||
|
||||
end
|
||||
|
||||
implementation Number (QuaternionOperators)
|
||||
|
||||
// Overload "+" operator (left operand is Number)
|
||||
plus: Quaternion operand, return Quaternion
|
||||
real := (double)self + operand.real
|
||||
return Quaternion.new: real, operand.i, operand.j, operand.k
|
||||
|
||||
// Overload "*" operator (left operand is Number)
|
||||
multipliedBy: Quaternion operand, return Quaternion
|
||||
r := (double)self
|
||||
return Quaternion.new: r * operand.real, r * operand.i,
|
||||
r * operand.j, r * operand.k
|
||||
|
||||
end
|
||||
|
||||
int main()
|
||||
autoreleasepool
|
||||
|
||||
q := Quaternion.new: 1.0, 2.0, 3.0, 4.0
|
||||
q1 := Quaternion.new: 2.0, 3.0, 4.0, 5.0
|
||||
q2 := Quaternion.new: 3.0, 4.0, 5.0, 6.0
|
||||
|
||||
Log( 'q = %@', q )
|
||||
Log( 'q1 = %@', q1 )
|
||||
Log( 'q2 = %@\n\n', q2 )
|
||||
|
||||
Log( 'q norm = %.3f', q.norm )
|
||||
Log( 'q negative = %@', q.negative )
|
||||
Log( 'q conjugate = %@', q.conjugate )
|
||||
Log( '7 + q = %@', 7.0 + q )
|
||||
Log( 'q + 7 = %@', q + 7.0 )
|
||||
Log( 'q1 + q2 = %@', q1 + q2 )
|
||||
Log( '7 * q = %@', 7 * q)
|
||||
Log( 'q * 7 = %@', q * 7.0 )
|
||||
Log( 'q1 * q2 = %@', q1 * q2 )
|
||||
Log( 'q2 * q1 = %@', q2 * q1 )
|
||||
|
||||
return 0
|
||||
Loading…
Add table
Add a link
Reference in a new issue