···
import gleam/io.{println}
import gleam/string.{trim}
-
const letter_value_list = [
-
const value_letter_list = [
-
LVDicts(value: dict.Dict(String, Int), letter: dict.Dict(Int, String))
fn has_three_letter_sequence(
prev_letter_value prev_letter_value,
let letter = string.slice(input, i, 1)
-
let letter_value_wrap = dict.get(lvm, letter)
-
case letter_value_wrap {
let in_sequence = prev_letter_value == v - 1
case in_sequence && line_length == 1 {
···
-
has_three_letter_sequence(lvm, input, i + 1, v, line_length)
···
-
fn valid_password(letter_value_dict, input) {
-
letter_value_dict |> has_three_letter_sequence(input, 1, 50, 0)
|> list.fold_until(True, fn(_, letter) {
case !string.contains(input, letter) {
···
&& has_two_pairs(input, 0, "", 0)
-
fn increment_password(lvdicts: LVDicts, input) {
-
|> list.fold_right(#("", 0), fn(acc, letter) {
-
let #(acc_str, pass) = acc
-
let add = case acc_str == "" {
-
let value = { lvdicts.value |> dict.get(letter) |> result.unwrap(50) } + add
-
True -> #(string.append("a", acc_str), 1)
-
lvdicts.letter |> dict.get(value) |> result.unwrap("a"),
-
fn get_valid_password(lvdicts: LVDicts, input) {
-
case valid_password(lvdicts.value, input) {
-
False -> get_valid_password(lvdicts, increment_password(lvdicts, input).0)
···
let input = read(from: "../input.txt") |> result.unwrap("") |> trim()
-
let letter_value_dict = dict.from_list(letter_value_list)
-
let value_letter_dict = dict.from_list(value_letter_list)
-
let lvdicts = LVDicts(letter_value_dict, value_letter_dict)
-
let part1 = get_valid_password(lvdicts, input)
-
let part2 = get_valid_password(lvdicts, increment_password(lvdicts, part1).0)
···
import gleam/io.{println}
import gleam/string.{trim}
fn has_three_letter_sequence(
prev_letter_value prev_letter_value,
let letter = string.slice(input, i, 1)
+
let assert [codepoint] = string.to_utf_codepoints(letter)
+
let v = string.utf_codepoint_to_int(codepoint)
let in_sequence = prev_letter_value == v - 1
case in_sequence && line_length == 1 {
···
+
has_three_letter_sequence(input, i + 1, v, line_length)
···
+
fn valid_password(input) {
+
has_three_letter_sequence(input, 1, 50, 0)
|> list.fold_until(True, fn(_, letter) {
case !string.contains(input, letter) {
···
&& has_two_pairs(input, 0, "", 0)
+
fn increment_password(input) {
+
|> string.to_utf_codepoints
+
|> list.fold_right(#([], 0), fn(acc, letter) {
+
let #(acc_str, pass) = acc
+
let add = case acc_str == [] {
+
let new_letter = string.utf_codepoint_to_int(letter) + add
+
let assert Ok(letter_codepoint) = string.utf_codepoint(new_letter)
+
case new_letter > 122 {
+
let assert Ok(a) = string.utf_codepoint(97)
+
#(list.prepend(acc_str, a), 1)
+
False -> #(list.prepend(acc_str, letter_codepoint), 0)
+
|> string.from_utf_codepoints
+
fn get_valid_password(input) {
+
case valid_password(input) {
+
False -> get_valid_password(increment_password(input))
···
let input = read(from: "../input.txt") |> result.unwrap("") |> trim()
+
let part1 = get_valid_password(input)
+
let part2 = get_valid_password(increment_password(part1))