quest 01 complete

This commit is contained in:
2025-11-06 21:12:41 +01:00
parent bab84f0fe3
commit 25644f23c8
9 changed files with 135 additions and 1 deletions

View File

@@ -6,6 +6,21 @@
</PropertyGroup>
<ItemGroup>
<Content Include="Inputs\Quest01\Q01_P01.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Inputs\Quest01\Q01_P02.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Inputs\Quest01\Q01_P03.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Compile Include="Helpers.fs" />
<Compile Include="Quest01.fs" />
<Compile Include="Program.fs"/>
</ItemGroup>

View File

@@ -0,0 +1,18 @@
module EveryBodyCodes2025.Helpers
let foldUntilNone folder (state: 's) (source: 'a seq) : 's option =
use e = source.GetEnumerator()
let rec loop acc =
if e.MoveNext() then
match folder acc e.Current with
| Some s -> loop s
| None -> Some acc // last good state
else Some acc // finished entire sequence
loop state
let arraySwap idx0 idx1 (array: 'a array) =
let a = array[idx0]
let b = array[idx1]
array[idx0] <- b
array[idx1] <- a
array

View File

@@ -0,0 +1,3 @@
Krynnfal,Felnnyn,Norakmarn,Glynngnaris,Zorasis,Ulmarsarix,Rynquin,Wyntor,Harnmarn,Selkvel
L6,R8,L7,R1,L2,R7,L1,R6,L5,R2,L7

View File

@@ -0,0 +1,3 @@
Ascalthar,Skarkael,Vyrbel,Havisis,Tarlzral,Paltheldrith,Hazthel,Hazwyris,Jarzyth,Mornxal,Vaelacris,Xardaros,Lirzyph,Sylacris,Nexor,Vorndra,Cyndhynd,Ralkyris,Cragkael,Galoryn
L7,R12,L8,R12,L9,R18,L16,R13,L9,R12,L5,R11,L5,R14,L5,R18,L5,R15,L5,R17,L5,R18,L16,R12,L14,R7,L11,R9,L12

View File

@@ -0,0 +1,3 @@
Xarsar,Elvareldrin,Zraalcyth,Vyrlfeth,Palthonar,Maralor,Qalirin,Dalnyn,Havryn,Maralxal,Ulthyn,Ascalxeth,Thymfyr,Varinralis,Rythangarath,Ulkkynar,Lazlon,Grimulrix,Draithvash,Voraxmir,Vyrlxal,Elvarmal,Maralsyx,Wyrvash,Vornketh,Torendris,Thalcoryx,Paldeth,Vyrlcion,Tazroth
L25,R49,L14,R13,L11,R12,L43,R45,L38,R34,L34,R44,L44,R35,L35,R30,L38,R37,L49,R48,L5,R39,L5,R27,L5,R14,L5,R32,L5,R46,L5,R9,L5,R24,L5,R43,L5,R21,L5,R22,L15,R49,L27,R41,L18,R31,L26,R16,L10,R40,L19,R6,L20,R24,L40,R44,L5,R47,L35

View File

@@ -1,2 +1,13 @@
// For more information see https://aka.ms/fsharp-console-apps
printfn "Hello from F#"
open EveryBodyCodes2025
[<EntryPoint>]
let main argv =
try
printfn $"{Quest01.part1()}"
printfn $"{Quest01.part2()}"
printfn $"{Quest01.part3()}"
with exn ->
printfn $"{exn}"
0

View File

@@ -0,0 +1,81 @@
module EveryBodyCodes2025.Quest01
open System
open System.IO
open EveryBodyCodes2025.Helpers
type Direction = Left | Right
type Instruction = { Direction: Direction; Distance: int }
let parseInstruction (segment:string) =
let direction = if segment[0] = 'L' then Left else Right
let distance = Int32.Parse(segment.AsSpan().Slice(1))
{ Direction = direction; Distance = distance }
let inline normalize (array: 'a array) idx =
if idx >= 0 then idx % array.Length else array.Length - (-idx % array.Length)
let inline nextIndex instruction idx =
match instruction.Direction with
| Left -> idx - instruction.Distance
| Right -> idx + instruction.Distance
let readFile file =
File.ReadAllLines(file)
|> fun lines ->
let names = lines.[0] |> _.Split(",", StringSplitOptions.RemoveEmptyEntries ||| StringSplitOptions.TrimEntries)
let instructions =
lines[2]
|> _.Split(",", StringSplitOptions.RemoveEmptyEntries ||| StringSplitOptions.TrimEntries)
|> Array.map parseInstruction
(names, instructions)
let part1File file : string =
readFile file
|> fun (names, instructions) ->
instructions
|> Seq.fold (fun (idx, _) instruction ->
let next = nextIndex instruction idx |> fun v -> Math.Clamp(v, 0, names.Length - 1)
match Array.tryItem next names with
| Some n -> next, n
| None -> failwith "off array"
) (0, "")
|> snd
let part1 () = part1File "Inputs/Quest01/Q01_P01.txt"
let part2File file =
readFile file
|> fun (names, instructions) ->
instructions
|> Seq.fold (fun (idx, _) instruction ->
let next = nextIndex instruction idx |> normalize names
match Array.tryItem next names with
| Some n -> next, n
| None -> failwith "off array"
) (0, "")
|> snd
let part2() = part2File "Inputs/Quest01/Q01_P02.txt"
let part3File file =
readFile file
|> fun (names, instructions) ->
// need to preserve a reference to an array that can be mutated
let mutable nameArray = names
instructions
|> Seq.fold (fun _ instruction ->
// for this challenge the index doesn't matter
let next = match instruction.Direction with
| Left -> names.Length - instruction.Distance
| Right -> instruction.Distance
|> normalize names
match Array.tryItem next nameArray with
| Some n ->
nameArray <- arraySwap 0 next names
0, n
| None -> failwith "off array"
) (0, "")
|> snd
let part3() = part3File "Inputs/Quest01/Q01_P03.txt"