turing-machine/Implementation/Core/Tape.cs

56 lines
1.4 KiB
C#

using System.Collections.Generic;
namespace TuringMachine.Core
{
public class Tape
{
private readonly Dictionary<int, char> _data = new();
private readonly char _blankSymbol;
public int MinIndex { get; private set; } = 0;
public int MaxIndex { get; private set; } = 0;
public Tape(char blankSymbol = '_')
{
_blankSymbol = blankSymbol;
}
public char this[int index]
{
get => _data.TryGetValue(index, out char value) ? value : _blankSymbol;
set
{
if (value == _blankSymbol)
{
_data.Remove(index);
}
else
{
_data[index] = value;
// Track min/max indices
if (_data.Count == 1)
{
MinIndex = index;
MaxIndex = index;
}
else
{
if (index < MinIndex) MinIndex = index;
if (index > MaxIndex) MaxIndex = index;
}
}
}
}
public void Clear()
{
_data.Clear();
MinIndex = 0;
MaxIndex = 0;
}
public IEnumerable<int> DefinedIndices => _data.Keys;
}
}