aboutsummaryrefslogtreecommitdiff
path: root/challenge-307/deadmarshal
diff options
context:
space:
mode:
authorrir <rirans@comcast.net>2025-02-09 23:21:34 +0000
committerGitHub <noreply@github.com>2025-02-09 23:21:34 +0000
commit6f080fc3c36c5dd16f6ffb1b6e643fac6babc84b (patch)
tree5b7d8fa04b96268238b7b6ce520a76649b4d8be2 /challenge-307/deadmarshal
parent9380fe143cc5ce16d97cd6fcc2f2f8d18151e4d3 (diff)
parent20203255d0f29f170a3c0cd55a737c0b2981597f (diff)
downloadperlweeklychallenge-club-6f080fc3c36c5dd16f6ffb1b6e643fac6babc84b.tar.gz
perlweeklychallenge-club-6f080fc3c36c5dd16f6ffb1b6e643fac6babc84b.tar.bz2
perlweeklychallenge-club-6f080fc3c36c5dd16f6ffb1b6e643fac6babc84b.zip
Merge branch 'manwar:master' into work
Diffstat (limited to 'challenge-307/deadmarshal')
-rw-r--r--challenge-307/deadmarshal/blog.txt1
-rw-r--r--challenge-307/deadmarshal/java/Ch1.java21
-rw-r--r--challenge-307/deadmarshal/java/Ch2.java24
-rw-r--r--challenge-307/deadmarshal/modula-3/Ch1/src/Ch1.m338
-rw-r--r--challenge-307/deadmarshal/modula-3/Ch1/src/m3makefile4
-rw-r--r--challenge-307/deadmarshal/modula-3/Ch2/src/Ch2.m332
-rw-r--r--challenge-307/deadmarshal/modula-3/Ch2/src/m3makefile5
-rw-r--r--challenge-307/deadmarshal/perl/ch-1.pl14
-rw-r--r--challenge-307/deadmarshal/perl/ch-2.pl15
-rw-r--r--challenge-307/deadmarshal/zig/ch1/build.zig91
-rw-r--r--challenge-307/deadmarshal/zig/ch1/build.zig.zon72
-rw-r--r--challenge-307/deadmarshal/zig/ch1/src/main.zig60
-rw-r--r--challenge-307/deadmarshal/zig/ch1/src/root.zig10
-rw-r--r--challenge-307/deadmarshal/zig/ch2/build.zig91
-rw-r--r--challenge-307/deadmarshal/zig/ch2/build.zig.zon72
-rw-r--r--challenge-307/deadmarshal/zig/ch2/src/main.zig46
-rw-r--r--challenge-307/deadmarshal/zig/ch2/src/root.zig10
17 files changed, 606 insertions, 0 deletions
diff --git a/challenge-307/deadmarshal/blog.txt b/challenge-307/deadmarshal/blog.txt
new file mode 100644
index 0000000000..68a0d71f92
--- /dev/null
+++ b/challenge-307/deadmarshal/blog.txt
@@ -0,0 +1 @@
+https://deadmarshal.blogspot.com/2025/02/twc307.html
diff --git a/challenge-307/deadmarshal/java/Ch1.java b/challenge-307/deadmarshal/java/Ch1.java
new file mode 100644
index 0000000000..091b91b204
--- /dev/null
+++ b/challenge-307/deadmarshal/java/Ch1.java
@@ -0,0 +1,21 @@
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class Ch1 {
+ public static void main(String[] args) {
+ System.out.println(check_order(new int[]{5, 2, 4, 3, 1}));
+ System.out.println(check_order(new int[]{1, 2, 1, 1, 3}));
+ System.out.println(check_order(new int[]{3, 1, 3, 2, 3}));
+ }
+
+ private static List<Integer> check_order(int[] arr) {
+ List<Integer> ret = new ArrayList<>();
+ int[] sorted = Arrays.copyOf(arr, arr.length);
+ Arrays.sort(sorted);
+ for (int i = 0; i < sorted.length; ++i) {
+ if (sorted[i] != arr[i]) ret.add(i);
+ }
+ return ret;
+ }
+}
diff --git a/challenge-307/deadmarshal/java/Ch2.java b/challenge-307/deadmarshal/java/Ch2.java
new file mode 100644
index 0000000000..a4ef4c615d
--- /dev/null
+++ b/challenge-307/deadmarshal/java/Ch2.java
@@ -0,0 +1,24 @@
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class Ch2 {
+ public static void main(String[] args) {
+ System.out.println(
+ find_anagrams(new String[]{"acca", "dog", "god", "perl", "repl"}));
+ System.out.println(
+ find_anagrams(new String[]{"abba", "baba", "aabb", "ab", "ab"}));
+ }
+
+ private static int find_anagrams(String[] arr) {
+ int sum = 1;
+ for (int i = 0; i < arr.length; ++i) {
+ arr[i] = Stream.of(arr[i].split(""))
+ .sorted()
+ .collect(Collectors.joining());
+ }
+ for (int i = 1; i < arr.length; ++i)
+ if (!Objects.equals(arr[i - 1], arr[i])) sum++;
+ return sum;
+ }
+}
diff --git a/challenge-307/deadmarshal/modula-3/Ch1/src/Ch1.m3 b/challenge-307/deadmarshal/modula-3/Ch1/src/Ch1.m3
new file mode 100644
index 0000000000..ff9f34a8d6
--- /dev/null
+++ b/challenge-307/deadmarshal/modula-3/Ch1/src/Ch1.m3
@@ -0,0 +1,38 @@
+MODULE Ch1 EXPORTS Main;
+
+IMPORT SIO,IntArraySort,IntSeq;
+
+PROCEDURE CheckOrder(VAR A:ARRAY OF INTEGER):IntSeq.T =
+ VAR
+ Sorted := NEW(REF ARRAY OF INTEGER,NUMBER(A));
+ S := NEW(IntSeq.T).init(NUMBER(A));
+ BEGIN
+ SUBARRAY(Sorted^,FIRST(Sorted^),NUMBER(Sorted^)) :=
+ SUBARRAY(A,FIRST(A),NUMBER(A));
+ IntArraySort.Sort(Sorted^);
+ FOR I := FIRST(A) TO LAST(A) DO
+ IF A[I] # Sorted[I] THEN S.addhi(I); END
+ END;
+ RETURN S
+ END CheckOrder;
+
+PROCEDURE PrintSequence(READONLY S:IntSeq.T) =
+ BEGIN
+ FOR I := 0 TO S.size()-1 DO
+ SIO.PutInt(S.get(I));
+ SIO.PutChar(' ')
+ END;
+ SIO.Nl()
+ END PrintSequence;
+
+VAR
+ A1 := ARRAY[0..4] OF INTEGER{5,2,4,3,1};
+ A2 := ARRAY[0..4] OF INTEGER{1,2,1,1,3};
+ A3 := ARRAY[0..4] OF INTEGER{3,1,3,2,3};
+
+BEGIN
+ PrintSequence(CheckOrder(A1));
+ PrintSequence(CheckOrder(A2));
+ PrintSequence(CheckOrder(A3))
+END Ch1.
+
diff --git a/challenge-307/deadmarshal/modula-3/Ch1/src/m3makefile b/challenge-307/deadmarshal/modula-3/Ch1/src/m3makefile
new file mode 100644
index 0000000000..643b33d043
--- /dev/null
+++ b/challenge-307/deadmarshal/modula-3/Ch1/src/m3makefile
@@ -0,0 +1,4 @@
+import("libm3")
+import("libsio")
+implementation("Ch1")
+program("Ch1")
diff --git a/challenge-307/deadmarshal/modula-3/Ch2/src/Ch2.m3 b/challenge-307/deadmarshal/modula-3/Ch2/src/Ch2.m3
new file mode 100644
index 0000000000..8ad853d524
--- /dev/null
+++ b/challenge-307/deadmarshal/modula-3/Ch2/src/Ch2.m3
@@ -0,0 +1,32 @@
+MODULE Ch2 EXPORTS Main;
+
+IMPORT SIO,Text,CharArraySort;
+
+PROCEDURE SortText(VAR Str:TEXT):TEXT =
+ VAR
+ A := NEW(REF ARRAY OF CHAR,Text.Length(Str));
+ BEGIN
+ Text.SetChars(A^,Str);
+ CharArraySort.Sort(A^);
+ RETURN Text.FromChars(A^)
+ END SortText;
+
+PROCEDURE FindAnagrams(VAR A:ARRAY OF TEXT):CARDINAL =
+ VAR Sum:CARDINAL := 1;
+ BEGIN
+ FOR I := FIRST(A) TO LAST(A) DO A[I] := SortText(A[I]) END;
+ FOR I := 1 TO LAST(A) DO
+ IF NOT Text.Equal(A[I-1],A[I]) THEN INC(Sum) END
+ END;
+ RETURN Sum
+ END FindAnagrams;
+
+VAR
+ A1 := ARRAY[0..4] OF TEXT{"acca","dog","god","perl","repl"};
+ A2 := ARRAY[0..4] OF TEXT{"abba","baba","aabb","ab","ab"};
+
+BEGIN
+ SIO.PutInt(FindAnagrams(A1)); SIO.Nl();
+ SIO.PutInt(FindAnagrams(A2)); SIO.Nl()
+END Ch2.
+
diff --git a/challenge-307/deadmarshal/modula-3/Ch2/src/m3makefile b/challenge-307/deadmarshal/modula-3/Ch2/src/m3makefile
new file mode 100644
index 0000000000..b71c63d9b0
--- /dev/null
+++ b/challenge-307/deadmarshal/modula-3/Ch2/src/m3makefile
@@ -0,0 +1,5 @@
+import("libm3")
+import("libsio")
+array_sort("Char","Char")
+implementation("Ch2")
+program("Ch2")
diff --git a/challenge-307/deadmarshal/perl/ch-1.pl b/challenge-307/deadmarshal/perl/ch-1.pl
new file mode 100644
index 0000000000..9a3170b3e9
--- /dev/null
+++ b/challenge-307/deadmarshal/perl/ch-1.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Data::Show;
+
+sub check_order{
+ my @sorted = sort{$a <=> $b} @{$_[0]};
+ map{$sorted[$_] != $_[0]->[$_] ? $_ : ()} 0..$#sorted
+}
+
+print show check_order([5,2,4,3,1]);
+print show check_order([1,2,1,1,3]);
+print show check_order([3,1,3,2,3]);
+
diff --git a/challenge-307/deadmarshal/perl/ch-2.pl b/challenge-307/deadmarshal/perl/ch-2.pl
new file mode 100644
index 0000000000..eac358a96a
--- /dev/null
+++ b/challenge-307/deadmarshal/perl/ch-2.pl
@@ -0,0 +1,15 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+
+sub find_anagrams{
+ my ($arr) = @_;
+ my @sorted = map {join'',sort split ''} @$arr;
+ my $sum = 1;
+ map{$sum++ if $sorted[$_-1] ne $sorted[$_]} 1..$#sorted;
+ $sum
+}
+
+printf "%d\n",find_anagrams(['acca','dog','god','perl','repl']);
+printf "%d\n",find_anagrams(['abba','baba','aabb','ab','ab']);
+
diff --git a/challenge-307/deadmarshal/zig/ch1/build.zig b/challenge-307/deadmarshal/zig/ch1/build.zig
new file mode 100644
index 0000000000..3a545f1f98
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch1/build.zig
@@ -0,0 +1,91 @@
+const std = @import("std");
+
+// Although this function looks imperative, note that its job is to
+// declaratively construct a build graph that will be executed by an external
+// runner.
+pub fn build(b: *std.Build) void {
+ // Standard target options allows the person running `zig build` to choose
+ // what target to build for. Here we do not override the defaults, which
+ // means any target is allowed, and the default is native. Other options
+ // for restricting supported target set are available.
+ const target = b.standardTargetOptions(.{});
+
+ // Standard optimization options allow the person running `zig build` to select
+ // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
+ // set a preferred release mode, allowing the user to decide how to optimize.
+ const optimize = b.standardOptimizeOption(.{});
+
+ const lib = b.addStaticLibrary(.{
+ .name = "ch1",
+ // In this case the main source file is merely a path, however, in more
+ // complicated build scripts, this could be a generated file.
+ .root_source_file = b.path("src/root.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ // This declares intent for the library to be installed into the standard
+ // location when the user invokes the "install" step (the default step when
+ // running `zig build`).
+ b.installArtifact(lib);
+
+ const exe = b.addExecutable(.{
+ .name = "ch1",
+ .root_source_file = b.path("src/main.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ // This declares intent for the executable to be installed into the
+ // standard location when the user invokes the "install" step (the default
+ // step when running `zig build`).
+ b.installArtifact(exe);
+
+ // This *creates* a Run step in the build graph, to be executed when another
+ // step is evaluated that depends on it. The next line below will establish
+ // such a dependency.
+ const run_cmd = b.addRunArtifact(exe);
+
+ // By making the run step depend on the install step, it will be run from the
+ // installation directory rather than directly from within the cache directory.
+ // This is not necessary, however, if the application depends on other installed
+ // files, this ensures they will be present and in the expected location.
+ run_cmd.step.dependOn(b.getInstallStep());
+
+ // This allows the user to pass arguments to the application in the build
+ // command itself, like this: `zig build run -- arg1 arg2 etc`
+ if (b.args) |args| {
+ run_cmd.addArgs(args);
+ }
+
+ // This creates a build step. It will be visible in the `zig build --help` menu,
+ // and can be selected like this: `zig build run`
+ // This will evaluate the `run` step rather than the default, which is "install".
+ const run_step = b.step("run", "Run the app");
+ run_step.dependOn(&run_cmd.step);
+
+ // Creates a step for unit testing. This only builds the test executable
+ // but does not run it.
+ const lib_unit_tests = b.addTest(.{
+ .root_source_file = b.path("src/root.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ const run_lib_unit_tests = b.addRunArtifact(lib_unit_tests);
+
+ const exe_unit_tests = b.addTest(.{
+ .root_source_file = b.path("src/main.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
+
+ // Similar to creating the run step earlier, this exposes a `test` step to
+ // the `zig build --help` menu, providing a way for the user to request
+ // running the unit tests.
+ const test_step = b.step("test", "Run unit tests");
+ test_step.dependOn(&run_lib_unit_tests.step);
+ test_step.dependOn(&run_exe_unit_tests.step);
+}
diff --git a/challenge-307/deadmarshal/zig/ch1/build.zig.zon b/challenge-307/deadmarshal/zig/ch1/build.zig.zon
new file mode 100644
index 0000000000..a98b632533
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch1/build.zig.zon
@@ -0,0 +1,72 @@
+.{
+ // This is the default name used by packages depending on this one. For
+ // example, when a user runs `zig fetch --save <url>`, this field is used
+ // as the key in the `dependencies` table. Although the user can choose a
+ // different name, most users will stick with this provided value.
+ //
+ // It is redundant to include "zig" in this name because it is already
+ // within the Zig package namespace.
+ .name = "ch1",
+
+ // This is a [Semantic Version](https://semver.org/).
+ // In a future version of Zig it will be used for package deduplication.
+ .version = "0.0.0",
+
+ // This field is optional.
+ // This is currently advisory only; Zig does not yet do anything
+ // with this value.
+ //.minimum_zig_version = "0.11.0",
+
+ // This field is optional.
+ // Each dependency must either provide a `url` and `hash`, or a `path`.
+ // `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
+ // Once all dependencies are fetched, `zig build` no longer requires
+ // internet connectivity.
+ .dependencies = .{
+ // See `zig fetch --save <url>` for a command-line interface for adding dependencies.
+ //.example = .{
+ // // When updating this field to a new URL, be sure to delete the corresponding
+ // // `hash`, otherwise you are communicating that you expect to find the old hash at
+ // // the new URL.
+ // .url = "https://example.com/foo.tar.gz",
+ //
+ // // This is computed from the file contents of the directory of files that is
+ // // obtained after fetching `url` and applying the inclusion rules given by
+ // // `paths`.
+ // //
+ // // This field is the source of truth; packages do not come from a `url`; they
+ // // come from a `hash`. `url` is just one of many possible mirrors for how to
+ // // obtain a package matching this `hash`.
+ // //
+ // // Uses the [multihash](https://multiformats.io/multihash/) format.
+ // .hash = "...",
+ //
+ // // When this is provided, the package is found in a directory relative to the
+ // // build root. In this case the package's hash is irrelevant and therefore not
+ // // computed. This field and `url` are mutually exclusive.
+ // .path = "foo",
+
+ // // When this is set to `true`, a package is declared to be lazily
+ // // fetched. This makes the dependency only get fetched if it is
+ // // actually used.
+ // .lazy = false,
+ //},
+ },
+
+ // Specifies the set of files and directories that are included in this package.
+ // Only files and directories listed here are included in the `hash` that
+ // is computed for this package. Only files listed here will remain on disk
+ // when using the zig package manager. As a rule of thumb, one should list
+ // files required for compilation plus any license(s).
+ // Paths are relative to the build root. Use the empty string (`""`) to refer to
+ // the build root itself.
+ // A directory listed here means that all files within, recursively, are included.
+ .paths = .{
+ "build.zig",
+ "build.zig.zon",
+ "src",
+ // For example...
+ //"LICENSE",
+ //"README.md",
+ },
+}
diff --git a/challenge-307/deadmarshal/zig/ch1/src/main.zig b/challenge-307/deadmarshal/zig/ch1/src/main.zig
new file mode 100644
index 0000000000..4f72fd5771
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch1/src/main.zig
@@ -0,0 +1,60 @@
+const std = @import("std");
+
+fn checkOrder(
+ comptime T: type,
+ allocator: std.mem.Allocator,
+ arr: []T,
+) !std.ArrayList(usize) {
+ var ret = std.ArrayList(usize).init(allocator);
+ errdefer ret.deinit();
+ const sorted = try allocator.alloc(u8, arr.len);
+ defer allocator.free(sorted);
+
+ std.mem.copyForwards(T, sorted, arr);
+ std.mem.sort(T, sorted, {}, std.sort.asc(T));
+
+ for (sorted, 0..) |_, i| {
+ if (sorted[i] != arr[i]) {
+ try ret.append(i);
+ }
+ }
+
+ return ret;
+}
+
+fn printArrayList(
+ comptime T: type,
+ al: std.ArrayList(T),
+) void {
+ for (al.items) |e| {
+ std.debug.print("{} ", .{e});
+ }
+ std.debug.print("{s}", .{"\n"});
+}
+
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ defer {
+ std.debug.assert(gpa.detectLeaks() == false);
+ std.debug.assert(gpa.deinit() == .ok);
+ }
+ const allocator = gpa.allocator();
+
+ var arr1 = [_]u8{ 5, 2, 4, 3, 1 };
+ var arr2 = [_]u8{ 1, 2, 1, 1, 3 };
+ var arr3 = [_]u8{ 3, 1, 3, 2, 3 };
+
+ const al1 = try checkOrder(u8, allocator, &arr1);
+ const al2 = try checkOrder(u8, allocator, &arr2);
+ const al3 = try checkOrder(u8, allocator, &arr3);
+
+ defer {
+ al1.deinit();
+ al2.deinit();
+ al3.deinit();
+ }
+
+ printArrayList(usize, al1);
+ printArrayList(usize, al2);
+ printArrayList(usize, al3);
+}
diff --git a/challenge-307/deadmarshal/zig/ch1/src/root.zig b/challenge-307/deadmarshal/zig/ch1/src/root.zig
new file mode 100644
index 0000000000..ecfeade1a3
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch1/src/root.zig
@@ -0,0 +1,10 @@
+const std = @import("std");
+const testing = std.testing;
+
+export fn add(a: i32, b: i32) i32 {
+ return a + b;
+}
+
+test "basic add functionality" {
+ try testing.expect(add(3, 7) == 10);
+}
diff --git a/challenge-307/deadmarshal/zig/ch2/build.zig b/challenge-307/deadmarshal/zig/ch2/build.zig
new file mode 100644
index 0000000000..9a44c64cdc
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch2/build.zig
@@ -0,0 +1,91 @@
+const std = @import("std");
+
+// Although this function looks imperative, note that its job is to
+// declaratively construct a build graph that will be executed by an external
+// runner.
+pub fn build(b: *std.Build) void {
+ // Standard target options allows the person running `zig build` to choose
+ // what target to build for. Here we do not override the defaults, which
+ // means any target is allowed, and the default is native. Other options
+ // for restricting supported target set are available.
+ const target = b.standardTargetOptions(.{});
+
+ // Standard optimization options allow the person running `zig build` to select
+ // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
+ // set a preferred release mode, allowing the user to decide how to optimize.
+ const optimize = b.standardOptimizeOption(.{});
+
+ const lib = b.addStaticLibrary(.{
+ .name = "ch2",
+ // In this case the main source file is merely a path, however, in more
+ // complicated build scripts, this could be a generated file.
+ .root_source_file = b.path("src/root.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ // This declares intent for the library to be installed into the standard
+ // location when the user invokes the "install" step (the default step when
+ // running `zig build`).
+ b.installArtifact(lib);
+
+ const exe = b.addExecutable(.{
+ .name = "ch2",
+ .root_source_file = b.path("src/main.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ // This declares intent for the executable to be installed into the
+ // standard location when the user invokes the "install" step (the default
+ // step when running `zig build`).
+ b.installArtifact(exe);
+
+ // This *creates* a Run step in the build graph, to be executed when another
+ // step is evaluated that depends on it. The next line below will establish
+ // such a dependency.
+ const run_cmd = b.addRunArtifact(exe);
+
+ // By making the run step depend on the install step, it will be run from the
+ // installation directory rather than directly from within the cache directory.
+ // This is not necessary, however, if the application depends on other installed
+ // files, this ensures they will be present and in the expected location.
+ run_cmd.step.dependOn(b.getInstallStep());
+
+ // This allows the user to pass arguments to the application in the build
+ // command itself, like this: `zig build run -- arg1 arg2 etc`
+ if (b.args) |args| {
+ run_cmd.addArgs(args);
+ }
+
+ // This creates a build step. It will be visible in the `zig build --help` menu,
+ // and can be selected like this: `zig build run`
+ // This will evaluate the `run` step rather than the default, which is "install".
+ const run_step = b.step("run", "Run the app");
+ run_step.dependOn(&run_cmd.step);
+
+ // Creates a step for unit testing. This only builds the test executable
+ // but does not run it.
+ const lib_unit_tests = b.addTest(.{
+ .root_source_file = b.path("src/root.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ const run_lib_unit_tests = b.addRunArtifact(lib_unit_tests);
+
+ const exe_unit_tests = b.addTest(.{
+ .root_source_file = b.path("src/main.zig"),
+ .target = target,
+ .optimize = optimize,
+ });
+
+ const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
+
+ // Similar to creating the run step earlier, this exposes a `test` step to
+ // the `zig build --help` menu, providing a way for the user to request
+ // running the unit tests.
+ const test_step = b.step("test", "Run unit tests");
+ test_step.dependOn(&run_lib_unit_tests.step);
+ test_step.dependOn(&run_exe_unit_tests.step);
+}
diff --git a/challenge-307/deadmarshal/zig/ch2/build.zig.zon b/challenge-307/deadmarshal/zig/ch2/build.zig.zon
new file mode 100644
index 0000000000..b3e934df68
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch2/build.zig.zon
@@ -0,0 +1,72 @@
+.{
+ // This is the default name used by packages depending on this one. For
+ // example, when a user runs `zig fetch --save <url>`, this field is used
+ // as the key in the `dependencies` table. Although the user can choose a
+ // different name, most users will stick with this provided value.
+ //
+ // It is redundant to include "zig" in this name because it is already
+ // within the Zig package namespace.
+ .name = "ch2",
+
+ // This is a [Semantic Version](https://semver.org/).
+ // In a future version of Zig it will be used for package deduplication.
+ .version = "0.0.0",
+
+ // This field is optional.
+ // This is currently advisory only; Zig does not yet do anything
+ // with this value.
+ //.minimum_zig_version = "0.11.0",
+
+ // This field is optional.
+ // Each dependency must either provide a `url` and `hash`, or a `path`.
+ // `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
+ // Once all dependencies are fetched, `zig build` no longer requires
+ // internet connectivity.
+ .dependencies = .{
+ // See `zig fetch --save <url>` for a command-line interface for adding dependencies.
+ //.example = .{
+ // // When updating this field to a new URL, be sure to delete the corresponding
+ // // `hash`, otherwise you are communicating that you expect to find the old hash at
+ // // the new URL.
+ // .url = "https://example.com/foo.tar.gz",
+ //
+ // // This is computed from the file contents of the directory of files that is
+ // // obtained after fetching `url` and applying the inclusion rules given by
+ // // `paths`.
+ // //
+ // // This field is the source of truth; packages do not come from a `url`; they
+ // // come from a `hash`. `url` is just one of many possible mirrors for how to
+ // // obtain a package matching this `hash`.
+ // //
+ // // Uses the [multihash](https://multiformats.io/multihash/) format.
+ // .hash = "...",
+ //
+ // // When this is provided, the package is found in a directory relative to the
+ // // build root. In this case the package's hash is irrelevant and therefore not
+ // // computed. This field and `url` are mutually exclusive.
+ // .path = "foo",
+
+ // // When this is set to `true`, a package is declared to be lazily
+ // // fetched. This makes the dependency only get fetched if it is
+ // // actually used.
+ // .lazy = false,
+ //},
+ },
+
+ // Specifies the set of files and directories that are included in this package.
+ // Only files and directories listed here are included in the `hash` that
+ // is computed for this package. Only files listed here will remain on disk
+ // when using the zig package manager. As a rule of thumb, one should list
+ // files required for compilation plus any license(s).
+ // Paths are relative to the build root. Use the empty string (`""`) to refer to
+ // the build root itself.
+ // A directory listed here means that all files within, recursively, are included.
+ .paths = .{
+ "build.zig",
+ "build.zig.zon",
+ "src",
+ // For example...
+ //"LICENSE",
+ //"README.md",
+ },
+}
diff --git a/challenge-307/deadmarshal/zig/ch2/src/main.zig b/challenge-307/deadmarshal/zig/ch2/src/main.zig
new file mode 100644
index 0000000000..77d9b05f83
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch2/src/main.zig
@@ -0,0 +1,46 @@
+const std = @import("std");
+
+fn findAnagrams(
+ allocator: std.mem.Allocator,
+ arr: [][]const u8,
+) !usize {
+ var sum: usize = 1;
+ var al = std.ArrayList([]u8).init(allocator);
+ defer {
+ for (al.items) |s| {
+ allocator.free(s);
+ }
+ al.deinit();
+ }
+
+ for (arr) |s| {
+ try al.append(try allocator.dupe(u8, s));
+ }
+
+ for (al.items) |s| {
+ std.sort.pdq(u8, s, {}, std.sort.asc(u8));
+ }
+
+ for (1..al.items.len) |i| {
+ if (std.mem.eql(u8, al.items[i - 1], al.items[i]) == false) {
+ sum += 1;
+ }
+ }
+
+ return sum;
+}
+
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ defer {
+ std.debug.assert(gpa.detectLeaks() == false);
+ std.debug.assert(gpa.deinit() == .ok);
+ }
+ const allocator = gpa.allocator();
+
+ var arr1 = [_][]const u8{ "acca", "dog", "god", "perl", "repl" };
+ var arr2 = [_][]const u8{ "abba", "baba", "aabb", "ab", "ab" };
+
+ std.debug.print("{}\n", .{try findAnagrams(allocator, &arr1)});
+ std.debug.print("{}\n", .{try findAnagrams(allocator, &arr2)});
+}
diff --git a/challenge-307/deadmarshal/zig/ch2/src/root.zig b/challenge-307/deadmarshal/zig/ch2/src/root.zig
new file mode 100644
index 0000000000..ecfeade1a3
--- /dev/null
+++ b/challenge-307/deadmarshal/zig/ch2/src/root.zig
@@ -0,0 +1,10 @@
+const std = @import("std");
+const testing = std.testing;
+
+export fn add(a: i32, b: i32) i32 {
+ return a + b;
+}
+
+test "basic add functionality" {
+ try testing.expect(add(3, 7) == 10);
+}