mirror of
https://github.com/Smaug123/AdventOfCode2022
synced 2025-10-06 10:08:42 +00:00
Day 19 (#31)
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day16.txt" />
|
||||
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day17.txt" />
|
||||
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day18.txt" />
|
||||
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day19.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -2,5 +2,5 @@ namespace AdventOfCode2022.App
|
||||
|
||||
[<RequireQualifiedAccess>]
|
||||
module Inputs =
|
||||
let days = Array.init 18 (fun day -> Assembly.readResource $"Day%i{day + 1}.txt")
|
||||
let days = Array.init 19 (fun day -> Assembly.readResource $"Day%i{day + 1}.txt")
|
||||
let inline day (i : int) = days.[i - 1]
|
||||
|
@@ -61,7 +61,7 @@ type Benchmark16To20 () =
|
||||
[<GlobalSetup>]
|
||||
member _.Setup () = Run.shouldWrite <- false
|
||||
|
||||
[<Params(16, 17, 18)>]
|
||||
[<Params(16, 17, 18, 19)>]
|
||||
member val Day = 0 with get, set
|
||||
|
||||
[<Params(false, true)>]
|
||||
|
@@ -260,6 +260,20 @@ module Run =
|
||||
if shouldWrite then
|
||||
printfn "%i" output
|
||||
|
||||
let day19 (partTwo : bool) (input : string) =
|
||||
let day19 = StringSplitEnumerator.make '\n' input
|
||||
|
||||
if not partTwo then
|
||||
let output = Day19.part1 day19
|
||||
|
||||
if shouldWrite then
|
||||
printfn "%i" output
|
||||
else
|
||||
let output = Day19.part2 day19
|
||||
|
||||
if shouldWrite then
|
||||
printfn "%i" output
|
||||
|
||||
let allRuns =
|
||||
[|
|
||||
day1
|
||||
@@ -280,4 +294,5 @@ module Run =
|
||||
day16
|
||||
day17
|
||||
day18
|
||||
day19
|
||||
|]
|
||||
|
@@ -26,6 +26,7 @@
|
||||
<Compile Include="Day16.fs" />
|
||||
<Compile Include="Day17.fs" />
|
||||
<Compile Include="Day18.fs" />
|
||||
<Compile Include="Day19.fs" />
|
||||
<EmbeddedResource Include="Inputs\Day1.txt" />
|
||||
<EmbeddedResource Include="Inputs\Day2.txt" />
|
||||
<EmbeddedResource Include="Inputs\Day3.txt" />
|
||||
@@ -44,6 +45,7 @@
|
||||
<EmbeddedResource Include="Inputs\Day16.txt" />
|
||||
<EmbeddedResource Include="Inputs\Day17.txt" />
|
||||
<EmbeddedResource Include="Inputs\Day18.txt" />
|
||||
<EmbeddedResource Include="Inputs\Day19.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
34
AdventOfCode2022.Test/Day19.fs
Normal file
34
AdventOfCode2022.Test/Day19.fs
Normal file
@@ -0,0 +1,34 @@
|
||||
namespace AdventOfCode2022.Test
|
||||
|
||||
open NUnit.Framework
|
||||
open FsUnitTyped
|
||||
open AdventOfCode2022
|
||||
|
||||
[<TestFixture>]
|
||||
module TestDay19 =
|
||||
|
||||
let input =
|
||||
"""Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 2 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 2 ore and 7 obsidian.
|
||||
Blueprint 2: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 8 clay. Each geode robot costs 3 ore and 12 obsidian.
|
||||
"""
|
||||
|
||||
[<Test>]
|
||||
let ``Part 1, given`` () =
|
||||
Day19.part1 (StringSplitEnumerator.make '\n' input) |> shouldEqual 33
|
||||
|
||||
[<Test>]
|
||||
let ``Part 1`` () =
|
||||
let input = Assembly.readResource "Day19.txt"
|
||||
|
||||
Day19.part1 (StringSplitEnumerator.make '\n' input) |> shouldEqual 2341
|
||||
|
||||
|
||||
[<Test>]
|
||||
let ``Part 2, given`` () =
|
||||
Day19.part2 (StringSplitEnumerator.make '\n' input) |> shouldEqual (62 * 56)
|
||||
|
||||
[<Test>]
|
||||
let ``Part 2`` () =
|
||||
let input = Assembly.readResource "Day19.txt"
|
||||
|
||||
Day19.part2 (StringSplitEnumerator.make '\n' input) |> shouldEqual 3689
|
30
AdventOfCode2022.Test/Inputs/Day19.txt
Normal file
30
AdventOfCode2022.Test/Inputs/Day19.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 18 obsidian.
|
||||
Blueprint 2: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 15 obsidian.
|
||||
Blueprint 3: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 3 ore and 8 obsidian.
|
||||
Blueprint 4: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 19 clay. Each geode robot costs 2 ore and 12 obsidian.
|
||||
Blueprint 5: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 4 ore and 7 obsidian.
|
||||
Blueprint 6: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 7 clay. Each geode robot costs 2 ore and 19 obsidian.
|
||||
Blueprint 7: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 11 obsidian.
|
||||
Blueprint 8: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 3 ore and 10 obsidian.
|
||||
Blueprint 9: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 2 ore and 16 obsidian.
|
||||
Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 15 obsidian.
|
||||
Blueprint 11: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 10 clay. Each geode robot costs 2 ore and 13 obsidian.
|
||||
Blueprint 12: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 12 clay. Each geode robot costs 3 ore and 17 obsidian.
|
||||
Blueprint 13: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 2 ore and 18 obsidian.
|
||||
Blueprint 14: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 4 ore and 11 obsidian.
|
||||
Blueprint 15: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 3 ore and 8 obsidian.
|
||||
Blueprint 16: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 4 ore and 16 obsidian.
|
||||
Blueprint 17: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 3 ore and 8 obsidian.
|
||||
Blueprint 18: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 2 ore and 16 obsidian.
|
||||
Blueprint 19: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 2 ore and 8 obsidian.
|
||||
Blueprint 20: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 3 ore and 14 obsidian.
|
||||
Blueprint 21: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 2 ore and 13 obsidian.
|
||||
Blueprint 22: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 3 ore and 7 obsidian.
|
||||
Blueprint 23: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 8 obsidian.
|
||||
Blueprint 24: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 12 obsidian.
|
||||
Blueprint 25: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 16 obsidian.
|
||||
Blueprint 26: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 3 ore and 10 obsidian.
|
||||
Blueprint 27: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 3 ore and 7 obsidian.
|
||||
Blueprint 28: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 3 ore and 8 obsidian.
|
||||
Blueprint 29: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 2 ore and 11 obsidian.
|
||||
Blueprint 30: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 2 ore and 13 obsidian.
|
@@ -30,6 +30,7 @@
|
||||
<Compile Include="Day16.fs" />
|
||||
<Compile Include="Day17.fs" />
|
||||
<Compile Include="Day18.fs" />
|
||||
<Compile Include="Day19.fs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -3,12 +3,14 @@ namespace AdventOfCode2022
|
||||
open System
|
||||
open System.Collections.Generic
|
||||
open System.Globalization
|
||||
open System.Runtime.CompilerServices
|
||||
|
||||
#if DEBUG
|
||||
open Checked
|
||||
#endif
|
||||
|
||||
[<Struct>]
|
||||
[<IsReadOnly>]
|
||||
type Day13Packet =
|
||||
| PacketList of leaf : Day13Packet[]
|
||||
| Int of int : int
|
||||
|
256
AdventOfCode2022/Day19.fs
Normal file
256
AdventOfCode2022/Day19.fs
Normal file
@@ -0,0 +1,256 @@
|
||||
namespace AdventOfCode2022
|
||||
|
||||
open System
|
||||
open FSharp.Collections.ParallelSeq
|
||||
|
||||
#if DEBUG
|
||||
open Checked
|
||||
#else
|
||||
#nowarn "9"
|
||||
#endif
|
||||
|
||||
type Day19Blueprint =
|
||||
{
|
||||
Index : int
|
||||
Ore : int
|
||||
Clay : int
|
||||
ObsidianOre : int
|
||||
ObsidianClay : int
|
||||
GeodeOre : int
|
||||
GeodeObsidian : int
|
||||
}
|
||||
|
||||
[<RequireQualifiedAccess>]
|
||||
module Day19 =
|
||||
|
||||
//Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 18 obsidian.
|
||||
|
||||
let parse (line : StringSplitEnumerator) : Day19Blueprint ResizeArray =
|
||||
use mutable enum = line.GetEnumerator ()
|
||||
let output = ResizeArray ()
|
||||
|
||||
while enum.MoveNext () do
|
||||
if not (enum.Current.IsWhiteSpace ()) then
|
||||
let mutable lineEnum = StringSplitEnumerator.make' ' ' (enum.Current.TrimEnd ())
|
||||
StringSplitEnumerator.chomp "Blueprint" &lineEnum
|
||||
|
||||
if not (lineEnum.MoveNext ()) then
|
||||
failwith "expected number"
|
||||
|
||||
let index = Int32.Parse (lineEnum.Current.TrimEnd ':')
|
||||
|
||||
StringSplitEnumerator.chomp "Each" &lineEnum
|
||||
StringSplitEnumerator.chomp "ore" &lineEnum
|
||||
StringSplitEnumerator.chomp "robot" &lineEnum
|
||||
StringSplitEnumerator.chomp "costs" &lineEnum
|
||||
|
||||
let oreCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "ore." &lineEnum
|
||||
StringSplitEnumerator.chomp "Each" &lineEnum
|
||||
StringSplitEnumerator.chomp "clay" &lineEnum
|
||||
StringSplitEnumerator.chomp "robot" &lineEnum
|
||||
StringSplitEnumerator.chomp "costs" &lineEnum
|
||||
let clayCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "ore." &lineEnum
|
||||
StringSplitEnumerator.chomp "Each" &lineEnum
|
||||
StringSplitEnumerator.chomp "obsidian" &lineEnum
|
||||
StringSplitEnumerator.chomp "robot" &lineEnum
|
||||
StringSplitEnumerator.chomp "costs" &lineEnum
|
||||
let obsidianOreCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "ore" &lineEnum
|
||||
StringSplitEnumerator.chomp "and" &lineEnum
|
||||
let obsidianClayCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "clay." &lineEnum
|
||||
StringSplitEnumerator.chomp "Each" &lineEnum
|
||||
StringSplitEnumerator.chomp "geode" &lineEnum
|
||||
StringSplitEnumerator.chomp "robot" &lineEnum
|
||||
StringSplitEnumerator.chomp "costs" &lineEnum
|
||||
let geodeOreCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "ore" &lineEnum
|
||||
StringSplitEnumerator.chomp "and" &lineEnum
|
||||
let geodeObsidianCost = StringSplitEnumerator.consumeInt &lineEnum
|
||||
StringSplitEnumerator.chomp "obsidian." &lineEnum
|
||||
|
||||
{
|
||||
Ore = oreCost
|
||||
Clay = clayCost
|
||||
ObsidianOre = obsidianOreCost
|
||||
ObsidianClay = obsidianClayCost
|
||||
GeodeOre = geodeOreCost
|
||||
GeodeObsidian = geodeObsidianCost
|
||||
Index = index
|
||||
}
|
||||
|> output.Add
|
||||
|
||||
output
|
||||
|
||||
/// If we started only creating new geode creators right now, how many geodes could we
|
||||
/// mine by the end?
|
||||
let inline bestPossible (timeRemaining : int) = timeRemaining * (timeRemaining - 1) / 2
|
||||
|
||||
let rec go
|
||||
(blueprint : Day19Blueprint)
|
||||
(bestSoFar : int)
|
||||
(timeRemaining : int)
|
||||
(oreCount : int)
|
||||
(clayCount : int)
|
||||
(obsidianCount : int)
|
||||
(geodeCount : int)
|
||||
(oreRobotCount : int)
|
||||
(clayRobotCount : int)
|
||||
(obsidianRobotCount : int)
|
||||
=
|
||||
if timeRemaining = 1 then
|
||||
max bestSoFar geodeCount
|
||||
else
|
||||
|
||||
// A weak overestimate at how many more geodes we'd get if we started building geode
|
||||
// producers and nothing else, right now.
|
||||
let bestPossible =
|
||||
let neededBeforeGeodeBuild = blueprint.GeodeObsidian - obsidianCount
|
||||
|
||||
if neededBeforeGeodeBuild <= 0 then
|
||||
timeRemaining
|
||||
elif neededBeforeGeodeBuild <= obsidianRobotCount then
|
||||
// Wait one timestep, then build
|
||||
timeRemaining - 1
|
||||
elif neededBeforeGeodeBuild <= 2 * obsidianRobotCount + 1 then
|
||||
// Build an obsidian robot, then wait one timestep, then build geodes
|
||||
timeRemaining - 2
|
||||
else
|
||||
timeRemaining - 3
|
||||
|> bestPossible
|
||||
|
||||
if bestSoFar > geodeCount + bestPossible then
|
||||
bestSoFar
|
||||
else
|
||||
|
||||
let newOreCount = oreCount + oreRobotCount
|
||||
let newClayCount = clayCount + clayRobotCount
|
||||
let newObsidianCount = obsidianCount + obsidianRobotCount
|
||||
|
||||
let mutable best = bestSoFar
|
||||
|
||||
// If there are fewer than 10 turns remaining, it's always correct to create a geode
|
||||
// builder if we can. Indeed, ore is not the limiting factor, so if we instead chose
|
||||
// to make an obsidian builder, we'd lose 1 geode of opportunity cost, and then
|
||||
// would have to wait at least 7 turns for the new obsidian builder to produce enough
|
||||
// obsidian to make a replacement geode builder, then build the new geode builder on
|
||||
// the 8th turn, then it produces a replacement geode on the 9th turn, breaking even.
|
||||
if
|
||||
timeRemaining < 10
|
||||
&& oreCount >= blueprint.GeodeOre
|
||||
&& obsidianCount >= blueprint.GeodeObsidian
|
||||
then
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
(newOreCount - blueprint.GeodeOre)
|
||||
newClayCount
|
||||
(newObsidianCount - blueprint.GeodeObsidian)
|
||||
(geodeCount + timeRemaining - 1)
|
||||
oreRobotCount
|
||||
clayRobotCount
|
||||
obsidianRobotCount
|
||||
|
||||
else
|
||||
|
||||
if oreCount >= blueprint.GeodeOre && obsidianCount >= blueprint.GeodeObsidian then
|
||||
best <-
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
(newOreCount - blueprint.GeodeOre)
|
||||
newClayCount
|
||||
(newObsidianCount - blueprint.GeodeObsidian)
|
||||
(geodeCount + timeRemaining - 1)
|
||||
oreRobotCount
|
||||
clayRobotCount
|
||||
obsidianRobotCount
|
||||
|
||||
// Can we build an obsidian robot?
|
||||
// Note that if we have enough obsidian robots, then we're producing it as fast as we can consume it.
|
||||
if
|
||||
obsidianRobotCount < blueprint.GeodeObsidian
|
||||
&& oreCount >= blueprint.ObsidianOre
|
||||
&& clayCount >= blueprint.ObsidianClay
|
||||
then
|
||||
best <-
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
(newOreCount - blueprint.ObsidianOre)
|
||||
(newClayCount - blueprint.ObsidianClay)
|
||||
newObsidianCount
|
||||
geodeCount
|
||||
oreRobotCount
|
||||
clayRobotCount
|
||||
(obsidianRobotCount + 1)
|
||||
|
||||
// Can we build an ore robot?
|
||||
// Note that the biggest ore cost of anything is 4 ore, so if we have 4 ore-collecting robots then we
|
||||
// are already producing ore as fast as we can consume it.
|
||||
if oreRobotCount < 4 && oreCount >= blueprint.Ore then
|
||||
best <-
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
(newOreCount - blueprint.Ore)
|
||||
newClayCount
|
||||
newObsidianCount
|
||||
geodeCount
|
||||
(oreRobotCount + 1)
|
||||
clayRobotCount
|
||||
obsidianRobotCount
|
||||
|
||||
// Can we build a clay robot?
|
||||
if clayRobotCount < blueprint.ObsidianClay && oreCount >= blueprint.Clay then
|
||||
best <-
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
(newOreCount - blueprint.Clay)
|
||||
newClayCount
|
||||
newObsidianCount
|
||||
geodeCount
|
||||
oreRobotCount
|
||||
(clayRobotCount + 1)
|
||||
obsidianRobotCount
|
||||
|
||||
go
|
||||
blueprint
|
||||
best
|
||||
(timeRemaining - 1)
|
||||
newOreCount
|
||||
newClayCount
|
||||
newObsidianCount
|
||||
geodeCount
|
||||
oreRobotCount
|
||||
clayRobotCount
|
||||
obsidianRobotCount
|
||||
|
||||
let doPart1 (blueprint : Day19Blueprint) : int =
|
||||
let minOreCost = min blueprint.Ore blueprint.Clay
|
||||
go blueprint 0 (24 - minOreCost) minOreCost 0 0 0 1 0 0
|
||||
|
||||
let part1 (line : StringSplitEnumerator) : int =
|
||||
let blueprints = parse line
|
||||
|
||||
seq { 0 .. blueprints.Count - 1 }
|
||||
|> PSeq.map (fun i -> blueprints.[i].Index * doPart1 blueprints.[i])
|
||||
|> Seq.sum
|
||||
|
||||
let doPart2 (blueprint : Day19Blueprint) : int =
|
||||
let minOreCost = min blueprint.Ore blueprint.Clay
|
||||
go blueprint 0 (32 - minOreCost) minOreCost 0 0 0 1 0 0
|
||||
|
||||
let part2 (line : StringSplitEnumerator) : int =
|
||||
let blueprints = parse line
|
||||
let blueprints = Array.init (min blueprints.Count 3) (fun i -> blueprints.[i])
|
||||
|
||||
blueprints :> seq<_> |> PSeq.map doPart2 |> Seq.fold (*) 1
|
@@ -8,9 +8,13 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores
|
||||
|
||||
|
||||
```
|
||||
| Method | Day | IsPartOne | Mean | Error | StdDev |
|
||||
|---------- |---- |---------- |-------------:|-----------:|------------:|
|
||||
| **Benchmark** | **16** | **False** | **4,825.261 ms** | **96.3610 ms** | **183.3368 ms** |
|
||||
| **Benchmark** | **16** | **True** | **1,204.199 ms** | **11.6398 ms** | **10.8879 ms** |
|
||||
| **Benchmark** | **17** | **False** | **4.928 ms** | **0.1057 ms** | **0.3049 ms** |
|
||||
| **Benchmark** | **17** | **True** | **1.875 ms** | **0.0363 ms** | **0.0446 ms** |
|
||||
| Method | Day | IsPartOne | Mean | Error | StdDev |
|
||||
|---------- |---- |---------- |---------------:|-------------:|-------------:|
|
||||
| **Benchmark** | **16** | **False** | **3,276,777.7 μs** | **47,105.18 μs** | **44,062.21 μs** |
|
||||
| **Benchmark** | **16** | **True** | **328,457.3 μs** | **1,233.98 μs** | **1,154.27 μs** |
|
||||
| **Benchmark** | **17** | **False** | **2,994.8 μs** | **9.41 μs** | **7.86 μs** |
|
||||
| **Benchmark** | **17** | **True** | **1,562.7 μs** | **5.96 μs** | **5.57 μs** |
|
||||
| **Benchmark** | **18** | **False** | **43,162.9 μs** | **92.81 μs** | **82.28 μs** |
|
||||
| **Benchmark** | **18** | **True** | **137.7 μs** | **2.75 μs** | **2.95 μs** |
|
||||
| **Benchmark** | **19** | **False** | **574,489.3 μs** | **2,008.49 μs** | **1,780.47 μs** |
|
||||
| **Benchmark** | **19** | **True** | **701,588.1 μs** | **4,772.02 μs** | **4,230.27 μs** |
|
||||
|
@@ -1,5 +1,9 @@
|
||||
Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Day,IsPartOne,Mean,Error,StdDev
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,16,False,"4,825.261 ms",96.3610 ms,183.3368 ms
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,16,True,"1,204.199 ms",11.6398 ms,10.8879 ms
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,17,False,4.928 ms,0.1057 ms,0.3049 ms
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,17,True,1.875 ms,0.0363 ms,0.0446 ms
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,16,False,"3,276,777.7 μs","47,105.18 μs","44,062.21 μs"
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,16,True,"328,457.3 μs","1,233.98 μs","1,154.27 μs"
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,17,False,"2,994.8 μs",9.41 μs,7.86 μs
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,17,True,"1,562.7 μs",5.96 μs,5.57 μs
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,18,False,"43,162.9 μs",92.81 μs,82.28 μs
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,18,True,137.7 μs,2.75 μs,2.95 μs
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,19,False,"574,489.3 μs","2,008.49 μs","1,780.47 μs"
|
||||
Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,19,True,"701,588.1 μs","4,772.02 μs","4,230.27 μs"
|
||||
|
|
@@ -2,7 +2,7 @@
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='utf-8' />
|
||||
<title>AdventOfCode2022.App.Benchmark16To20-20221217-164444</title>
|
||||
<title>AdventOfCode2022.App.Benchmark16To20-20221219-132322</title>
|
||||
|
||||
<style type="text/css">
|
||||
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
|
||||
@@ -22,12 +22,16 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores
|
||||
<pre><code></code></pre>
|
||||
|
||||
<table>
|
||||
<thead><tr><th>Method</th><th>Day</th><th>IsPartOne</th><th> Mean</th><th>Error</th><th>StdDev</th>
|
||||
<thead><tr><th>Method</th><th>Day</th><th>IsPartOne</th><th> Mean</th><th> Error</th><th>StdDev</th>
|
||||
</tr>
|
||||
</thead><tbody><tr><td>Benchmark</td><td>16</td><td>False</td><td>4,825.261 ms</td><td>96.3610 ms</td><td>183.3368 ms</td>
|
||||
</tr><tr><td>Benchmark</td><td>16</td><td>True</td><td>1,204.199 ms</td><td>11.6398 ms</td><td>10.8879 ms</td>
|
||||
</tr><tr><td>Benchmark</td><td>17</td><td>False</td><td>4.928 ms</td><td>0.1057 ms</td><td>0.3049 ms</td>
|
||||
</tr><tr><td>Benchmark</td><td>17</td><td>True</td><td>1.875 ms</td><td>0.0363 ms</td><td>0.0446 ms</td>
|
||||
</thead><tbody><tr><td>Benchmark</td><td>16</td><td>False</td><td>3,276,777.7 μs</td><td>47,105.18 μs</td><td>44,062.21 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>16</td><td>True</td><td>328,457.3 μs</td><td>1,233.98 μs</td><td>1,154.27 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>17</td><td>False</td><td>2,994.8 μs</td><td>9.41 μs</td><td>7.86 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>17</td><td>True</td><td>1,562.7 μs</td><td>5.96 μs</td><td>5.57 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>18</td><td>False</td><td>43,162.9 μs</td><td>92.81 μs</td><td>82.28 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>18</td><td>True</td><td>137.7 μs</td><td>2.75 μs</td><td>2.95 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>19</td><td>False</td><td>574,489.3 μs</td><td>2,008.49 μs</td><td>1,780.47 μs</td>
|
||||
</tr><tr><td>Benchmark</td><td>19</td><td>True</td><td>701,588.1 μs</td><td>4,772.02 μs</td><td>4,230.27 μs</td>
|
||||
</tr></tbody></table>
|
||||
</body>
|
||||
</html>
|
||||
|
Reference in New Issue
Block a user