Box the compass: Difference between revisions

(Added R (Arrrr!) version)
(23 intermediate revisions by 16 users not shown)
Line 22:
* The column of indices can be thought of as an enumeration of the thirty two cardinal points (see [[Talk:Box the compass#Direction, index, and angle|talk page]])..
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
<langsyntaxhighlight lang="11l">V majors = ‘north east south west’.split(‘ ’)
majors *= 2
V quarter1 = ‘N,N by E,N-NE,NE by N,NE,NE by E,E-NE,E by N’.split(‘,’)
Line 52 ⟶ 51:
d -= 5.62
V n = i % 32 + 1
print(‘#2.0 #<18 #4.2°’.format(n, degrees2compasspoint(d), d))</langsyntaxhighlight>
{{out}}
<pre>
Line 63 ⟶ 62:
1 North 354.38°
</pre>
 
=={{header|Action!}}==
Atari 8-bit computer is able to show up to 40 characters per row. Therefore abbreviations of direction have been used instead of the full names.
{{libheader|Action! Tool Kit}}
<langsyntaxhighlight Actionlang="action!">INCLUDE "D2:PRINTF.ACT" ;from the Action! Tool Kit
INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
 
Line 172 ⟶ 170:
Position(x,y) PrintAngle(rh)
OD
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Box_the_compass.png Screenshot from Atari 8-bit computer]
Line 194 ⟶ 192:
1 N 354.38
</pre>
 
=={{header|Ada}}==
 
Inspired by [[#C++|the C++ program]], but without the need for a specific library.
 
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
 
procedure Box_The_Compass is
Line 264 ⟶ 261:
Put_Line(Degrees(Degrees'Base(I) * 11.25 + Difference(I mod 3)));
end loop;
end Box_The_Compass;</langsyntaxhighlight>
 
Output:
Line 303 ⟶ 300:
354.37 | 32 | North by west
354.38 | 1 | North</pre>
 
=={{header|ALGOL 68}}==
{{works with|ALGOL 68|Revision 1 - no extensions to language used.}}
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
<langsyntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script #
 
[]STRING
Line 403 ⟶ 399:
))
OD
)</langsyntaxhighlight>
Output:
<pre>
Line 476 ⟶ 472:
32|North by West |NbW | |343°07.50′|348°45.00′|354°22.49′
</pre>
 
=={{header|AppleScript}}==
===Functional===
 
OS X Yosemite onwards (uses Foundation classes for record handling etc)
 
Line 486 ⟶ 481:
Functional composition, allowing for additional languages, and different numbers of compass points – see the test section)
 
<langsyntaxhighlight AppleScriptlang="applescript">use framework "Foundation"
use scripting additions
 
Line 878 ⟶ 873:
((ca's NSString's stringWithString:(str))'s ¬
uppercaseStringWithLocale:(ca's NSLocale's currentLocale())) as text
end toUpper</langsyntaxhighlight>
{{Out}}
<pre> 1 0.00° North 北
Line 913 ⟶ 908:
32 354.37° North by west 北微西
1 354.38° North 北 </pre>
----
===Simpler alternative===
<syntaxhighlight lang="applescript">on degreesToCompassPoint(degrees)
set cardinals to {"north", "east", "south", "west"}
set idx to ((degrees / 11.25) as integer) mod 32
set qIdx to idx mod 8
if (qIdx = 0) then return cardinals's item (idx div 8 + 1)
set ns to cardinals's item (3 - (idx + 24) div 16 mod 2 * 2)
set ew to cardinals's item ((idx div 16 + 1) * 2)
if (idx mod 16 > 7) then set qIdx to 8 - qIdx
if (qIdx = 1) then return ns & " by " & ew
if (qIdx = 2) then return ns & "-" & ns & ew
if (qIdx = 3) then return ns & ew & " by " & ns
if (qIdx = 4) then return ns & ew
if (qIdx = 5) then return ns & ew & " by " & ew
if (qIdx = 6) then return ew & "-" & ns & ew
return ew & " by " & ns -- qIdx = 7.
end degreesToCompassPoint
 
on join(lst, delim)
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to delim
set txt to lst as text
set AppleScript's text item delimiters to astid
return txt
end join
 
on task()
set output to {"", "Index Compass point Degrees"}
set inputs to {0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, ¬
118.13, 135.0, 151.87, 151.88, 168.75, 185.62, 185.63, 202.5, 219.37, 219.38, 236.25, ¬
253.12, 253.13, 270.0, 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38}
repeat with i from 1 to (count inputs)
set degrees to inputs's item i
set cpid to (degreesToCompassPoint(degrees))'s id
set cpid's first item to (cpid's beginning) mod 32 + 64
set compassPoint to string id cpid
set degrees to degrees as text
set entry to {text -2 thru -1 of (space & ((i - 1) mod 32 + 1)), ¬
text 1 thru 18 of (compassPoint & " "), ¬
text (offset of "." in degrees) thru end of (" " & degrees)}
set end of output to join(entry, " ")
end repeat
join(output, linefeed)
end task
 
task()</syntaxhighlight>
 
{{output}}
<syntaxhighlight lang="applescript">"
Index Compass point Degrees
1 North 0.0
2 North by east 16.87
3 North-northeast 16.88
4 Northeast by north 33.75
5 Northeast 50.62
6 Northeast by east 50.63
7 East-northeast 67.5
8 East by north 84.37
9 East 84.38
10 East by south 101.25
11 East-southeast 118.12
12 Southeast by east 118.13
13 Southeast 135.0
14 Southeast by south 151.87
15 South-southeast 151.88
16 South by east 168.75
17 South 185.62
18 South by west 185.63
19 South-southwest 202.5
20 Southwest by south 219.37
21 Southwest 219.38
22 Southwest by west 236.25
23 West-southwest 253.12
24 West by south 253.13
25 West 270.0
26 West by north 286.87
27 West-northwest 286.88
28 Northwest by west 303.75
29 Northwest 320.62
30 Northwest by north 320.63
31 North-northwest 337.5
32 North by west 354.37
1 North 354.38"</syntaxhighlight>
 
=={{header|AutoHotkey}}==
{{trans|C++}}
{{works with|AutoHotkey_L}}
<langsyntaxhighlight AHKlang="ahk">get_Index(angle){
return Mod(floor(angle / 11.25 +0.5), 32) + 1
}
Line 955 ⟶ 1,035:
. " ", 1, 24) . SubStr(" " a, -5) . "`r`n" ;
}
clipboard := out</langsyntaxhighlight>
;Output
<pre> 1 North 0.00
Line 990 ⟶ 1,070:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|AutoIt}}==
 
<syntaxhighlight lang="autoit">
<lang AutoIt>
Local $avArray[33] = [0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, 118.13, 135.0, _
151.87, 151.88, 168.75, 185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0, 286.87, 286.88, _
Line 1,012 ⟶ 1,091:
StringFormat("%-20s", $namearray[Mod(Floor($Degree / 11.25 + 0.5), 32)]) & " : " & $Degree & @CRLF)
EndFunc ;==>Boxing_the_compass
</syntaxhighlight>
</lang>
 
Output : <pre>0 : North : 0
Line 1,047 ⟶ 1,126:
31 : North by west : 354.37
0 : North : 354.38</pre>
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">#!/usr/bin/awk -f
BEGIN {
split("N NbE NNE NEbN NE NEbE ENE EbN E EbS ESE SEbE SE SEbS SSE SbE S SbW SSW SWbS SW SWbW WSW WbS W WbN WNW NWbW NW NWbN NNW NbW",A," ");
Line 1,067 ⟶ 1,145:
printf "%6.2f : %2d\t%s\n",$1,box,A[box];
}
</syntaxhighlight>
</lang>
Output:
<pre> 0.00 : 1 N
Line 1,103 ⟶ 1,181:
354.38 : 1 N</pre>
 
=={{header|BASIC256BASIC}}==
<lang ==={{header|BASIC256>arraybase 1}}===
<syntaxhighlight lang="basic256">arraybase 1
 
