46 lines
1.2 KiB
Text
46 lines
1.2 KiB
Text
import Algorithms as algo;
|
|
import Text as text;
|
|
|
|
class Compass {
|
|
_majors = none;
|
|
_quarter1 = none;
|
|
_quarter2 = none;
|
|
constructor() {
|
|
_majors = algo.materialize( text.split( "north east south west", " " ), tuple );
|
|
_majors += _majors;
|
|
_quarter1 = text.split( "N,N by E,N-NE,NE by N,NE,NE by E,E-NE,E by N", "," );
|
|
_quarter2 = algo.materialize( algo.map( _quarter1, @( s ){ copy( s ).replace( "NE", "EN" ); } ), list );
|
|
}
|
|
degrees_to_compasspoint( d ) {
|
|
d = d % 360. + 360. / 64.;
|
|
majorindex, minor = ( integer( d ) / 90, d % 90. );
|
|
minorindex = integer( minor * 4. ) / 45;
|
|
p1, p2 = _majors[majorindex: majorindex + 2];
|
|
q = none;
|
|
if ( p1 ∈ { "north", "south" } ) {
|
|
q = _quarter1;
|
|
} else {
|
|
q = _quarter2;
|
|
}
|
|
return ( text.capitalize( copy( q[minorindex] ).replace( "N", p1 ).replace( "E", p2 ) ) );
|
|
}
|
|
}
|
|
|
|
main() {
|
|
print(
|
|
" # | Angle | Compass point\n"
|
|
"---+---------|-------------------\n"
|
|
);
|
|
c = Compass();
|
|
for ( i : algo.range( 33 ) ) {
|
|
d = real( i ) * 11.25;
|
|
m = i % 3;
|
|
if ( m == 1 ) {
|
|
d += 5.62;
|
|
} else if ( m == 2 ) {
|
|
d -= 5.62;
|
|
}
|
|
n = i % 32 + 1;
|
|
print( "{:2d} | {:6.2f}° | {}\n".format( n, d, c.degrees_to_compasspoint( d ) ) );
|
|
}
|
|
}
|