-
Notifications
You must be signed in to change notification settings - Fork 0
/
MemoryV2Address.cs
51 lines (45 loc) · 966 Bytes
/
MemoryV2Address.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System.Collections.Generic;
using System.Linq;
namespace AdventOfCode.Year2020.Day14;
public class MemoryV2Address
{
public MemoryV2Address(bool?[] array)
{
this.array = array;
}
bool?[] array;
public IEnumerable<long> GetAddresses()
{
int floatingCount = array.Count(b => b == null);
for (long num = 0; num < (1 << floatingCount); num++)
{
bool[] address = new bool[array.Length];
for (int i = 0; i < array.Length; i++)
address[i] = array[i] ?? false;
int pos = 0;
for (int i = 0; i < floatingCount; i++)
{
while (array[pos] != null) pos++;
address[pos] = GetBit(i, num);
pos++;
}
yield return BoolArrayToLong(address);
}
}
private long BoolArrayToLong(bool[] array)
{
long value = 0;
foreach (bool bit in array)
{
value <<= 1;
if (bit) value++;
}
return value;
}
private bool GetBit(int index, long value)
{
long mask = 1 << index;
value &= mask;
return value != 0;
}
}