dim names$ = {"North", "North by east", "North-northeast", "Northeast by north", "Northeast", "Northeast by east", "East-northeast", "East by north", "East", "East by south", "East-southeast", "Southeast by east", "Southeast", "Southeast by south", "South-southeast", "South by east", "South", "South by west", "South-southwest", "Southwest by south", "Southwest", "Southwest by west", "West-southwest", "West by south", "West", "West by north", "West-northwest", "Northwest by west", "Northwest", "Northwest by north", "North-northwest", "North by west", "North"}
Line 1,114 ⟶ 1,193:
if j > 31 then j -= 32
print rjust(string(j),2); " "; ljust(string(names$[j+1]),20); grados[i]
next i</langsyntaxhighlight>
 
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> DIM bearing(32)
bearing() = 0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, \
\ 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, \
Line 1,145 ⟶ 1,224:
pt$() = "north", "east", "south", "west"
= pt$(pt% DIV 8)
</syntaxhighlight>
</lang>
Output:
<pre>0 1 North
Line 1,180 ⟶ 1,259:
354.37 32 North by west
354.38 1 North</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">100 dim names$(31)
110 restore 300
120 for c = 0 to ubound(names$)
130 read a$
140 names$(c) = a$
150 next c
160 dim degrees(32)
170 restore 380
180 for c = 0 to ubound(degrees)
190 read b
200 degrees(c) = b
210 next c
220 for i = 0 to ubound(degrees)
230 j = int((degrees(i)+5.625)/11.25)
240 if j > 31 then j = j-32
250 print using "####.##";degrees(i);
260 print using " ## ";j;
270 print names$(j)
280 next i
290 end
300 data "North","North by east","North-northeast","Northeast by north"
310 data "Northeast","Northeast by east","East-northeast","East by north"
320 data "East","East by south","East-southeast","Southeast by east"
330 data "Southeast","Southeast by south","South-southeast","South by east"
340 data "South","South by west","South-southwest","Southwest by south"
350 data "Southwest","Southwest by west","West-southwest","West by south"
360 data "West","West by north","West-northwest","Northwest by west","Northwest"
370 data "Northwest by north","North-northwest","North by west","North"
380 data 0,16.87,16.88,33.75,50.62,50.63,67.5,84.37,84.38,101.25
390 data 118.12,118.13,135,151.87,151.88,168.75,185.62,185.63,202.5,219.37
400 data 219.38,236.25,253.12,253.13,270,286.87,286.88,303.75,320.62,320.63
410 data 337.5,354.37,354.388</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|GW-BASIC}}===
{{works with|PC-BASIC|any}}
{{works with|BASICA}}
{{works with|Chipmunk Basic}}
{{works with|QBasic}}
{{works with|MSX BASIC}}
<syntaxhighlight lang="qbasic">100 dim n$(31)
110 restore 300
120 for c = 0 to 31
130 read a$
140 n$(c) = a$
150 next c
160 dim d(32)
170 restore 380
180 for c = 0 to 32
190 read b
200 d(c) = b
210 next c
220 for i = 0 to 32
230 j = int((d(i)+5.625)/11.25)
240 if j > 31 then j = j-32
250 print using "####.##";d(i);
260 print using " ## ";j;
270 print n$(j)
280 next i
290 end
300 data "North","North by east","North-northeast","Northeast by north"
310 data "Northeast","Northeast by east","East-northeast","East by north"
320 data "East","East by south","East-southeast","Southeast by east"
330 data "Southeast","Southeast by south","South-southeast","South by east"
340 data "South","South by west","South-southwest","Southwest by south"
350 data "Southwest","Southwest by west","West-southwest","West by south"
360 data "West","West by north","West-northwest","Northwest by west","Northwest"
370 data "Northwest by north","North-northwest","North by west","North"
380 data 0,16.87,16.88,33.75,50.62,50.63,67.5,84.37,84.38,101.25
390 data 118.12,118.13,135,151.87,151.88,168.75,185.62,185.63,202.5,219.37
400 data 219.38,236.25,253.12,253.13,270,286.87,286.88,303.75,320.62,320.63
410 data 337.5,354.37,354.38</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|MSX Basic}}===
{{works with|MSX BASIC|any}}
The [[#GW-BASIC|GW-BASIC]] solution works without any changes.
 
==={{header|Quite BASIC}}===
{{works with|BASICA}}
{{works with|Chipmunk Basic}}
<syntaxhighlight lang="qbasic">100 array n$
110 for c = 0 to 31
120 read a$
130 let n$(c) = a$
140 next c
150 array d
160 for c = 0 to 33
170 read b
180 let d(c) = b
190 next c
200 for i = 1 to 33
210 let j = int((d(i)+5.625)/11.25)
220 if j > 31 then let j = j-32
230 print d(i);" ";j;" ";n$(j)
240 next i
250 end
260 data "North","North by east","North-northeast","Northeast by north"
270 data "Northeast","Northeast by east","East-northeast","East by north"
280 data "East","East by south","East-southeast","Southeast by east"
290 data "Southeast","Southeast by south","South-southeast","South by east"
300 data "South","South by west","South-southwest","Southwest by south"
310 data "Southwest","Southwest by west","West-southwest","West by south"
320 data "West","West by north","West-northwest","Northwest by west","Northwest"
330 data "Northwest by north","North-northwest","North by west","North"
340 data 0,16.87,16.88,33.75,50.62,50.63,67.5,84.37,84.38,101.25
350 data 118.12,118.13,135,151.87,151.88,168.75,185.62,185.63,202.5,219.37
360 data 219.38,236.25,253.12,253.13,270,286.87,286.88,303.75,320.62,320.63
370 data 337.5,354.37,354.38</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{header|Befunge}}==
<langsyntaxhighlight lang="befunge">>>::"}"9**\4+3%79*9*5-*79*9*5--+:5>>>06p:55+%68*+v
^_@#!`*84:+1<v*9"}"*+55,,,".",,,$$_^#!:-1g60/+55\<
>_06g:v>55+,^>/5+55+/48*::::,,,,%:1+.9,:06p48*\-0v
Line 1,196 ⟶ 1,391:
W>0"tsaE"0"htron yb tsaE"0"tsaehtron-tsaE"0"tsae"v
#v"rtheast by north"0"Northeast"0"Northeast by "<<
^>"oN"0"tsaehtron-htroN"0"tsae yb htroN"0"htroN"01</langsyntaxhighlight>
 
{{output}}
Line 1,232 ⟶ 1,427:
354.37 32 North by west
354.38 1 North</pre>
 
=={{header|C}}==
Like [[wp:Box the compass|Wikipedia's article]], this program uses indexes to count the headings. There are now 33 headings, from 1 to 33, because 0.0 and 354.38 are different angles. (This differs from the task pseudocode, which mapped the 32 compass points to indexes.)
 
<langsyntaxhighlight Clang="c">#include <stdio.h>
 
int main()
Line 1,288 ⟶ 1,482:
 
return 0;
}</langsyntaxhighlight>Output:
<pre>
1 North 0.00
Line 1,324 ⟶ 1,518:
1 North 354.38
</pre>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">
using System;
using System.Collections.Generic;
Line 1,363 ⟶ 1,556:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,400 ⟶ 1,593:
1: North : 354.38
</pre>
 
=={{header|C++}}==
Using the Boost libraries
{{libheader|Boost}}
<langsyntaxhighlight lang="cpp">#include <string>
#include <boost/array.hpp>
#include <boost/assign/list_of.hpp>
Line 1,462 ⟶ 1,654:
}
return 0;
}</langsyntaxhighlight>
Output:
<pre>
Line 1,499 ⟶ 1,691:
1 North 354.38
</pre>
 
=={{header|Clojure}}==
{{trans|Tcl}}
<langsyntaxhighlight lang="lisp">(ns boxing-the-compass
(:use [clojure.string :only [capitalize]]))
Line 1,527 ⟶ 1,718:
(apply str (map-indexed #(format "%2s %-18s %7.2f\n"
(inc (mod %1 32)) (angle2compass %2) %2)
headings)))</langsyntaxhighlight>
Output:
<pre> 1 North 0.00
Line 1,562 ⟶ 1,753:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|COBOL}}==
Works with GnuCOBOL
<langsyntaxhighlight lang="cobol"> identification division.
program-id. box-compass.
data division.
Line 1,631 ⟶ 1,821:
display compass-point space show-degrees
end-perform
goback.</langsyntaxhighlight>
 
{{out}}
Line 1,670 ⟶ 1,860:
1 North 354.38
</pre>
 
=={{header|D}}==
{{trans|Java}}
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.math, std.array;
 
struct boxTheCompass {
Line 1,706 ⟶ 1,895:
heading.boxTheCompass, heading);
}
}</langsyntaxhighlight>
{{out}}
<pre>1 North 0
Line 1,743 ⟶ 1,932:
 
