aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOscar Najera <hi@oscarnajera.com>2022-12-06 17:26:18 +0100
committerOscar Najera <hi@oscarnajera.com>2022-12-06 17:26:18 +0100
commit7ca1851f732e2f74339354ecc25ef709754a3ac3 (patch)
tree4cb8db92d5024947edae833b250f749c423bd9be
parentf34c85b78a1cbefa475a252184c13b68c9727332 (diff)
downloadscratch-7ca1851f732e2f74339354ecc25ef709754a3ac3.tar.gz
scratch-7ca1851f732e2f74339354ecc25ef709754a3ac3.tar.bz2
scratch-7ca1851f732e2f74339354ecc25ef709754a3ac3.zip
[AoC2022] 06 Rust & Elixir
-rw-r--r--AoC2022/06/makefile4
-rw-r--r--AoC2022/06/solver.exs27
-rw-r--r--AoC2022/06/solver.rs27
3 files changed, 56 insertions, 2 deletions
diff --git a/AoC2022/06/makefile b/AoC2022/06/makefile
index fce871b..3ddfc1a 100644
--- a/AoC2022/06/makefile
+++ b/AoC2022/06/makefile
@@ -11,5 +11,5 @@
run:
sbcl --load ~/.sbclrc --script solver.lisp
emacs -batch -l ert -l solver.el -f ert-run-tests-batch-and-exit
- # rustc solver.rs && ./solver
- # elixir solver.ex
+ rustc solver.rs -o /tmp/solver && /tmp/solver
+ elixir solver.exs
diff --git a/AoC2022/06/solver.exs b/AoC2022/06/solver.exs
new file mode 100644
index 0000000..3d47677
--- /dev/null
+++ b/AoC2022/06/solver.exs
@@ -0,0 +1,27 @@
+defmodule Solver.Day6 do
+ def marker([_h | tail] = line, distinct, counter) do
+ line
+ |> Enum.take(distinct)
+ |> MapSet.new()
+ |> MapSet.size()
+ |> Kernel.then(fn amount ->
+ case amount do
+ ^distinct -> counter
+ _ -> marker(tail, distinct, counter + 1)
+ end
+ end)
+ end
+
+ def start(msg, distinct) do
+ String.graphemes(msg) |> marker(distinct, distinct) |> IO.puts()
+ end
+end
+
+case File.read("input") do
+ {:ok, body} ->
+ Solver.Day6.start(body, 4)
+ Solver.Day6.start(body, 14)
+
+ {:error, reason} ->
+ IO.puts(reason)
+end
diff --git a/AoC2022/06/solver.rs b/AoC2022/06/solver.rs
new file mode 100644
index 0000000..0d59479
--- /dev/null
+++ b/AoC2022/06/solver.rs
@@ -0,0 +1,27 @@
+use std::fs;
+use std::io::{self, Read};
+
+fn solver(bytes: &Vec<u8>, marker_len: u32) -> u32 {
+ let mut count = marker_len;
+ for view in bytes.windows(marker_len as usize) {
+ let mut acc: u32 = 0;
+ for elt in view {
+ acc |= 1 << (elt - 96);
+ }
+ if u32::count_ones(acc) >= marker_len {
+ break;
+ }
+ count += 1;
+ }
+ count
+}
+
+fn main() -> io::Result<()> {
+ let mut file = fs::File::open("input").unwrap();
+ let mut bytes: Vec<u8> = Vec::new();
+ file.read_to_end(&mut bytes)?;
+ println!("All test passed. {}", solver(&bytes, 4));
+ println!("All test passed. {}", solver(&bytes, 14));
+
+ Ok(())
+}