Advertisement
csaki

Turing Machine (OOP-like)

Jun 23rd, 2014
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.29 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace TuringGep
  10. {
  11.     enum Direction { Backward = -1, Stay, Forward }
  12.     enum State { Q0, Q1, Final }
  13.     enum SpecialChar { Triangle, Blank }
  14.  
  15.     interface IReadableCharacter { }
  16.  
  17.     interface IReadableCharacter<T> : IReadableCharacter where T : struct
  18.     {
  19.         T Value { get; set; }
  20.     }
  21.  
  22.     class NumericCharacter : IReadableCharacter<int>
  23.     {
  24.         public int Value { get; set; }
  25.  
  26.         public NumericCharacter(int number)
  27.         {
  28.             Value = number;
  29.         }
  30.     }
  31.  
  32.     class TriangleCharacter : IReadableCharacter<SpecialChar>
  33.     {
  34.         public SpecialChar Value { get; set; }
  35.  
  36.         public TriangleCharacter()
  37.         {
  38.             Value = SpecialChar.Triangle;
  39.         }
  40.     }
  41.  
  42.     class BlankCharacter : IReadableCharacter<SpecialChar>
  43.     {
  44.         public SpecialChar Value { get; set; }
  45.  
  46.         public BlankCharacter()
  47.         {
  48.             Value = SpecialChar.Blank;
  49.         }
  50.     }
  51.  
  52.     interface ITuringMachine
  53.     {
  54.         void DeltaFunction();
  55.         void MoveHead(Direction direction);
  56.         void StartTuring();
  57.         bool IsInterpretible(IReadableCharacter character);
  58.         IReadableCharacter Read();
  59.         void Write(IReadableCharacter character);
  60.     }
  61.  
  62.     class NumericSearchTuring : ITuringMachine
  63.     {
  64.         private State _innerState;
  65.         private int _position = 0;
  66.         private int _searchTerm = -1;
  67.         private readonly List<IReadableCharacter> _tape;
  68.         private readonly List<int> _foundResultIndexList;
  69.  
  70.         private List<IReadableCharacter> _interpretibleCharacters = new List<IReadableCharacter>();
  71.  
  72.         public static NumericSearchTuring StartNew(List<int> numbersList, int searchTerm)
  73.         {
  74.             var turing = new NumericSearchTuring(numbersList, searchTerm);
  75.             turing.StartTuring();
  76.             return turing;
  77.         }
  78.  
  79.         private NumericSearchTuring(IEnumerable<int> listOfNumbers, int seachTerm)
  80.         {
  81.             _tape = new List<IReadableCharacter>();
  82.             _foundResultIndexList = new List<int>();
  83.             _searchTerm = seachTerm;
  84.  
  85.             _innerState = State.Q0;
  86.             _tape.Add(new TriangleCharacter());
  87.             IEnumerable<int> listEnums = listOfNumbers as int[] ?? listOfNumbers.ToArray();
  88.             _tape.AddRange(listEnums.Select(x => new NumericCharacter(x)));
  89.             _tape.Add(new BlankCharacter());
  90.            
  91.             for (int i = 0; i < 10; i++)
  92.             {
  93.                 _interpretibleCharacters.Add(new NumericCharacter(i));
  94.             }
  95.             _interpretibleCharacters.Add(new TriangleCharacter());
  96.             _interpretibleCharacters.Add(new BlankCharacter());
  97.         }
  98.  
  99.         public void StartTuring()
  100.         {
  101.             while (_innerState != State.Final)
  102.             {
  103.                 DeltaFunction();
  104.             }
  105.         }
  106.  
  107.         public void DeltaFunction()
  108.         {
  109.             IReadableCharacter value;
  110.             switch (_innerState)
  111.             {
  112.                 case State.Q0:
  113.                     if (!IsInterpretible(value = Read())) return;
  114.                     value = value as TriangleCharacter;
  115.                     SetInnerState(value != null ? State.Q1 : State.Final);
  116.                     return;
  117.                 case State.Q1:
  118.                     if (!IsInterpretible(value = Read())) return;
  119.                     var character = value as NumericCharacter;
  120.                     if (character != null)
  121.                     {
  122.                         if (_searchTerm == character.Value)
  123.                         {
  124.                             _foundResultIndexList.Add(_position - 1);
  125.                         }
  126.                         SetInnerState(State.Q1);
  127.                     }
  128.                     else
  129.                     {
  130.                         Write(new BlankCharacter());
  131.                         SetInnerState(State.Final);
  132.                     }
  133.                     return;
  134.                 case State.Final:
  135.                     Write(new BlankCharacter());
  136.                     break;
  137.             }
  138.         }
  139.  
  140.         public void SetInnerState(State state)
  141.         {
  142.             _innerState = state;
  143.             MoveHead(Direction.Forward);
  144.         }
  145.  
  146.         public bool IsInterpretible(IReadableCharacter character)
  147.         {
  148.             if (character is TriangleCharacter || character is BlankCharacter) return true;
  149.             var temp = character as NumericCharacter;
  150.             return temp != null &&
  151.                    _interpretibleCharacters.Where(chars => (chars as NumericCharacter) != null)
  152.                        .Cast<NumericCharacter>()
  153.                        .Any(num => temp.Value == num.Value);
  154.         }
  155.  
  156.         public IReadableCharacter Read()
  157.         {
  158.             return _tape[_position];
  159.         }
  160.  
  161.         public void Write(IReadableCharacter character)
  162.         {
  163.             _tape[_position] = character;
  164.         }
  165.  
  166.         public void MoveHead(Direction direction)
  167.         {
  168.             if (_position + (int)direction < _tape.Count)
  169.                 _position += (int)direction;
  170.         }
  171.  
  172.         public List<int> GetResults()
  173.         {
  174.             // Csak akkor van végeredmény, ha kész vagyunk, tehát az állapot final
  175.             return _innerState != State.Final ? null : _foundResultIndexList;
  176.         }
  177.     }
  178.  
  179.     class Program
  180.     {
  181.         static void Main()
  182.         {
  183.             int seachTerm = 5;
  184.             Random rand = new Random();
  185.             List<int> randomValues = new List<int>();
  186.             for (int i = 0; i < 30; i++)
  187.             {
  188.                 randomValues.Add(rand.Next(10));
  189.                 Console.Write(i + ": " + randomValues[i] + " \n");
  190.                 Debug.Write(i + ": " + randomValues[i] + " \n");
  191.             }
  192.             Console.WriteLine("Keressett szám: " + seachTerm);
  193.             Debug.WriteLine("Keressett szám: " + seachTerm);
  194.             NumericSearchTuring searchTuring = NumericSearchTuring.StartNew(randomValues, seachTerm);
  195.             Console.Write("Indexek: ");
  196.             Debug.Write("Indexek: ");
  197.             foreach (var result in searchTuring.GetResults())
  198.             {
  199.                 Console.Write(result + " ");
  200.                 Debug.Write(result + " ");
  201.             }
  202.             Console.WriteLine();
  203.             Console.ReadKey();
  204.         }
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement