Box the compass: Difference between revisions

Content added Content deleted
(add RPL)
m (→‎{{header|Zig}}: Updated to use 0.11.0 enum casts)
Line 7,804: Line 7,804:


=={{header|Zig}}==
=={{header|Zig}}==
{{works with|Zig|0.11.0dev}}
{{works with|Zig|0.11.0}}
<syntaxhighlight lang="zig">const std = @import("std");</syntaxhighlight>
<syntaxhighlight lang="zig">const std = @import("std");</syntaxhighlight>
<syntaxhighlight lang="zig">/// Degrees are not constrained to the range 0 to 360
<syntaxhighlight lang="zig">/// Degrees is not constrained to the range 0 to 360
fn degreesToCompassPoint(degrees: f32) []const u8 {
fn degreesToCompassPoint(degrees: f32) []const u8 {
var d = degrees + comptime (11.25 / 2.0);
var d = degrees + comptime (11.25 / 2.0);
while (d < 0) d += 360;
while (d < 0) d += 360;
while (d >= 360) d -= 360;
while (d >= 360) d -= 360;
const index: usize = @floatToInt(usize, @divFloor(d, 11.25));
const index: usize = @intFromFloat(@divFloor(d, 11.25));


const points: [32][]const u8 = comptime .{
// Concatenation to overcome the inability of "zig fmt" to nicely format long arrays.
"North", "North by east", "North-northeast", "Northeast by north",
const points: [32][]const u8 = comptime .{} ++
.{ "North", "North by east", "North-northeast", "Northeast by north" } ++
"Northeast", "Northeast by east", "East-northeast", "East by north",
.{ "Northeast", "Northeast by east", "East-northeast", "East by north" } ++
"East", "East by south", "East-southeast", "Southeast by east",
.{ "East", "East by south", "East-southeast", "Southeast by east" } ++
"Southeast", "Southeast by south", "South-southeast", "South by east",
.{ "Southeast", "Southeast by south", "South-southeast", "South by east" } ++
"South", "South by west", "South-southwest", "Southwest by south",
.{ "South", "South by west", "South-southwest", "Southwest by south" } ++
"Southwest", "Southwest by west", "West-southwest", "West by south",
.{ "Southwest", "Southwest by west", "West-southwest", "West by south" } ++
"West", "West by north", "West-northwest", "Northwest by west",
.{ "West", "West by north", "West-northwest", "Northwest by west" } ++
"Northwest", "Northwest by north", "North-northwest", "North by west",
};
.{ "Northwest", "Northwest by north", "North-northwest", "North by west" };


return points[index];
return points[index];
Line 7,829: Line 7,829:
const stdout = std.io.getStdOut().writer();
const stdout = std.io.getStdOut().writer();


_ = try stdout.print("Index Heading Compass point\n", .{});
try stdout.print("Index Heading Compass point\n", .{});


for (0..33) |i| {
for (0..33) |i| {
var heading = @intToFloat(f32, i) * 11.25;
var heading = @as(f32, @floatFromInt(i)) * 11.25;
heading += switch (i % 3) {
heading += switch (i % 3) {
1 => 5.62,
1 => 5.62,
Line 7,839: Line 7,839:
};
};
const index = i % 32 + 1;
const index = i % 32 + 1;
_ = try stdout.print(" {d:2} {d:>6.2}° {s}\n", .{ index, heading, degreesToCompassPoint(heading) });
try stdout.print(" {d:2} {d:>6.2}° {s}\n", .{ index, heading, degreesToCompassPoint(heading) });
}
}
}</syntaxhighlight>
}</syntaxhighlight>