===Alternative version===
<langsyntaxhighlight lang="d">void main() {
import std.stdio;
 
Line 1,766 ⟶ 1,955:
writefln("%2d %18s %6.2f", i + 1, box[i], phi);
}
}</langsyntaxhighlight>
{{out}}
<pre> 1 North 0.00
Line 1,801 ⟶ 1,990:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|Delphi}}==
See [https://rosettacode.org/wiki/Box_the_compass#Pascal Pascal].
=={{header|EasyLang}}==
{{trans|Kotlin}}
<syntaxhighlight>
func$ expand cp$ .
for c$ in strchars cp$
if c$ = "N"
r$ &= "north"
elif c$ = "E"
r$ &= "east"
elif c$ = "S"
r$ &= "south"
elif c$ = "W"
r$ &= "west"
elif c$ = "b"
r$ &= "by"
else
r$ &= "-"
.
.
h$ = strchar (strcode substr r$ 1 1 - 32)
return h$ & substr r$ 2 999
.
proc main . .
cp$[] = [ "N" "NbE" "N-NE" "NEbN" "NE" "NEbE" "E-NE" "EbN" "E" "EbS" "E-SE" "SEbE" "SE" "SEbS" "S-SE" "SbE" "S" "SbW" "S-SW" "SWbS" "SW" "SWbW" "W-SW" "WbS" "W" "WbN" "W-NW" "NWbW" "NW" "NWbN" "N-NW" "NbW" ]
print "Index Degrees Compass point"
print "----- ------- -------------"
for i = 0 to 32
ind = (i + 1) mod1 32
heading = i * 11.25
if i mod 3 = 1
heading += 5.62
elif i mod 3 = 2
heading -= 5.62
.
print ind & "\t" & heading & "\t" & expand cp$[ind]
.
.
main
</syntaxhighlight>
 
=={{header|Elixir}}==
{{trans|Ruby}}
<langsyntaxhighlight lang="elixir">defmodule Box do
defp head do
Enum.chunk(~w(north east south west north), 2, 1)
Line 1,830 ⟶ 2,057:
end
 
Box.compass</langsyntaxhighlight>
 
{{out}}
Line 1,870 ⟶ 2,097:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">constant names = {"North","North by east","North-northeast","Northeast by north",
"Northeast","Northeast by east","East-northeast","East by north","East",
"East by south","East-southeast","Southeast by east","Southeast","Southeast by south",
Line 1,892 ⟶ 2,119:
j = deg2ind(degrees[i])
printf(1, "%6.2f %2d %-22s\n", {degrees[i], j, names[j]})
end for</langsyntaxhighlight>
 
Output:
Line 1,928 ⟶ 2,155:
354.37 32 North by west
354.38 1 North</pre>
 
=={{header|F_Sharp|F#}}==
{{trans|Perl}}
<langsyntaxhighlight lang="fsharp">let box = [|
"North"; "North by east"; "North-northeast"; "Northeast by north";
"Northeast"; "Northeast by east"; "East-northeast"; "East by north";
Line 1,947 ⟶ 2,173:
|> List.iter (fun phi ->
let i = (int (phi * 32. / 360. + 0.5)) % 32
printf "%3d %18s %6.2f°\n" (i + 1) box.[i] phi)</langsyntaxhighlight>
{{out}}
<pre> 1 North 0.00°
Line 1,982 ⟶ 2,208:
32 North by west 354.37°
1 North 354.38°</pre>
 
=={{header|Factor}}==
<langsyntaxhighlight Factorlang="factor">USING: formatting kernel math sequences ;
 
CONSTANT: box
Line 2,010 ⟶ 2,235:
dup 32 * 360 /f 0.5 + >integer 32 mod [ 1 + ] [ box nth ] bi
"%6.2f° %2d %s\n" printf
] each</langsyntaxhighlight>
{{out}}
<pre>
Line 2,047 ⟶ 2,272:
354.38° 1 North
</pre>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">Program Compass
implicit none
 
Line 2,087 ⟶ 2,311:
compasspoint = points(int(x))
end function compasspoint
end program Compass</langsyntaxhighlight>
Output:
<pre>
Line 2,123 ⟶ 2,347:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 04-11-2016
' compile with: fbc -s console
 
Line 2,156 ⟶ 2,379:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre> 0.00 0 North
Line 2,191 ⟶ 2,414:
354.37 31 North by west
354.38 0 North</pre>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=823a56ac094b8963cf11f792b381fbcc Click this link to run this code]'''
<langsyntaxhighlight lang="gambas">Public Sub Main()
Dim fDeg As Float[] = [0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, 185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0, 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38]
Dim cHeading As Collection = ["N": "North", "S": "South", "W": "West", "E": "East", "b": "by"]
Line 2,212 ⟶ 2,434:
Next
 
End</langsyntaxhighlight>
Output:
<pre>
Line 2,249 ⟶ 2,471:
Index= 1 354.38 degrees = North
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 2,317 ⟶ 2,538:
fmt.Printf("%4d %-19s %7.2f°\n", index, degrees2compasspoint(h), h)
}
}</langsyntaxhighlight>
<pre>
Index Compass point Degree
Line 2,354 ⟶ 2,575:
1 North 354.38°
</pre>
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def asCompassPoint(angle) {
def cardinalDirections = ["north", "east", "south", "west"]
 
Line 2,377 ⟶ 2,597:
354.37, 354.38].eachWithIndex { angle, index ->
println "${(index % 32) + 1}".padRight(3) + "${angle.asCompassPoint().padLeft(20)} $angle\u00b0"
}</langsyntaxhighlight>
Output:
<pre>1 North 0.0°
Line 2,412 ⟶ 2,632:
32 North by west 354.37°
1 North 354.38°</pre>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Data.Char (toUpper)
 
import Data.Maybe (fromMaybe)
Line 2,483 ⟶ 2,702:
 
main :: IO ()
main = mapM_ (printPointName . show) [0 .. 31]</langsyntaxhighlight>
Output:
<pre> 1 North 0.00°
Line 2,518 ⟶ 2,737:
32 North by west 354.37°
1 North 354.38°</pre>
 
=={{header|Huginn}}==
<langsyntaxhighlight lang="huginn">import Algorithms as algo;
import Text as text;
 
Line 2,565 ⟶ 2,783:
print( "{:2d} | {:6.2f}° | {}\n".format( n, d, c.degrees_to_compasspoint( d ) ) );
}
}</langsyntaxhighlight>
Output:<pre> # | Angle | Compass point
---+---------|-------------------
Line 2,601 ⟶ 2,819:
32 | 354.37° | North by west
1 | 354.38° | North</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
{{incomplete|Icon|354.38?}}
<langsyntaxhighlight Iconlang="icon">link strings,numbers
procedure main()
Line 2,629 ⟶ 2,846:
return dirs[round(((((d%360)+360)%360)/11.25)%32 + 1)]
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 2,667 ⟶ 2,884:
31 north-northwest 337.50
32 north by west 354.37</pre>
 
=={{header|IS-BASIC}}==
<langsyntaxhighlight ISlang="is-BASICbasic">100 PROGRAM "Compass.bas"
110 STRING DR$(1 TO 33)*18
120 FOR I=1 TO 33
Line 2,682 ⟶ 2,898:
210 DATA North,North by east,North-northeast,Northeast by north,Northeast,Northeast by east,East-northeast,East by north,East,East by south,East-southeast,Southeast by east,Southeast,Southeast by south,South-southeast,South by east
220 DATA South,South by west,South-southwest,Southwest by south,Southwest,Southwest by west,West-southwest,West by south,West,West by north,West-northwest,Northwest by west,Northwest,Northwest by north,North-northwest,North by west,North
230 DATA 0.0,16.87,16.88,33.75,50.62,50.63,67.5,84.37,84.38,101.25,118.12,118.13,135.0,151.87,151.88,168.75,185.62,185.63,202.5,219.37,219.38,236.25,253.12,253.13,270.0,286.87,286.88,303.75,320.62,320.63,337.5,354.37,354.38</langsyntaxhighlight>
 
Output:<pre> 0 1 North
Line 2,717 ⟶ 2,933:
354.37 32 North by west
354.38 1 North</pre>
 
=={{header|J}}==
 
<langsyntaxhighlight lang="j">require'strings'
subs=: 'N,north,S,south,E,east,W,west,b, by ,'
dirs=: subs (toupper@{., }.)@rplc~L:1 0&(<;._2) 0 :0 -. ' ',LF
Line 2,727 ⟶ 2,942:
)
indice=: 32 | 0.5 <.@+ %&11.25
deg2pnt=: dirs {~ indice</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight lang="j"> i.10
0 1 2 3 4 5 6 7 8 9
deg2pnt i.10
┌─────┬─────┬─────┬─────┬─────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐
│North│North│North│North│North│North│North by east│North by east│North by east│North by east│
└─────┴─────┴─────┴─────┴─────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘</langsyntaxhighlight>
 
Required example:
 
<langsyntaxhighlight lang="j"> (":@>:@indice,.' ',.>@deg2pnt,.' ',.":@,.)(*&11.25 + 5.62 * 0 1 _1 {~ 3&|) i.33
1 North 0
2 North by east 16.87
Line 2,773 ⟶ 2,988:
31 North-northwest 337.5
32 North by west 354.37
1 North 354.38</langsyntaxhighlight>
=={{header|Java}}==
<p>
For this task, I used an <kbd>enumeration</kbd> to contain all 32-points of the compass.<br />
The bounds and mid-points can then be derived using the <code>enum</code> ordinal value.
</p>
<p>
The <code>toString</code> method breaks down the <kbd>enum</kbd> name into characters, and
replaces each with there corresponding written value.
</p>
<syntaxhighlight lang="java">
enum Compass {
N, NbE, NNE, NEbN, NE, NEbE, ENE, EbN,
E, EbS, ESE, SEbE, SE, SEbS, SSE, SbE,
S, SbW, SSW, SWbS, SW, SWbW, WSW, WbS,
W, WbN, WNW, NWbW, NW, NWbN, NNW, NbW;
 
float midpoint() {
=={{header|Java}}==
float midpoint = (360 / 32f) * ordinal();
{{trans|Visual Basic .NET}}
return midpoint == 0 ? 360 : midpoint;
<lang java>public class BoxingTheCompass{
}
private static String[] points = new String[32];
 
float[] bounds() {
public static void main(String[] args){
buildPointsfloat bound = (360 / 32f) / 2f;
float midpoint = midpoint();
doublefloat headingboundA = 0midpoint - bound;
float boundB = midpoint + bound;
forif (intboundB i> =360) 0;boundB i<-= 32360;i++){
return new float[] { headingboundA, =boundB i * 11.25};
}
switch(i % 3){
 
case 1:
static Compass parse(float degrees) {
heading += 5.62;
float[] breakbounds;
float[] boundsN = case 2:N.bounds();
for (Compass value : Compass.values()) {
heading -= 5.62;
bounds = breakvalue.bounds();
if (degrees >= boundsN[0] default:|| degrees < boundsN[1])
} return N;
if (degrees >= bounds[0] && degrees < bounds[1])
return value;
System.out.printf("%s\t%18s\t%s°\n",(i % 32) + 1, initialUpper(getPoint(heading)), heading);
}
return null;
}
 
@Override
private static void buildPoints(){
public String[] cardinal =toString() {"north", "east", "south", "west"};
String[] pointDescstrings = {"1",new "1 by 2", "1-C", "C by 1", "C", "C by 2", "2-C", "2 by 1"}String[name().length()];
int index = 0;
Stringfor str1,(char str2,letter strC;: name().toCharArray()) {
switch (letter) {
for(int i = 0;i < case 'N' -> strings[index] = 3"north";i++){
str1 = cardinal case 'E' -> strings[iindex] = "east";
str2 = cardinal[(i + 1)case %'S' 4-> strings[index] = "south";
case 'W' -> strings[index] = "west";
strC = (str1.equals("north") || str1.equals("south")) ? (str1 + str2): (str2 + str1);
for(int j = 0;j <case 'b' -> strings[index] = 7"by";j++){
points[i * 8 + j] = pointDesc[j].replace("1", str1).replace("2", str2).replace("C", strC);
}
index++;
}
String string
= strings[0].substring(0, 1).toUpperCase() +
strings[0].substring(1);
switch (strings.length) {
case 2 -> string += strings[1];
case 3 -> {
if (strings[1].equals("by")) {
string += " %s %s".formatted(strings[1], strings[2]);
} else {
string += "-%s%s".formatted(strings[1], strings[2]);
}
}
case 4 -> {
string += String.join(" ", strings[1], strings[2], strings[3]);
}
}
return string;
}
}
</syntaxhighlight>
private static String initialUpper(String s){
<pre>
return s.substring(0, 1).toUpperCase() + s.substring(1);
0 North 0.00
}
1 North by east 16.87
2 North-northeast 16.88
private static String getPoint(double degrees){
3 Northeast by north 33.75
double testD = (degrees / 11.25) + 0.5;
4 Northeast 50.62
return points[(int)Math.floor(testD % 32)];
5 Northeast by east 50.63
}
6 East-northeast 67.50
}</lang>
7 East by north 84.37
Output:
<pre>1 8 East North 0 84.38
9 East by south 101.25
2 North by east 16.87°
10 East-southeast 118.12
3 North-northeast 16.88°
11 Southeast by east 118.13
4 Northeast by north 33.75°
5 12 Southeast Northeast 50 135.62°00
13 Southeast by south 151.87
6 Northeast by east 50.63°
14 South-southeast 151.88
7 East-northeast 67.5°
15 South by east 168.75
8 East by north 84.37°
9 16 South East 84 185.38°62
17 South by west 185.63
10 East by south 101.25°
18 South-southwest 202.50
11 East-southeast 118.12°
19 Southwest by south 219.37
12 Southeast by east 118.13°
13 20 Southwest Southeast 135 219.38
21 Southwest by west 236.25
14 Southeast by south 151.87°
22 West-southwest 253.12
15 South-southeast 151.88°
23 West by south 253.13
16 South by east 168.75°
17 24 West South 185 270.62°00
25 West by north 286.87
18 South by west 185.63°
26 West-northwest 286.88
19 South-southwest 202.5°
27 Northwest by west 303.75
20 Southwest by south 219.37°
21 28 Northwest Southwest 219 320.38°62
29 Northwest by north 320.63
22 Southwest by west 236.25°
30 North-northwest 337.50
23 West-southwest 253.12°
31 North by west 354.37
24 West by south 253.13°
25 0 North West 270 354.38
</pre>
26 West by north 286.87°
27 West-northwest 286.88°
28 Northwest by west 303.75°
29 Northwest 320.62°
30 Northwest by north 320.63°
31 North-northwest 337.5°
32 North by west 354.37°
1 North 354.38°</pre>
 
=={{header|JavaScript}}==
Line 2,865 ⟶ 3,106:
An iterative, web-based approach:
 
<langsyntaxhighlight lang="javascript">function createRow(i, point, heading) {
var tr = document.createElement('tr'),
td;
Line 2,910 ⟶ 3,151:
table.appendChild(tbody);
document.body.appendChild(table);
</syntaxhighlight>
</lang>
Output:
<pre>1 North 0°
Line 2,949 ⟶ 3,190:
 
Functional composition, allowing for additional languages (and different numbers of compass points)
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict';
 
Line 3,187 ⟶ 3,428:
 
return compassTable(5, xs); // 2^5 -> 32 boxes
})();</langsyntaxhighlight>
 
{{Out}}
Line 3,223 ⟶ 3,464:
32 354.37° North by west 北微西
1 354.38° North 北 </pre>
=={{header|jq}}==
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq, and with fq.'''
 
'''Adapted from [[#Wren|Wren]]'''
<syntaxhighlight lang=jq>
# Input: the input heading given as a number in degrees.
# Output: the corresponding integer index (from 0 to 31 inclusive)
# into the table, compassPoint, of compass point names.
def cpx:
(((. / 11.25) + 0.5)|floor % 32)
| if . < 0 then . + 32
else .
end;
 
# Compass point names
def compassPoint: [
"North",
"North by east",
"North-northeast",
"Northeast by north",
"Northeast",
"Northeast by east",
"East-northeast",
"East by north",
"East",
"East by south",
"East-southeast",
"Southeast by east",
"Southeast",
"Southeast by south",
"South-southeast",
"South by east",
"South",
"South by west",
"South-southwest",
"Southwest by south",
"Southwest",
"Southwest by west",
"West-southwest",
"West by south",
"West",
"West by north",
"West-northwest",
"Northwest by west",
"Northwest",
"Northwest by north",
"North-northwest",
"North by west"
];
 
### The task
# Input: heading in degrees
def degreesToCompassPoint:
compassPoint[cpx];
 
def r: [
0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5,
84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75,
185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0,
286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38
];
 
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
 
"Index Compass point Heading",
(r as $r
| range(0; $r|length)
| $r[.] as $h
| ((.%32) + 1) as $index # index as per requirements
| ($h | degreesToCompassPoint) as $d
| "\($index|lpad(3)) \($d|lpad(20)) \($h)°"
)
</syntaxhighlight>
 
{{output}}
<pre>
Index Compass point Heading
1 North 0°
2 North by east 16.87°
3 North-northeast 16.88°
4 Northeast by north 33.75°
5 Northeast 50.62°
6 Northeast by east 50.63°
7 East-northeast 67.5°
8 East by north 84.37°
9 East 84.38°
10 East by south 101.25°
11 East-southeast 118.12°
12 Southeast by east 118.13°
13 Southeast 135°
14 Southeast by south 151.87°
15 South-southeast 151.88°
16 South by east 168.75°
17 South 185.62°
18 South by west 185.63°
19 South-southwest 202.5°
20 Southwest by south 219.37°
21 Southwest 219.38°
22 Southwest by west 236.25°
23 West-southwest 253.12°
24 West by south 253.13°
25 West 270°
26 West by north 286.87°
27 West-northwest 286.88°
28 Northwest by west 303.75°
29 Northwest 320.62°
30 Northwest by north 320.63°
31 North-northwest 337.5°
32 North by west 354.37°
1 North 354.38°
</pre>
 
=={{header|Julia}}==
Line 3,228 ⟶ 3,581:
{{trans|Python}}
 
<langsyntaxhighlight lang="julia">using Printf
 
function degree2compasspoint(d::Float64)
Line 3,250 ⟶ 3,603:
i % 3 == 2 && (d -= 5.62)
@printf("%2i %-17s %10.2f°\n", i % 32 + 1, degree2compasspoint(d), d)
end</langsyntaxhighlight>
 
{{out}}
<pre> 1 North 0.00°
Line 3,290 ⟶ 3,642:
The representation of the names was inspired by Tcl (etc.).
 
<langsyntaxhighlight Klang="k"> d:("N;Nbe;N-ne;Nebn;Ne;Nebe;E-ne;Ebn;")
d,:("E;Ebs;E-se;Sebe;Se;Sebs;S-se;Sbe;")
d,:("S;Sbw;S-sw;Swbs;Sw;Swbw;W-sw;Wbs;")
Line 3,305 ⟶ 3,657:
 
/ calculate the degrees
f:{m:x!3;(11.25*x)+:[1=m;+5.62;2=m;-5.62;0]}</langsyntaxhighlight>
The table:
<langsyntaxhighlight Klang="k"> `0:{((2$(1+x!32))," ",(-19$cc@dd[x]),(6.2$f@x))}'!#dd
1 North 0.00
2 North by east 16.87
Line 3,341 ⟶ 3,693:
31 North-northwest 337.50
32 North by west 354.37
1 North 354.38</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.2
 
fun expand(cp: String): String {
Line 3,380 ⟶ 3,731:
println(f.format(index + 1, heading, expand(cp[index])))
}
}</langsyntaxhighlight>
 
{{out}}
Line 3,420 ⟶ 3,771:
1 354.38 North
</pre>
 
=={{header|langur}}==
{{trans|D}}
<syntaxhighlight lang="langur">val .box = ["North", "North by east", "North-northeast", "Northeast by north",
{{works with|langur|0.6.13}}
<lang langur>val .box = ["North", "North by east", "North-northeast", "Northeast by north",
"Northeast", "Northeast by east", "East-northeast", "East by north",
"East", "East by south", "East-southeast", "Southeast by east",
Line 3,443 ⟶ 3,792:
 
for .phi in .angles {
val .i = truncatetrunc(.phi x* 32 / 360 + 0.5) rem 32 + 1
writeln $"\{.i:5;} \{.phi:r2:6;} \{.box[.i];}"
}</langsyntaxhighlight>
 
{{out}}
Line 3,486 ⟶ 3,835:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">define pointsarray() => {
local(points = array)
loop(-from=0,-to=32) => {
Line 3,537 ⟶ 3,886:
#pformatted + ' | ' + (#counter < 10 ? ' ') + #counter + ' | ' + compassLong(compassShort->get(#counter)) + '\r'
^}</langsyntaxhighlight>
 
{{out}}
Line 3,575 ⟶ 3,924:
354.37 | 32 | North by west
354.38 | 1 | North</pre>
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb">dim point$( 32)
 
for i =1 to 32
Line 3,610 ⟶ 3,958:
data "West by south ", "West ", "West by north ", "West-northwest "
data "Northwest by west ", "Northwest ", "Northwest by north", "North-northwest "
data "North by west</langsyntaxhighlight>
 
Output:
Line 3,646 ⟶ 3,994:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|LLVM}}==
{{trans|C}}
<langsyntaxhighlight lang="llvm">; This is not strictly LLVM, as it uses the C library function "printf".
; LLVM does not provide a way to print values, so the alternative would be
; to just load the string into memory, and that would be boring.
Line 3,717 ⟶ 4,064:
 
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { argmemonly nounwind }</langsyntaxhighlight>
{{out}}
<pre> 1 North 0.00
Line 3,752 ⟶ 4,099:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">; List of abbreviated compass point labels
make "compass_points [ N NbE N-NE NEbN NE NEbE E-NE EbN
E EbS E-SE SEbE SE SEbS S-SE SbE
Line 3,818 ⟶ 4,164:
; and exit
bye
</syntaxhighlight>
</lang>
 
Output:
Line 3,855 ⟶ 4,201:
354.37 | North by west | 32
354.38 | North | 1</pre>
 
=={{header|Lua}}==
{{trans|Logo}}
<langsyntaxhighlight lang="lua">-- List of abbreviated compass point labels
compass_points = { "N", "NbE", "N-NE", "NEbN", "NE", "NEbE", "E-NE", "EbN",
"E", "EbS", "E-SE", "SEbE", "SE", "SEbS", "S-SE", "SbE",
Line 3,906 ⟶ 4,251:
label = expand_point(abbr)
print(row_format:format(angle, label, index))
end</langsyntaxhighlight>
 
Output:
Line 3,943 ⟶ 4,288:
354.37 | North by west | 32
354.38 | North | 1</pre>
 
=={{header|M2000 Interpreter}}==
In a For Next loop we can change loop variable inside block, but the actual loop hidden variable can't change so for next iteration we get the proper value.
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Locale 1033 'change decimal point char to dot.
Line 3,975 ⟶ 4,319:
}
CheckIt
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,015 ⟶ 4,359:
354.38°| 1 | North
</pre >
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">Map[List[Part[#,1], dirs[[Part[#,1]]], ToString@Part[#,2]<>"°"]&,
Map[{Floor[Mod[ #+5.625 , 360]/11.25]+1,#}&,input] ]//TableForm</langsyntaxhighlight>
<pre>1 North 0.°
2 North by east 16.87°
Line 4,052 ⟶ 4,395:
32 North by west 354.37°
1 North 354.38°</pre>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight MATLABlang="matlab">function b = compassbox(d)
b = ceil(mod(d+360/64,360)*32/360);
end; </langsyntaxhighlight>
Output:
<pre>>> x=[0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, 185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0, 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38]';
Line 4,094 ⟶ 4,436:
354.37 : 32
354.38 : 1</pre>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE BoxTheCompass;
FROM FormatString IMPORT FormatString;
FROM RealStr IMPORT RealToStr;
Line 4,177 ⟶ 4,518:
 
ReadChar
END BoxTheCompass.</langsyntaxhighlight>
 
=={{header|MUMPS}}==
The TCL implementation was the starting point, but this isn't an exact translation.
<langsyntaxhighlight MUMPSlang="mumps">BOXING(DEGREE)
;This takes in a degree heading, nominally from 0 to 360, and returns the compass point name.
QUIT:((DEGREE<0)||(DEGREE>360)) "land lubber can't read a compass"
Line 4,214 ⟶ 4,554:
. WRITE $PIECE(X,"^"),?5,DIR,?40,$JUSTIFY($PIECE(POINTS,",",P),10,2),!
KILL POINTS,UP,LO,DIR,P,X
QUIT</langsyntaxhighlight>
<p>Output:<pre>
Debugger executing 'BOXWRITE^COMPASS'
Line 4,250 ⟶ 4,590:
32 North by west 354.37
1 North 354.38</pre></p>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols nobinary utf8
 
Line 4,453 ⟶ 4,792:
 
return table
</syntaxhighlight>
</lang>
 
;Output
Line 4,526 ⟶ 4,865:
1 N North 354.380
</pre>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import math, sequtils, strformat, strutils
 
const
Line 4,557 ⟶ 4,895:
index = heading.toCompassIndex
compassHeading = heading.toCompassHeading.alignLeft(maxNameLength)
echo fmt"{index:>2} {compassHeading} {heading:6.2f}"</langsyntaxhighlight>
Output:
<pre> 1 North 0.00
Line 4,592 ⟶ 4,930:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
class BoxCompass {
function : Main(args : String[]) ~ Nil {
Line 4,629 ⟶ 4,966:
}
}
</syntaxhighlight>
</lang>
 
Output
Line 4,667 ⟶ 5,004:
1 North 354.38
</pre>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">
let test_cases = [0.0; 16.87; 16.88; 33.75; 50.62; 50.63; 67.5;
84.37; 84.38; 101.25; 118.12; 118.13; 135.0;
Line 4,702 ⟶ 5,038:
List.iter (print_direction) test_cases;;
 
</syntaxhighlight>
</lang>
Sample output:
<pre>
Line 4,739 ⟶ 5,075:
1 North 354.38
</pre>
 
=={{header|OoRexx}}==
<langsyntaxhighlight OOREXXlang="oorexx">/* Rexx */
 
Do
Line 5,000 ⟶ 5,335:
End
Exit
</syntaxhighlight>
</lang>
 
;Output
Line 5,072 ⟶ 5,407:
1 N North 354.380° (354°22′48″)
</pre>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">box(x)={["North","North by east","North-northeast","Northeast by north","Northeast",
"Northeast by east","East-northeast","East by north","East","East by south","East-southeast",
"Southeast by east","Southeast","Southeast by south","South-southeast","South by east","South",
Line 5,080 ⟶ 5,414:
"West by south","West","West by north","West-northwest","Northwest by west","Northwest",
"Northwest by north","North-northwest","North by west"][round(x*4/45)%32+1]};
for(i=0,32,print(i%32+1" "box(x=i*11.25+if(i%3==1,5.62,if(i%3==2,-5.62)))" "x))</langsyntaxhighlight>
 
Output:
Line 5,116 ⟶ 5,450:
32 North by west 354.370000
1 North 354.380000</pre>
 
=={{header|Pascal}}==
{{trans|Fortran}}
<langsyntaxhighlight lang="pascal">program BoxTheCompass(output);
 
function compasspoint(angle: real): string;
Line 5,155 ⟶ 5,488:
writeln((i mod 32) + 1:2, ' ', compasspoint(heading), ' ', heading:8:4);
end;
end.</langsyntaxhighlight>
Output:
<pre>
Line 5,193 ⟶ 5,526:
1 North 354.3800
</pre>
 
=={{header|Perl}}==
Don't waste brain cells calculating names, not worth the effort. Code is probably shorter, faster, and easier to read this way.
<langsyntaxhighlight Perllang="perl">use utf8;
 
my @names = (
Line 5,240 ⟶ 5,572:
my $i = int(($_ * 32 / 360) + .5) % 32;
printf "%3d %18s %6.2f°\n", $i + 1, $names[$i], $_;
}</langsyntaxhighlight>output<syntaxhighlight lang="text"> 1 North 0.00°
2 North by east 16.87°
3 North-northeast 16.88°
Line 5,272 ⟶ 5,604:
31 North-northwest 337.50°
32 North by west 354.37°
1 North 354.38°</langsyntaxhighlight>
 
=={{header|Phix}}==
Unlike the Perl guy, for me the maths is the boring bit, building those strings is the fun!<br>
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get225</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">p1</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">p2</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">p4</span><span style="color: #0000FF;">)</span>
Line 5,323 ⟶ 5,654:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"%2d %-22s %6.2f\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">compass_point</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">compass_points</span><span style="color: #0000FF;">[</span><span style="color: #000000;">compass_point</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">test_point</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
If you like, you can regard d=1 (both of them) as "clockwise-name-inherit" and d=0 as "anti-clockwise-name-inherit".<br>
{{out}}
Line 5,362 ⟶ 5,693:
</pre>
of course the following (more sensible but less fun, full standalone program) way works just as well, and produces the same output
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">compass_points</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #008000;">"North"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"North by east"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"North-northeast"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Northeast by north"</span><span style="color: #0000FF;">,</span>
Line 5,379 ⟶ 5,710:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"%2d %-22s %6.2f\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">compass_point</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">compass_points</span><span style="color: #0000FF;">[</span><span style="color: #000000;">compass_point</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">test_points</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
 
=={{header|Picat}}==
{{trans|Nim}}
<langsyntaxhighlight Picatlang="picat">go =>
Names = ["North", "North by east", "North-northeast", "Northeast by north",
"Northeast", "Northeast by east", "East-northeast", "East by north",
Line 5,400 ⟶ 5,730:
printf("%2d %-20s %6.2f\n", J+1, Names[J+1], D)
end,
nl.</langsyntaxhighlight>
 
{{out}}
Line 5,436 ⟶ 5,766:
32 North by west 354.37
1 North 354.38</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(scl 3)
 
(setq *Compass # Build lookup table
Line 5,471 ⟶ 5,800:
NIL
(cdr (heading H))
(round H 2) ) ) )</langsyntaxhighlight>
Output:
<pre> 1 north 0.00
Line 5,506 ⟶ 5,835:
32 north by west 354.37
1 north 354.38</pre>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">function Convert-DegreeToDirection ( [double]$Degree )
{
Line 5,523 ⟶ 5,851:
$x = 0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, 185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0, 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38
$x | % { Convert-DegreeToDirection -Degree $_ }</langsyntaxhighlight>
{{out}}
<pre>north
Line 5,559 ⟶ 5,887:
north</pre>
A more general solution allowing you to choose whether to use 4, 8, 16, or 32 compass points.
<langsyntaxhighlight lang="powershell">function Convert-DegreeToDirection ( [double]$Degree, [int]$Points )
{
Line 5,581 ⟶ 5,909:
8 = ( Convert-DegreeToDirection -Degree $Degree -Points 8 )
4 = ( Convert-DegreeToDirection -Degree $Degree -Points 4 ) } }
$Values | Format-Table</langsyntaxhighlight>
{{out}}
<pre>Degree 32 16 8 4
Line 5,618 ⟶ 5,946:
354.37 north by west north north north
354.38 north north north north</pre>
 
=={{header|Prolog}}==
Part 1 : The following knowledge base takes a heading in degrees and returns the correct 32-point compass heading. It can also go in the other direction.
<langsyntaxhighlight lang="prolog">
compassangle(1, 'North',n, 0.00).
compassangle(2, 'North by east', nbe, 11.25).
Line 5,659 ⟶ 5,986:
 
resolveindex(Angle, Index) :- N is Angle / 11.25 + 0.5, I is floor(N),Index is (I mod 32) + 1.
</syntaxhighlight>
</lang>
Part 2 : The following rules print a table of indexes.
<langsyntaxhighlight lang="prolog">
printTableRow(Angle) :- compassangle(Index, Name, _, Angle),
write(Index), write(' '),
Line 5,669 ⟶ 5,996:
printTable([X|Xs]) :- printTableRow(X), nl, printTable(Xs),!.
printTable([]).
</syntaxhighlight>
</lang>
The following query prints the required table.
<langsyntaxhighlight lang="prolog">
?- printTable([0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75, 185.62,
185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0, 286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38]).
Line 5,708 ⟶ 6,035:
1 North 354.38
true.
</syntaxhighlight>
</lang>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">DataSection
Data.s "N", "north", "E", "east", "W", "west", "S", "south", "b", " by " ;abbreviations, expansions
Data.s "N NbE N-NE NEbN NE NEbE E-NE EbN E EbS E-SE SEbE SE SEbS S-SE SbE" ;dirs
Line 5,783 ⟶ 6,109:
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf</langsyntaxhighlight>
Sample output:
<pre> 1 North 0.00
Line 5,818 ⟶ 6,144:
32 North by west 354.37
1 354.38</pre>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">majors = 'north east south west'.split()
majors *= 2 # no need for modulo later
quarter1 = 'N,N by E,N-NE,NE by N,NE,NE by E,E-NE,E by N'.split(',')
Line 5,844 ⟶ 6,169:
elif m == 2: d -= 5.62
n = i % 32 + 1
print( '%2i %-18s %7.2f°' % (n, degrees2compasspoint(d), d) )</langsyntaxhighlight>
 
;Output
Line 5,880 ⟶ 6,205:
32 North by west 354.37°
1 North 354.38°</pre>
 
 
=={{header|QBasic}}==
Line 5,886 ⟶ 6,210:
{{works with|QuickBasic|4.5}}
{{trans|Liberty BASIC}}
<langsyntaxhighlight lang="qbasic">DECLARE FUNCTION compasspoint$ (h!)
 
DIM SHARED point$(32)
Line 5,919 ⟶ 6,243:
IF (x >= 33!) THEN x = x - 32!
compasspoint$ = point$(INT(x))
END FUNCTION</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<code>switch</code>, <code>case</code> and <code>otherwise</code> are define at [[Metaprogramming#Quackery]].
 
<syntaxhighlight lang="Quackery"> [ tuck space swap of
join
swap split drop echo$ ] is lecho$ ( $ n --> )
 
[ table ] is heading
 
$ "N NbE N-NE NEbN NE NEbE E-NE EbN
E EbS E-SE SEbE SE SEbS S-SE SbE
S SbW S-SW SWbS SW SWbW W-SW WbS
W WbN W-NW NWbW NW NWbN N-NW NbW"
nest$
witheach
[ $ "" swap
witheach
[ [ switch
char N case $ "north"
char E case $ "east"
char S case $ "south"
char W case $ "west"
char b case $ " by "
otherwise $ "-" ]
join ]
' heading put ]
 
[ 4 45 v* 1 2 v+ / 32 mod heading ] is degrees->compass$ ( n/d --> $ )
 
$ " 0.0 16.87 16.88 33.75 50.62 50.63
67.5 84.37 84.38 101.25 118.12 118.13
135.0 151.87 151.88 168.75 185.62 185.63
202.5 219.37 219.38 236.25 253.12 253.13
270.0 286.87 286.88 303.75 320.62 320.63
337.5 354.37 354.38"
nest$
witheach
[ i^ 32 mod 1+
dup 10 < if sp
echo sp
dup $->v drop
degrees->compass$ 19 lecho$
echo$ cr ]</syntaxhighlight>
 
{{out}}
 
<pre> 1 north 0.0
2 north by east 16.87
3 north-northeast 16.88
4 northeast by north 33.75
5 northeast 50.62
6 northeast by east 50.63
7 east-northeast 67.5
8 east by north 84.37
9 east 84.38
10 east by south 101.25
11 east-southeast 118.12
12 southeast by east 118.13
13 southeast 135.0
14 southeast by south 151.87
15 south-southeast 151.88
16 south by east 168.75
17 south 185.62
18 south by west 185.63
19 south-southwest 202.5
20 southwest by south 219.37
21 southwest 219.38
22 southwest by west 236.25
23 west-southwest 253.12
24 west by south 253.13
25 west 270.0
26 west by north 286.87
27 west-northwest 286.88
28 northwest by west 303.75
29 northwest 320.62
30 northwest by north 320.63
31 north-northwest 337.5
32 north by west 354.37
1 north 354.38
</pre>
 
=={{header|R}}==
Line 5,926 ⟶ 6,331:
R (also known as Arrr me hearties!) is ideally suited to this task. Here's an easy to understand but inefficient way to solve it:
 
<syntaxhighlight lang="rsplus">
<lang R>
# Build a table of directions
pts <- data.frame(
des = c("N", "NxE", "NNE", "NExN", "NE", "NExE", "ENE", "ExN",
Line 5,938 ⟶ 6,344:
heading <- Vectorize(function(deg) {
res <- pts
# Calculate the absolute difference between each
# point on the table and the function input
res$diff <- abs(res$deg - deg)
# Sort the table by abs difference, return the first
res <- res[order(res$diff), ]
res[1,]$des[1]
})
</syntaxhighlight>
</lang>
 
Here are the test inputs:
 
<syntaxhighlight lang="rsplus">
<lang R>
test <- data.frame(
deg = c( 0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5, 84.37,
Line 5,958 ⟶ 6,367:
test$heading <- heading(test$deg)
test
</syntaxhighlight>
</lang>
 
Check that the output headings cover the full range of headings:
 
<syntaxhighlight lang="r">
<lang R>
all.equal(test$heading, pts$des)
</syntaxhighlight>
</lang>
 
{{out}}
Line 6,007 ⟶ 6,416:
[1] TRUE
</pre>
 
 
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">#lang racket
 
;;; Generate the headings and boxes
Line 6,065 ⟶ 6,471:
(check-= (heading->box 5.62) 1 0)
(check-= (heading->box 5.63) 2 0)
(check-= (heading->box 16.87) 2 0))</langsyntaxhighlight>
 
Output:
Line 6,103 ⟶ 6,509:
32 | 354.37 | North by west
1 | 354.38 | North</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2015.12}}
<syntaxhighlight lang="raku" perl6line>sub point (Int $index) {
my $ix = $index % 32;
if $ix +& 1
Line 6,128 ⟶ 6,533:
𝜽,
tc point angle-to-point 𝜽;
}</langsyntaxhighlight>
 
Output:
Line 6,165 ⟶ 6,570:
1 354.38° North</pre>
=={{header|Red}}==
<langsyntaxhighlight Rebollang="rebol">Red []
 
d: charset [#"N" #"E" #"S" #"W"] ;; main directions
Line 6,187 ⟶ 6,592:
hm/:heading: reduce [ (i % 32 + 1 ) expand to-string compass-points/1 [N north b " by " S south E east W west] ]
print-line heading
]</langsyntaxhighlight>
'''output'''
<pre>
Line 6,227 ⟶ 6,632:
=={{header|REXX}}==
This version does normalization of the (degree) heading and can also handle negative headings.
<langsyntaxhighlight lang="rexx">/*REXX program "boxes the compass" [from degree (º) headings ───► a 32 point set]. */
parse/* arg $ [from degree (º) headings ---> a 32 point set]. /*allow º headings to be specified.*/
Parse Arg degrees
if $='' then $= 0 16.87 16.88 33.75 50.62 50.63 67.5 84.37 84.38 101.25 118.12 118.13 ,
If degrees='' Then
135 151.87 151.88 168.75 185.62 185.63 202.5 219.37 219.38 236.25 ,
degrees=0 253.12 253.13 270 28616.87 28616.88 30333.75 32050.62 32050.63 33767.5 35484.37 35484.38 101.25,
118.12 118.13 135 151.87 151.88 168.75 185.62 185.63 202.5,
/* [↑] use default, they're in degrees*/
219.37 219.38 236.25 253.12 253.13 270 286.87 286.88 303.75,
@pts= 'n nbe n-ne nebn ne nebe e-ne ebn e ebs e-se sebe se sebs s-se sbe',
320.62 320.63 337.5 354.37 354.38
"s sbw s-sw swbs sw swbw w-sw wbs w wbn w-nw nwbw nw nwbn n-nw nbw"
names='n nbe n-ne nebn ne nebe e-ne ebn e ebs e-se sebe se sebs s-se sbe',
's sbw s-sw swbs sw swbw w-sw wbs w wbn w-nw nwbw nw nwbn n-nw nbw'
 
#nn= words(@ptsnames) + 1 /*# nn: used for integer ÷ remainder (//)*/
dirs= 'north south east west' /* define cardinal compass directions. */
/* [↓] choose a glyph for degree (°).*/
ifIf 4=='f4'x Then then degSym= "a1"x /* is this system an EBCDIC system? */
degsym='a1'x
else degSym= "a7"x /*'f8'x is the degree symbol: ° vs º */
Else
/*──────────────────────────── f8 vs a7*/
degsym='f8'x /* or degsym='a7'x */
say right(degSym'heading', 30) center("compass heading", 20)
saySay right( degsym'════════heading', 30) copiescenter('compass "═"heading', 20)
Say right('--------',30) copies('-',20)
pad= ' ' /*used to interject a blank for output.*/
pad=' ' do j=1 for words($); x= word($, j) /*obtain oneused ofto theinterject degreea blank for headings.o */
Do i=1 To words(degrees)
say right( format(x, , 2)degSym, 30-1) pad boxHeading(x)
x=word(degrees,i) end /*j obtain one of the degree headings */
Say right(format(x,,2)degsym,30-1) pad boxheading(x)
exit /*stick a fork in it, we're all done. */
End
/*──────────────────────────────────────────────────────────────────────────────────────*/
Exit /* stick a fork in it, we're all done*/
boxHeading: y= arg(1)//360; if y<0 then y=360-y /*normalize heading within unit circle.*/
/*---------------------------------------------------------------------*/
z= word(@pts, trunc(max(1, (y/11.25 +1.5) // #))) /*convert degrees─►heading*/
boxheading:
do k=1 for words(dirs); d= word(dirs, k)
y=arg(1)//360
z= changestr( left(d, 1), z, d)
If y<0 Then
end /*k*/ /* [↑] old, haystack, new*/
y=360-y return changestr('b', z, " by ") /*expand normalize "b"heading ───►within "unit bycircle ".*/</lang>
z=word(names,trunc(max(1,(y/11.25+1.5)//nn))) /* degrees->heading */
/* n e s w are now replaced by north east south west, respectively */
Do k=1 To words(dirs)
d=word(dirs,k)
z=changestr(left(d,1),z,d)
End
Return changestr('b',z,' by ') /* expand 'b' ---? ' by '. */</syntaxhighlight>
Some older REXXes don't have a &nbsp; '''changestr''' &nbsp; BIF, &nbsp; so one is included here &nbsp; ──► &nbsp; [[CHANGESTR.REX]].
<br><br>
{{out}}
'''output'''
<pre>
ºheading compass heading
Line 6,298 ⟶ 6,712:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Box the compass
 
Line 6,328 ⟶ 6,742:
ok
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 6,364 ⟶ 6,778:
354.37 31 North by west
354.38 0 North
</pre>
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.9}}
{| class="wikitable" ≪
! RPL code
! Comment
|-
|
≪ { "north" "east" "south" "west" }
SWAP 8 / IP 1 + GET
LAST 1 + DUP 5 ≠ SWAP 1 IFTE GET
≫ '<span style="color:blue">I→QDT</span>' STO
≪ → pattern a b
≪ "" 1 pattern SIZE '''FOR''' j
pattern j DUP SUB
DUP "X" == a ROT DUP "Y" == b ROT IFTE IFTE
+ '''NEXT'''
≫ ≫ '<span style="color:blue">FILLXY</span>' STO
11.25 / 0.5 + FLOOR 32 MOD
{ "X" "X by Y" "X-XY" "XY by X"
"XY" "XY by Y" "Y-XY" "Y by X" "Y" }
OVER 8 MOD 1 + GET SWAP <span style="color:blue">I→QDT</span> <span style="color:blue">FILLXY</span>
≫ '<span style="color:blue">→HDG</span>' STO
|
<span style="color:blue">I→QDT</span> ''( index → "wind1" "wind2" )'' // index ∈ [0,31]
Get wind1
Get wind2
<span style="color:blue">FILLXY</span> ''( "pattern" "a" "b" → "string" ) ''
Initialize output string and loop
get jth character of pattern
replace "X" by "a" and "Y" by b
add to output string
<span style="color:blue">→HDG</span> ''( angle → "heading" )'' // angle in degreees
Convert angle into compass index
Naming patterns
Get pattern, get winds and convert into heading
|}
The demonstration has been limited to a few significant cases, due to the poor display capabilities of typical RPL devices (e.g. 4 x 22 characters on a HP-28S) :
≪ <span style="color:red">{ 0 16.87 16.88 33.75 50.62 354.37 354.38 } { } 1 3</span> PICK SIZE '''FOR''' j OVER j GET <span style="color:blue">→HDG</span> + '''NEXT''' SWAP DROP ≫ EVAL
 
{{out}}
<pre>
1: { "north" "north by east" "north-northeast" "northeast by north" "northeast" "north by west" "north" }
</pre>
 
=={{header|Ruby}}==
 
<langsyntaxhighlight lang="ruby">Headings = %w(north east south west north).each_cons(2).flat_map do |a, b|
[a,
"#{a} by #{b}",
Line 6,391 ⟶ 6,859:
index, name = heading degrees
printf "%2d %20s %6.2f\n", index, name.center(20), degrees
end</langsyntaxhighlight>
 
{{output}}
Line 6,429 ⟶ 6,897:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">global direct$
dim direct$(22)
direct$(1) = "y" 'by
Line 6,465 ⟶ 6,933:
data "N","N b e","N-ne","Ne b n","Ne","Ne b e","E-ne","E b n","E","E b s","E-se"
data "Se b e","Se","Se b s","S-se","S b e","S","S b w","S-sw","Sw b s","Sw","Sw b w"
data "W-sw","W b s","W","W b n","W-nw","Nw b w","Nw","Nw b n","N-nw","N b w"</langsyntaxhighlight>
<code><table border=1>
<TR><TD align=right>1</td><td>North</td><td>0.0</td></tr>
Line 6,502 ⟶ 6,970:
</table>
</code>
 
=={{header|Rust}}==
{{trans|Kotlin}}
<langsyntaxhighlight Rustlang="rust">fn expand(cp: &str) -> String {
let mut out = String::new();
for c in cp.chars() {
Line 6,544 ⟶ 7,011:
);
}
}</langsyntaxhighlight>
{{out}}
<pre>Index Degrees Compass point
Line 6,581 ⟶ 7,048:
32 354.37 north by west
1 354.38 north</pre>
 
=={{header|Scala}}==
Inspired by Java version
<langsyntaxhighlight Scalalang="scala">object BoxingTheCompass extends App {
val cardinal = List("north", "east", "south", "west")
val pointDesc = List("1", "1 by 2", "1-C", "C by 1", "C", "C by 2", "2-C", "2 by 1")
Line 6,605 ⟶ 7,071:
(0 to 32).map(i=>Triple(pointDeg(i),deg2ind(pointDeg(i)),pointName(deg2ind(pointDeg(i)))))
.map{t=>(printf("%s\t%18s\t%s°\n",t._2,t._3,t._1))}
}</langsyntaxhighlight>
 
Output:
Line 6,643 ⟶ 7,109:
1 North 354.38°
</pre>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "float.s7i";
 
Line 6,668 ⟶ 7,133:
degrees[index] digits 2 lpad 6);
end for;
end func;</langsyntaxhighlight>
 
Output:
Line 6,706 ⟶ 7,171:
1 North 354.38
</pre>
 
=={{header|Sidef}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">func point (index) {
var ix = (index % 32);
if (ix & 1) { "#{point((ix + 1) & 28)} by #{point(((2 - (ix & 2)) * 4) + ix & 24)}" }
Line 6,723 ⟶ 7,187:
var 𝜽 = test_angle(ix);
printf(" %2d %6.2f° %s\n", ix % 32 + 1, 𝜽, point(angle_to_point(𝜽)).tc);
}</langsyntaxhighlight>
{{out}}
<pre>
Line 6,760 ⟶ 7,224:
1 354.38° North
</pre>
 
=={{header|smart BASIC}}==
<langsyntaxhighlight lang="smart BASICbasic">/*Boxing The Compass by rbytes December 2017*/
GET SCREEN SIZE sw,sh
OPTION BASE 1
Line 6,798 ⟶ 7,261:
DATA "Northwest", "NW", "309.38", "315.00", "320.62", "Northwest by north", "NWbN", "320.63", "326.25", "331.87"
DATA "North-northwest", "NNW", "331.88", "337.50", "343.12", "North by west", "NbW", "343.13", "348.75", "354.37"
</syntaxhighlight>
</lang>
Output:
<pre>
Line 6,836 ⟶ 7,299:
31 North-northwest NNW 331.88 337.50 343.12
32 North by west NbW 343.13 348.75 354.37
</pre>
=={{header|Swift}}==
Implementation:
<syntaxhighlight lang="swift">
import Foundation
 
extension Double {
var nearestQr: Double {(self * 4.0).rounded(.toNearestOrAwayFromZero) / 4.0}
}
 
extension Measurement<UnitAngle>/*: ExpressibleByFloatLiteral*/ {
var cos: Double { Darwin.cos(self.converted(to: .radians).value) }
var sin: Double { Darwin.sin(self.converted(to: .radians).value) }
}
 
struct Compass {
var bearing: Measurement<UnitAngle>
var style: Style = .RN
init(_ deg: Double, _ min: Double = 0, _ sec: Double = 0, style: Style = .RN
) {
self.bearing = .init(value: deg + min/60.0 + sec/360.0, unit: .degrees)
self.style = style
}
static func degreesToPoints(_ deg: Double) -> Double {
(deg/360 * 32).nearestQr
}
var point: Double {
Self.degreesToPoints(self.bearing.value)
}
var quad: (String,String) {
(bearing.cos < 0 ? "S" : "N", bearing.sin < 0 ? "W" : "E")
}
var step: (Int,Double) {
let temp = 8 - abs(abs(self.point - 16) - 8)
return (Int(temp),temp.truncatingRemainder(dividingBy: 1))
}
enum Style {case RN, USN, noBy}
var formats = ["N", "NxE", "NNE", "NExN", "NE", "NExE", "ENE", "ExN", "E"]
let fractions = ["¼","½","¾"]
var invertedPoints: [Int] {
switch self.style {
case .RN: [3,6,7]
case .USN: [3,7]
case .noBy: [1,5,7]
}
}
 
func named() -> String {
var (pt,frac) = self.step
var fracStr: String = ""
if frac != 0.0 {
if invertedPoints.contains(pt) {
pt += 1
fracStr = fractions.reversed()[Int(frac * 4) - 1] + "N"
} else {
fracStr = fractions[Int(frac * 4) - 1] + "E"
}
}
return (self.formats[pt] + fracStr)
.replacing(/(N|E)/) { $0.output.0 == "N" ? self.quad.0 : self.quad.1 }
.replacing(/x/) {_ in "by"}
}
}
</syntaxhighlight>
Execution:
<syntaxhighlight lang="swift">
let arr = [
000.00, 016.87, 016.88, 033.75, 050.62, 050.63, 067.50, 084.37, 084.38,
090.00, 101.25, 118.12, 118.13, 135.00, 151.87, 151.88, 168.75, 185.62,
185.63, 202.50, 219.37, 219.38, 236.25, 253.12, 253.13, 270.00, 286.87,
286.88, 303.75, 320.62, 320.63, 337.50, 354.37, 354.38
]
 
let arr2 = stride(from: 0, through: 360, by: 22.5/8.0)
 
let pointFormatter = NumberFormatter()
pointFormatter.minimumIntegerDigits = 2
pointFormatter.minimumFractionDigits = 2
 
for d in arr {
let c = Compass(d, style: .RN)
print(pointFormatter.string(from: c.point as NSNumber)!, c.dms , c.named())
}
</syntaxhighlight>
Result:
<pre>
00.00 000°00'00" N
01.50 016°52'12" NbyE½E
01.50 016°52'47" NbyE½E
03.00 033°45'00" NEbyN
04.50 050°37'11" NE½E
04.50 050°37'48" NE½E
06.00 067°30'00" ENE
07.50 084°22'12" E½N
07.50 084°22'47" E½N
08.00 090°00'00" E
09.00 101°15'00" EbyS
10.50 118°07'12" SEbyE½E
10.50 118°07'47" SEbyE½E
12.00 135°00'00" SE
13.50 151°52'12" SSE½E
13.50 151°52'47" SSE½E
15.00 168°45'00" SbyE
16.50 185°37'12" S½W
16.50 185°37'47" S½W
18.00 202°30'00" SSW
19.50 219°22'12" SW½S
19.50 219°22'47" SW½S
21.00 236°15'00" SWbyW
22.50 253°07'12" WbyS½S
22.50 253°07'47" WbyS½S
24.00 270°00'00" W
25.50 286°52'12" WbyN½N
25.50 286°52'47" WbyN½N
27.00 303°45'00" NWbyW
28.50 320°37'12" NW½N
28.50 320°37'47" NW½N
30.00 337°30'00" NNW
31.50 354°22'12" N½W
31.50 354°22'47" N½W
</pre>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc angle2compass {angle} {
set dirs {
N NbE N-NE NEbN NE NEbE E-NE EbN E EbS E-SE SEbE SE SEbS S-SE SbE
Line 6,865 ⟶ 7,448:
# Pretty-print the results of converting an angle to a compass heading
puts [format "%2i %-18s %7.2f°" $index [angle2compass $heading] $heading]
}</langsyntaxhighlight>
Output:
<pre>
Line 6,902 ⟶ 7,485:
1 North 354.38°
</pre>
 
=={{header|True BASIC}}==
{{trans|QBasic}}
<langsyntaxhighlight lang="qbasic">DIM point$(32)
 
FUNCTION compasspoint$ (h)
Line 6,938 ⟶ 7,520:
PRINT ind, compasspoint$(heading), heading
NEXT i
END</langsyntaxhighlight>
 
=={{header|uBasic/4tH}}==
{{trans|C}}
Since uBasic is an integer interpreter, we have to do some scaling to perform this task.
<syntaxhighlight lang="text">Push 0, 1687, 1688, 3375, 5062, 5063, 6750, 8437, 8438, 10125, 11812, 11813
Push 13500, 15187, 15188, 16875, 18562, 18563, 20250, 21937, 21938, 23625
Push 25312, 25313, 27000, 28687, 28688, 30375, 32062, 32063, 33750, 35437
Line 6,996 ⟶ 7,577:
400 Print "North-northwest "; : Return
410 Print "North by west "; : Return
420 Print "North "; : Return</langsyntaxhighlight>
{{out}}
<pre>
Line 7,035 ⟶ 7,616:
0 OK, 0:900
</pre>
 
=={{header|UNIX Shell}}==
{{works with|Bourne Again SHell}}
Line 7,042 ⟶ 7,622:
Requires the standard POSIX bc(1) command to perform floating-point arithmetic.
 
<langsyntaxhighlight lang="sh"># List of abbreviated compass point labels
compass_points=( N NbE N-NE NEbN NE NEbE E-NE EbN
E EbS E-SE SEbE SE SEbS S-SE SbE
Line 7,091 ⟶ 7,671:
label="$(expand_point $abbr)"
printf "$row_format" $angle "$label" $index
done</langsyntaxhighlight>
 
Output: <pre>Degrees | Closest Point | Index
Line 7,128 ⟶ 7,708:
354.38 | North | 1
</pre>
 
=={{header|VBA}}==
<langsyntaxhighlight lang="vb">Public Sub box_the_compass()
Dim compass_point As Integer
Dim compass_points_all As New Collection
Line 7,163 ⟶ 7,742:
Debug.Print test_points_all(i)
Next i
End Sub</langsyntaxhighlight>{{out}}
<pre> 1 North 0
2 North by east 16,87
Line 7,197 ⟶ 7,776:
32 North by west 354,37
1 North 354,38 </pre>
 
=={{header|Visual Basic .NET}}==
 
<langsyntaxhighlight lang="vbnet">Module BoxingTheCompass
Dim _points(32) As String
 
Line 7,246 ⟶ 7,824:
End Function
End Module
</syntaxhighlight>
</lang>
Output:
<pre>
Line 7,283 ⟶ 7,861:
1: North 354.38°
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
 
// 'cpx' returns integer index from 0 to 31 corresponding to compass point.
Line 7,350 ⟶ 7,927:
var index = i%32 + 1 // printable index computed per pseudocode
var d = degreesToCompassPoint.call(h)
SystemFmt.print("%(Fmt.d(4,$4d index)) $-19s %(Fmt$7.s(-192f°", index, d)) %(Fmt.f(7, h,) 2))°")
i = i + 1
}</langsyntaxhighlight>
 
{{out}}
Line 7,390 ⟶ 7,967:
32 North by west 354.37°
1 North 354.38°
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">func Deg2Index(Heading); \Return index from heading in degrees
real Heading;
def Sector = 360./32.;
return (fix(Heading/Sector) & $1F) + 1;
 
real Headings;
int CompassPoint, H, Index;
[Headings:= [
0.0, 16.87, 16.88, 33.75, 50.62, 50.63, 67.5,
84.37, 84.38, 101.25, 118.12, 118.13, 135.0, 151.87, 151.88, 168.75,
185.62, 185.63, 202.5, 219.37, 219.38, 236.25, 253.12, 253.13, 270.0,
286.87, 286.88, 303.75, 320.62, 320.63, 337.5, 354.37, 354.38];
CompassPoint:= [
"North", "North by east", "North-northeast", "Northeast by north",
"Northeast", "Northeast by east", "East-northeast", "East by north",
"East", "East by south", "East-southeast", "Southeast by east",
"Southeast", "Southeast by south", "South-southeast", "South by east",
"South", "South by west", "South-southwest", "Southwest by south",
"Southwest", "Southwest by west", "West-southwest", "West by south",
"West", "West by north", "West-northwest", "Northwest by west",
"Northwest", "Northwest by north", "North-northwest", "North by west"];
Text(0, "Index Heading Compass Point^m^j");
for H:= 0 to 33-1 do
[Index:= Deg2Index(Headings(H));
Format(3,0);
RlOut(0, float(Index));
Format(7,2);
RlOut(0, Headings(H));
Text(0, " ");
Text(0, CompassPoint(Index-1));
CrLf(0);
];
]</syntaxhighlight>
{{out}}
<pre>
Index Heading Compass Point
1 0.00 North
2 16.87 North by east
3 16.88 North-northeast
4 33.75 Northeast by north
5 50.62 Northeast
6 50.63 Northeast by east
7 67.50 East-northeast
8 84.37 East by north
9 84.38 East
10 101.25 East by south
11 118.12 East-southeast
12 118.13 Southeast by east
13 135.00 Southeast
14 151.87 Southeast by south
15 151.88 South-southeast
16 168.75 South by east
17 185.62 South
18 185.63 South by west
19 202.50 South-southwest
20 219.37 Southwest by south
21 219.38 Southwest
22 236.25 Southwest by west
23 253.12 West-southwest
24 253.13 West by south
25 270.00 West
26 286.87 West by north
27 286.88 West-northwest
28 303.75 Northwest by west
29 320.62 Northwest
30 320.63 Northwest by north
31 337.50 North-northwest
32 354.37 North by west
1 354.38 North
</pre>
 
=={{header|Yabasic}}==
{{trans|Liberty BASIC}}
<syntaxhighlight lang="yabasic">
<lang Yabasic>
dim point$(32)
Line 7,431 ⟶ 8,080:
70 data "West by south ", "West ", "West by north ", "West-northwest "
80 data "Northwest by west ", "Northwest ", "Northwest by north", "North-northwest "
90 data "North by west "</langsyntaxhighlight>
 
=={{header|Zig}}==
{{works with|Zig|0.11.0}}
<syntaxhighlight lang="zig">const std = @import("std");</syntaxhighlight>
<syntaxhighlight lang="zig">/// Degrees is not constrained to the range 0 to 360
fn degreesToCompassPoint(degrees: f32) []const u8 {
var d = degrees + comptime (11.25 / 2.0);
while (d < 0) d += 360;
while (d >= 360) d -= 360;
const index: usize = @intFromFloat(@divFloor(d, 11.25));
 
const points: [32][]const u8 = comptime .{
"North", "North by east", "North-northeast", "Northeast by north",
"Northeast", "Northeast by east", "East-northeast", "East by north",
"East", "East by south", "East-southeast", "Southeast by east",
"Southeast", "Southeast by south", "South-southeast", "South by east",
"South", "South by west", "South-southwest", "Southwest by south",
"Southwest", "Southwest by west", "West-southwest", "West by south",
"West", "West by north", "West-northwest", "Northwest by west",
"Northwest", "Northwest by north", "North-northwest", "North by west",
};
 
return points[index];
}</syntaxhighlight>
<syntaxhighlight lang="zig">pub fn main() anyerror!void {
const stdout = std.io.getStdOut().writer();
 
try stdout.print("Index Heading Compass point\n", .{});
 
for (0..33) |i| {
var heading = @as(f32, @floatFromInt(i)) * 11.25;
heading += switch (i % 3) {
1 => 5.62,
2 => -5.62,
else => 0,
};
const index = i % 32 + 1;
try stdout.print(" {d:2} {d:>6.2}° {s}\n", .{ index, heading, degreesToCompassPoint(heading) });
}
}</syntaxhighlight>
{{out}}
<pre>Index Heading Compass point
1 0.00° North
2 16.87° North by east
3 16.88° Northeast
...
31 337.50° Northwest
32 354.37° North by west
1 354.38° North</pre>
 
=={{header|zkl}}==
{{trans|AWK}}
<langsyntaxhighlight lang="zkl">A:=("X N NbE NNE NEbN NE NEbE ENE EbN E EbS ESE " // one based array
"SEbE SE SEbS SSE SbE S SbW SSW SWbS SW SWbW "
"WSW WbS W WbN WNW NWbW NW NWbN NNW NbW").split(" ");
Line 7,451 ⟶ 8,149:
box:=compassBox(heading);
println("%6.2f\UB0; : %2d\t%s".fmt(heading,box,A[box]));
}</langsyntaxhighlight>
{{out}}
<pre>
Line 7,464 ⟶ 8,162:
354.38 : 1 N
</pre>
 
=={{header|ZX Spectrum Basic}}==
{{trans|Liberty BASIC}}
<langsyntaxhighlight lang="zxbasic">10 DATA "North","North by east","North-northeast"
20 DATA "Northeast by north","Northeast","Northeast by east","East-northeast"
30 DATA "East by north","East","East by south","East-southeast"
Line 7,493 ⟶ 8,190:
250 STOP
260 DEF FN m(i,n)=((i/n)-INT (i/n))*n : REM modulus function
</syntaxhighlight>
</lang>
885

edits