Day 3 solution. Not clean, but oh well.
This commit is contained in:
@ -24,6 +24,9 @@
|
||||
<None Update="inputs\02.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="inputs\03.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
1000
inputs/03.txt
Normal file
1000
inputs/03.txt
Normal file
File diff suppressed because it is too large
Load Diff
129
src/03.cs
Normal file
129
src/03.cs
Normal file
@ -0,0 +1,129 @@
|
||||
namespace aoc2021
|
||||
{
|
||||
internal class Day03
|
||||
{
|
||||
internal static void Go()
|
||||
{
|
||||
var lines = File.ReadAllLines("inputs/03.txt");
|
||||
Part1(lines);
|
||||
Part2(lines);
|
||||
}
|
||||
|
||||
private static void Part1(IEnumerable<string> lines)
|
||||
{
|
||||
using var t = new Timer();
|
||||
var len = lines.First().Length;
|
||||
int gammaRate = 0;
|
||||
int epsilonRate = 0;
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
var numZero = 0;
|
||||
var numOne = 0;
|
||||
foreach (var line in lines)
|
||||
{
|
||||
if (line[i] == '0')
|
||||
{
|
||||
numZero++;
|
||||
}
|
||||
else if (line[i] == '1')
|
||||
{
|
||||
numOne++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numOne > numZero)
|
||||
{
|
||||
gammaRate |= (1 << (len - i - 1));
|
||||
}
|
||||
else if (numZero > numOne)
|
||||
{
|
||||
epsilonRate |= (1 << (len - i - 1));
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Log($"part1: gamma rate: {gammaRate}, epsilon rate: {epsilonRate}, mult: {gammaRate * epsilonRate}");
|
||||
}
|
||||
|
||||
private static void Part2(IEnumerable<string> lines)
|
||||
{
|
||||
using var t = new Timer();
|
||||
int o2 = 0;
|
||||
int co2 = 0;
|
||||
var filtered = lines.ToList();
|
||||
for (int i = 0; i < lines.First().Length; i++)
|
||||
{
|
||||
var numZero = 0;
|
||||
var numOne = 0;
|
||||
foreach (var line in filtered)
|
||||
{
|
||||
if (line[i] == '0')
|
||||
{
|
||||
numZero++;
|
||||
}
|
||||
else if (line[i] == '1')
|
||||
{
|
||||
numOne++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numOne > numZero)
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '1');
|
||||
}
|
||||
else if (numZero > numOne)
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '1');
|
||||
}
|
||||
|
||||
if (filtered.Count == 1)
|
||||
{
|
||||
o2 = Convert.ToInt32(filtered[0], 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
filtered = lines.ToList();
|
||||
for (int i = 0; i < lines.First().Length; i++)
|
||||
{
|
||||
var numZero = 0;
|
||||
var numOne = 0;
|
||||
foreach (var line in filtered)
|
||||
{
|
||||
if (line[i] == '0')
|
||||
{
|
||||
numZero++;
|
||||
}
|
||||
else if (line[i] == '1')
|
||||
{
|
||||
numOne++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numOne < numZero)
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '1');
|
||||
}
|
||||
else if (numZero < numOne)
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
filtered.RemoveAll(x => x[i] != '0');
|
||||
}
|
||||
|
||||
if (filtered.Count == 1)
|
||||
{
|
||||
co2 = Convert.ToInt32(filtered[0], 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Log($"o2*co2 = {o2} * {co2} = {o2 * co2}");
|
||||
}
|
||||
}
|
||||
}
|
@ -1 +1,2 @@
|
||||
aoc2021.Day02.Go();
|
||||
aoc2021.Day03.Go();
|
||||
|
Reference in New Issue
Block a user