56 lines
1.4 KiB
C#
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;
|
|
}
|
|
}
|