Vigenère cipher: Difference between revisions
Content added Content deleted
m (OCaml: update links) |
Recombinant (talk | contribs) (Add Zig solution) |
||
Line 4,542: | Line 4,542: | ||
outfile = PACKMYBOXWITHFIVEDOZENLIQUORJUGS |
outfile = PACKMYBOXWITHFIVEDOZENLIQUORJUGS |
||
</pre> |
</pre> |
||
=={{header|Zig}}== |
|||
{{works with|Zig|0.11.0dev}} |
|||
<syntaxhighlight lang="zig">const std = @import("std"); |
|||
const Allocator = std.mem.Allocator; |
|||
</syntaxhighlight> |
|||
<syntaxhighlight lang="zig">/// Caller owns the returned slice memory. |
|||
fn vigenere(allocator: Allocator, text: []const u8, key: []const u8, encrypt: bool) Allocator.Error![]u8 { |
|||
var dynamic_string = std.ArrayList(u8).init(allocator); |
|||
var key_index: usize = 0; |
|||
for (text) |letter| { |
|||
const c = if (std.ascii.isLower(letter)) std.ascii.toUpper(letter) else letter; |
|||
if (std.ascii.isUpper(c)) { |
|||
const k = key[key_index]; |
|||
const n = if (encrypt) ((c - 'A') + (k - 'A')) else 26 + c - k; |
|||
try dynamic_string.append(n % 26 + 'A'); // A-Z |
|||
key_index += 1; |
|||
key_index %= key.len; |
|||
} |
|||
} |
|||
return dynamic_string.toOwnedSlice(); |
|||
}</syntaxhighlight> |
|||
<syntaxhighlight lang="zig">pub fn main() anyerror!void { |
|||
// allocator |
|||
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; |
|||
defer { |
|||
const ok = gpa.deinit(); |
|||
std.debug.assert(ok == .ok); |
|||
} |
|||
const allocator = gpa.allocator(); |
|||
// |
|||
const stdout = std.io.getStdOut().writer(); |
|||
// |
|||
const key = "VIGENERECIPHER"; |
|||
const text = "Beware the Jabberwock, my son! The jaws that bite, the claws that catch!"; |
|||
const encoded = try vigenere(allocator, text, key, true); |
|||
defer allocator.free(encoded); |
|||
_ = try stdout.print("{s}\n", .{encoded}); |
|||
const decoded = try vigenere(allocator, encoded, key, false); |
|||
defer allocator.free(decoded); |
|||
_ = try stdout.print("{s}\n", .{decoded}); |
|||
}</syntaxhighlight> |
|||
{{out}} |
|||
<pre>WMCEEIKLGRPIFVMEUGXQPWQVIOIAVEYXUEKFKBTALVXTGAFXYEVKPAGY |
|||
BEWARETHEJABBERWOCKMYSONTHEJAWSTHATBITETHECLAWSTHATCATCH</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |