Initial Commit
This commit is contained in:
10
2022/Day16CSharp/Day16CSharp.csproj
Normal file
10
2022/Day16CSharp/Day16CSharp.csproj
Normal file
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
427
2022/Day16CSharp/Program.cs
Normal file
427
2022/Day16CSharp/Program.cs
Normal file
@@ -0,0 +1,427 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
|
||||
using System.Net.Http.Headers;
|
||||
using System.Reflection;
|
||||
|
||||
Part01();
|
||||
|
||||
void Part01()
|
||||
{
|
||||
Console.WriteLine("!! === Part 01 === !!");
|
||||
|
||||
Console.WriteLine("=== Example ===");
|
||||
var exampleData = new VolcanoData("example-input.txt");
|
||||
Console.WriteLine("Most Pressure Released: {0}", exampleData.GetMostPossiblePressureReleased(31));
|
||||
|
||||
Console.WriteLine("=== Puzzle ===");
|
||||
var puzzleData = new VolcanoData("puzzle-input.txt");
|
||||
Console.WriteLine("Most Pressure Released: {0}", puzzleData.GetMostPossiblePressureReleased(31));
|
||||
}
|
||||
|
||||
class StepList
|
||||
: IComparable
|
||||
{
|
||||
public struct Step
|
||||
{
|
||||
public enum StepType
|
||||
{
|
||||
First,
|
||||
Move,
|
||||
Open
|
||||
}
|
||||
|
||||
public StepType Type { get; set; }
|
||||
public Tuple<string,string> Value { get; set; }
|
||||
|
||||
public Step()
|
||||
{
|
||||
Type = StepType.First;
|
||||
Value = new Tuple<string, string>("AA", "0");
|
||||
}
|
||||
|
||||
public Step(string sourceValve, string targetValve)
|
||||
{
|
||||
Type = StepType.Move;
|
||||
Value = new Tuple<string, string>(sourceValve, targetValve);
|
||||
}
|
||||
|
||||
public Step(string valvename, int stepNumber)
|
||||
{
|
||||
Type = StepType.Open;
|
||||
Value = new Tuple<string, string>(valvename, stepNumber.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private List<Step> Steps { get; }
|
||||
private Dictionary<string, bool> OpenedValves { get; }
|
||||
|
||||
private IReadOnlyDictionary<string, Valve> Valves { get; }
|
||||
|
||||
public bool isValveOpen(string valveName)
|
||||
{
|
||||
return OpenedValves.ContainsKey(valveName);
|
||||
}
|
||||
|
||||
public StepList(IReadOnlyDictionary<string, Valve> valves, int maxSteps = 31)
|
||||
{
|
||||
MaxSteps = maxSteps;
|
||||
Valves = valves;
|
||||
|
||||
OpenedValves = new Dictionary<string, bool>();
|
||||
Steps = new List<Step>();
|
||||
}
|
||||
|
||||
public StepList(StepList other)
|
||||
{
|
||||
MaxSteps = other.MaxSteps;
|
||||
Valves = other.Valves;
|
||||
|
||||
OpenedValves = new Dictionary<string, bool>();
|
||||
Steps = new List<Step>();
|
||||
|
||||
foreach (var item in other.OpenedValves)
|
||||
{
|
||||
OpenedValves[item.Key] = item.Value;
|
||||
}
|
||||
|
||||
foreach (var item in other.Steps)
|
||||
{
|
||||
Steps.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
public int MaxSteps { get; }
|
||||
|
||||
public int StepCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return Steps.Count;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanContinue
|
||||
{
|
||||
get
|
||||
{
|
||||
return StepCount < MaxSteps;
|
||||
}
|
||||
}
|
||||
|
||||
public Step Latest
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Steps.Count == 0) return new Step();
|
||||
return Steps[Steps.Count - 1];
|
||||
}
|
||||
}
|
||||
|
||||
public bool AddStep(Step step)
|
||||
{
|
||||
if (StepCount < MaxSteps)
|
||||
{
|
||||
Steps.Add(step);
|
||||
|
||||
if (step.Type == Step.StepType.Open)
|
||||
{
|
||||
if (OpenedValves.ContainsKey(step.Value.Item1)) throw new InvalidDataException();
|
||||
OpenedValves[step.Value.Item1] = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public int GetPressureReleased()
|
||||
{
|
||||
int total = 0;
|
||||
|
||||
for (int i =0; i< Steps.Count; i++)
|
||||
{
|
||||
var step = Steps[i];
|
||||
|
||||
if (step.Type == Step.StepType.Open)
|
||||
{
|
||||
int timeOpen = MaxSteps - (Int32.Parse(step.Value.Item2)+1);
|
||||
|
||||
total += Valves[step.Value.Item1].FlowRate * timeOpen;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
public int CompareTo(object? obj)
|
||||
{
|
||||
var other = obj as StepList;
|
||||
if (other == null) throw new ArgumentException();
|
||||
|
||||
return this.GetPressureReleased().CompareTo(other.GetPressureReleased());
|
||||
}
|
||||
|
||||
public static StepList GenerateBestPath(StepList sl)
|
||||
{
|
||||
if (!sl.CanContinue)
|
||||
return sl;
|
||||
|
||||
var lastStep = sl.Latest;
|
||||
|
||||
Valve valve = sl.Valves[lastStep.Value.Item1];
|
||||
|
||||
List<StepList> paths = new List<StepList>();
|
||||
paths.Add(sl);
|
||||
|
||||
// Just did a move, see if we need to open this valve
|
||||
if (lastStep.Type == StepList.Step.StepType.Move || lastStep.Type == Step.StepType.First)
|
||||
{
|
||||
// if it was a move, then our current valve is the target
|
||||
if (lastStep.Type == StepList.Step.StepType.Move)
|
||||
valve = sl.Valves[lastStep.Value.Item2];
|
||||
|
||||
// Valve isnt open and maybe should be
|
||||
if (!sl.isValveOpen(valve.Name) && valve.FlowRate > 0)
|
||||
{
|
||||
// Open valve path
|
||||
{
|
||||
StepList copy = new StepList(sl);
|
||||
|
||||
copy.AddStep(new Step(valve.Name, sl.StepCount));
|
||||
copy = GenerateBestPath(copy);
|
||||
|
||||
paths.Add(copy);
|
||||
}
|
||||
|
||||
// leave it closed path
|
||||
foreach (var tunnel in valve.AdjacentValves)
|
||||
{
|
||||
if (lastStep.Type == Step.StepType.Move && lastStep.Value.Item1 == tunnel.Name)
|
||||
continue; // Dont bounce back and forth, can go back if it was an open tho
|
||||
|
||||
StepList copy = new StepList(sl);
|
||||
|
||||
copy.AddStep(new Step(valve.Name, tunnel.Name));
|
||||
copy = GenerateBestPath(copy);
|
||||
|
||||
paths.Add(copy);
|
||||
|
||||
StepList toRet = paths[0];
|
||||
foreach (var item in paths)
|
||||
{
|
||||
if (item.GetPressureReleased() > toRet.GetPressureReleased())
|
||||
{
|
||||
toRet = item;
|
||||
}
|
||||
}
|
||||
|
||||
return toRet;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Either the valve is already open or not worth opening
|
||||
foreach (var tunnel in valve.AdjacentValves)
|
||||
{
|
||||
if (lastStep.Type == Step.StepType.Move && lastStep.Value.Item1 == tunnel.Name)
|
||||
continue; // Dont bounce back and forth, can go back if it was an open tho
|
||||
|
||||
StepList copy = new StepList(sl);
|
||||
|
||||
copy.AddStep(new Step(valve.Name, tunnel.Name));
|
||||
copy = GenerateBestPath(copy);
|
||||
|
||||
paths.Add(copy);
|
||||
}
|
||||
|
||||
{
|
||||
StepList toRet = paths[0];
|
||||
foreach (var item in paths)
|
||||
{
|
||||
if (item.GetPressureReleased() > toRet.GetPressureReleased())
|
||||
{
|
||||
toRet = item;
|
||||
}
|
||||
}
|
||||
|
||||
return toRet;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class CaveGraph
|
||||
{
|
||||
public class CaveNode
|
||||
{
|
||||
public CaveNode(Valve v)
|
||||
{
|
||||
Valve = v;
|
||||
}
|
||||
|
||||
public List<CaveNode> AdjacentNodes { get; set; } = new List<CaveNode>();
|
||||
public List<int> AdjacentPathWeights { get; set; } = new List<int>();
|
||||
|
||||
public Valve Valve { get; }
|
||||
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
return Valve.Name;
|
||||
}
|
||||
}
|
||||
|
||||
public int FlowRate
|
||||
{
|
||||
get
|
||||
{
|
||||
return Valve.FlowRate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CompressNodes(CaveNode cn, List<Valve> targets, int currentWeight)
|
||||
{
|
||||
foreach (var v in targets)
|
||||
{
|
||||
if (v.FlowRate > 0)
|
||||
{
|
||||
cn.AdjacentNodes.Add(CaveNodes[v.Name]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, CaveNode> CaveNodes { get; }
|
||||
|
||||
public CaveGraph(Dictionary<string, Valve> valves)
|
||||
{
|
||||
CaveNodes = new Dictionary<string, CaveNode>();
|
||||
|
||||
foreach (var item in valves)
|
||||
{
|
||||
var valve = item.Value;
|
||||
// TODO
|
||||
CaveNode cn = new CaveNode(valve);
|
||||
//CaveNodes.Add(cn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VolcanoData
|
||||
{
|
||||
public VolcanoData(string filename)
|
||||
{
|
||||
Valves = new Dictionary<string, Valve>();
|
||||
StartingValve = new Valve("AA", 0);
|
||||
|
||||
using (StreamReader reader = System.IO.File.OpenText(filename))
|
||||
{
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
var line = reader.ReadLine();
|
||||
if (line == null) throw new InvalidDataException();
|
||||
|
||||
// Read in the valve name
|
||||
string newValveName = line.Split(' ')[1];
|
||||
int flowRate = Int32.Parse(line.Split('=')[1].Substring(0, line.Split("=")[1].IndexOf(';')));
|
||||
|
||||
if (!Valves.ContainsKey(newValveName))
|
||||
{
|
||||
Valves[newValveName] = new Valve(newValveName, flowRate);
|
||||
}
|
||||
else
|
||||
{
|
||||
Valves[newValveName].FlowRate = flowRate;
|
||||
}
|
||||
|
||||
// Read in adjacent valves
|
||||
string[] valves;
|
||||
|
||||
if (line.Contains("to valve "))
|
||||
{
|
||||
valves = line.Split("to valve ")[1].Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
}
|
||||
else if (line.Contains("to valves "))
|
||||
{
|
||||
valves = line.Split("valves ")[1].Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidDataException();
|
||||
}
|
||||
|
||||
foreach (var adjacentValve in valves)
|
||||
{
|
||||
if (!Valves.ContainsKey(adjacentValve))
|
||||
{
|
||||
Valves[adjacentValve] = new Valve(adjacentValve, -1);
|
||||
}
|
||||
|
||||
Valves[newValveName].AdjacentValves.Add(Valves[adjacentValve]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StartingValve = Valves["AA"];
|
||||
|
||||
CaveGraph cg = new CaveGraph(Valves);
|
||||
}
|
||||
|
||||
public void Print()
|
||||
{
|
||||
foreach (var item in Valves)
|
||||
{
|
||||
Console.Write("{0}; tunnels lead to ", item.Value);
|
||||
|
||||
bool first = true;
|
||||
foreach (var v in item.Value.AdjacentValves)
|
||||
{
|
||||
if (!first) Console.Write(", ");
|
||||
Console.Write(v.Name);
|
||||
first = false;
|
||||
}
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, Valve> Valves { get; }
|
||||
|
||||
public Valve StartingValve { get; }
|
||||
|
||||
public int GetMostPossiblePressureReleased(int maxSteps)
|
||||
{
|
||||
StepList sl = new StepList(Valves, maxSteps);
|
||||
|
||||
sl.AddStep(new StepList.Step());
|
||||
|
||||
sl = StepList.GenerateBestPath(sl);
|
||||
|
||||
return sl.GetPressureReleased();
|
||||
}
|
||||
}
|
||||
|
||||
class Valve
|
||||
{
|
||||
public Valve(string name, int flowRate)
|
||||
{
|
||||
Name = name;
|
||||
FlowRate = flowRate;
|
||||
AdjacentValves = new List<Valve>();
|
||||
}
|
||||
|
||||
public List<Valve> AdjacentValves
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public int FlowRate { get; set; }
|
||||
public string Name { get; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return String.Format("Valve: ({0}) Flow ({1}): ", Name, FlowRate);
|
||||
}
|
||||
}
|
||||
|
||||
8
2022/Day16CSharp/Properties/launchSettings.json
Normal file
8
2022/Day16CSharp/Properties/launchSettings.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Day16CSharp": {
|
||||
"commandName": "Project",
|
||||
"workingDirectory": "C:\\dev\\DevSandbox\\AdventOfCode\\2022\\Day16CSharp"
|
||||
}
|
||||
}
|
||||
}
|
||||
10
2022/Day16CSharp/example-input.txt
Normal file
10
2022/Day16CSharp/example-input.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||
Valve JJ has flow rate=21; tunnel leads to valve II
|
||||
146
2022/Day16CSharp/problem.txt
Normal file
146
2022/Day16CSharp/problem.txt
Normal file
@@ -0,0 +1,146 @@
|
||||
--- Day 16: Proboscidea Volcanium ---
|
||||
|
||||
The sensors have led you to the origin of the distress signal: yet another handheld device, just like the one the Elves gave you. However, you don't see any Elves around; instead, the device is surrounded by elephants! They must have gotten lost in these tunnels, and one of the elephants apparently figured out how to turn on the distress signal.
|
||||
|
||||
The ground rumbles again, much stronger this time. What kind of cave is this, exactly? You scan the cave with your handheld device; it reports mostly igneous rock, some ash, pockets of pressurized gas, magma... this isn't just a cave, it's a volcano!
|
||||
|
||||
You need to get the elephants out of here, quickly. Your device estimates that you have 30 minutes before the volcano erupts, so you don't have time to go back out the way you came in.
|
||||
|
||||
You scan the cave for other options and discover a network of pipes and pressure-release valves. You aren't sure how such a system got into a volcano, but you don't have time to complain; your device produces a report (your puzzle input) of each valve's flow rate if it were opened (in pressure per minute) and the tunnels you could use to move between the valves.
|
||||
|
||||
There's even a valve in the room you and the elephants are currently standing in labeled AA. You estimate it will take you one minute to open a single valve and one minute to follow any tunnel from one valve to another. What is the most pressure you could release?
|
||||
|
||||
For example, suppose you had the following scan output:
|
||||
|
||||
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||
Valve JJ has flow rate=21; tunnel leads to valve II
|
||||
|
||||
All of the valves begin closed. You start at valve AA, but it must be damaged or jammed or something: its flow rate is 0, so there's no point in opening it. However, you could spend one minute moving to valve BB and another minute opening it; doing so would release pressure during the remaining 28 minutes at a flow rate of 13, a total eventual pressure release of 28 * 13 = 364. Then, you could spend your third minute moving to valve CC and your fourth minute opening it, providing an additional 26 minutes of eventual pressure release at a flow rate of 2, or 52 total pressure released by valve CC.
|
||||
|
||||
Making your way through the tunnels like this, you could probably open many or all of the valves by the time 30 minutes have elapsed. However, you need to release as much pressure as possible, so you'll need to be methodical. Instead, consider this approach:
|
||||
|
||||
== Minute 1 ==
|
||||
No valves are open.
|
||||
You move to valve DD.
|
||||
|
||||
== Minute 2 ==
|
||||
No valves are open.
|
||||
You open valve DD.
|
||||
|
||||
== Minute 3 ==
|
||||
Valve DD is open, releasing 20 pressure.
|
||||
You move to valve CC.
|
||||
|
||||
== Minute 4 ==
|
||||
Valve DD is open, releasing 20 pressure.
|
||||
You move to valve BB.
|
||||
|
||||
== Minute 5 ==
|
||||
Valve DD is open, releasing 20 pressure.
|
||||
You open valve BB.
|
||||
|
||||
== Minute 6 ==
|
||||
Valves BB and DD are open, releasing 33 pressure.
|
||||
You move to valve AA.
|
||||
|
||||
== Minute 7 ==
|
||||
Valves BB and DD are open, releasing 33 pressure.
|
||||
You move to valve II.
|
||||
|
||||
== Minute 8 ==
|
||||
Valves BB and DD are open, releasing 33 pressure.
|
||||
You move to valve JJ.
|
||||
|
||||
== Minute 9 ==
|
||||
Valves BB and DD are open, releasing 33 pressure.
|
||||
You open valve JJ.
|
||||
|
||||
== Minute 10 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve II.
|
||||
|
||||
== Minute 11 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve AA.
|
||||
|
||||
== Minute 12 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve DD.
|
||||
|
||||
== Minute 13 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve EE.
|
||||
|
||||
== Minute 14 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve FF.
|
||||
|
||||
== Minute 15 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve GG.
|
||||
|
||||
== Minute 16 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You move to valve HH.
|
||||
|
||||
== Minute 17 ==
|
||||
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||
You open valve HH.
|
||||
|
||||
== Minute 18 ==
|
||||
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||
You move to valve GG.
|
||||
|
||||
== Minute 19 ==
|
||||
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||
You move to valve FF.
|
||||
|
||||
== Minute 20 ==
|
||||
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||
You move to valve EE.
|
||||
|
||||
== Minute 21 ==
|
||||
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||
You open valve EE.
|
||||
|
||||
== Minute 22 ==
|
||||
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||
You move to valve DD.
|
||||
|
||||
== Minute 23 ==
|
||||
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||
You move to valve CC.
|
||||
|
||||
== Minute 24 ==
|
||||
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||
You open valve CC.
|
||||
|
||||
== Minute 25 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
== Minute 26 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
== Minute 27 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
== Minute 28 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
== Minute 29 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
== Minute 30 ==
|
||||
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||
|
||||
This approach lets you release the most pressure possible in 30 minutes with this valve layout, 1651.
|
||||
|
||||
Work out the steps to release the most pressure in 30 minutes. What is the most pressure you can release?
|
||||
58
2022/Day16CSharp/puzzle-input.txt
Normal file
58
2022/Day16CSharp/puzzle-input.txt
Normal file
@@ -0,0 +1,58 @@
|
||||
Valve OA has flow rate=0; tunnels lead to valves VP, VM
|
||||
Valve GA has flow rate=13; tunnel leads to valve KV
|
||||
Valve WD has flow rate=0; tunnels lead to valves SH, XQ
|
||||
Valve TE has flow rate=0; tunnels lead to valves OY, DO
|
||||
Valve JR has flow rate=0; tunnels lead to valves TR, LY
|
||||
Valve JQ has flow rate=0; tunnels lead to valves TD, DZ
|
||||
Valve VH has flow rate=6; tunnels lead to valves WY, YQ, NU
|
||||
Valve NX has flow rate=0; tunnels lead to valves XQ, MN
|
||||
Valve XL has flow rate=0; tunnels lead to valves AA, FA
|
||||
Valve QY has flow rate=0; tunnels lead to valves NU, DO
|
||||
Valve KV has flow rate=0; tunnels lead to valves GA, XQ
|
||||
Valve NK has flow rate=0; tunnels lead to valves XW, XQ
|
||||
Valve JU has flow rate=0; tunnels lead to valves QH, TB
|
||||
Valve XZ has flow rate=0; tunnels lead to valves AA, SH
|
||||
Valve XQ has flow rate=18; tunnels lead to valves GK, NX, WD, KV, NK
|
||||
Valve VM has flow rate=19; tunnels lead to valves LY, OA, OY, AE
|
||||
Valve LE has flow rate=0; tunnels lead to valves MN, NS
|
||||
Valve HO has flow rate=0; tunnels lead to valves GO, QH
|
||||
Valve PX has flow rate=0; tunnels lead to valves MN, VP
|
||||
Valve MN has flow rate=4; tunnels lead to valves LE, UX, TB, NX, PX
|
||||
Valve VB has flow rate=0; tunnels lead to valves XM, AA
|
||||
Valve VP has flow rate=21; tunnels lead to valves XM, WT, BG, PX, OA
|
||||
Valve KI has flow rate=15; tunnels lead to valves XU, MT
|
||||
Valve NU has flow rate=0; tunnels lead to valves QY, VH
|
||||
Valve WT has flow rate=0; tunnels lead to valves SH, VP
|
||||
Valve OY has flow rate=0; tunnels lead to valves VM, TE
|
||||
Valve VS has flow rate=0; tunnels lead to valves QH, SH
|
||||
Valve XM has flow rate=0; tunnels lead to valves VB, VP
|
||||
Valve HI has flow rate=17; tunnel leads to valve TD
|
||||
Valve TB has flow rate=0; tunnels lead to valves JU, MN
|
||||
Valve BG has flow rate=0; tunnels lead to valves VP, GK
|
||||
Valve HN has flow rate=16; tunnel leads to valve BO
|
||||
Valve MT has flow rate=0; tunnels lead to valves KI, BO
|
||||
Valve OX has flow rate=0; tunnels lead to valves DZ, ZF
|
||||
Valve QH has flow rate=5; tunnels lead to valves FA, DW, VS, JU, HO
|
||||
Valve YQ has flow rate=0; tunnels lead to valves VH, AE
|
||||
Valve DW has flow rate=0; tunnels lead to valves ML, QH
|
||||
Valve WY has flow rate=0; tunnels lead to valves HS, VH
|
||||
Valve GO has flow rate=0; tunnels lead to valves HO, DO
|
||||
Valve UX has flow rate=0; tunnels lead to valves AA, MN
|
||||
Valve AE has flow rate=0; tunnels lead to valves YQ, VM
|
||||
Valve DZ has flow rate=9; tunnels lead to valves HS, OX, JQ
|
||||
Valve NS has flow rate=0; tunnels lead to valves SH, LE
|
||||
Valve LY has flow rate=0; tunnels lead to valves JR, VM
|
||||
Valve BO has flow rate=0; tunnels lead to valves HN, MT
|
||||
Valve HS has flow rate=0; tunnels lead to valves WY, DZ
|
||||
Valve XW has flow rate=0; tunnels lead to valves NK, AA
|
||||
Valve DO has flow rate=11; tunnels lead to valves TE, XU, ZF, QY, GO
|
||||
Valve FA has flow rate=0; tunnels lead to valves XL, QH
|
||||
Valve AA has flow rate=0; tunnels lead to valves VB, XL, XZ, XW, UX
|
||||
Valve VW has flow rate=14; tunnel leads to valve ML
|
||||
Valve SH has flow rate=8; tunnels lead to valves NS, WT, XZ, VS, WD
|
||||
Valve XU has flow rate=0; tunnels lead to valves DO, KI
|
||||
Valve ZF has flow rate=0; tunnels lead to valves OX, DO
|
||||
Valve GK has flow rate=0; tunnels lead to valves XQ, BG
|
||||
Valve ML has flow rate=0; tunnels lead to valves VW, DW
|
||||
Valve TD has flow rate=0; tunnels lead to valves HI, JQ
|
||||
Valve TR has flow rate=25; tunnel leads to valve JR
|
||||
Reference in New Issue
Block a user