using System; //using System.IO; using System.Collections.Generic; //using System.Text; namespace MaszynaTuringa { public static class TuringHelper { public static void ConsoleWriteLine(this Turing turing) { Console.WriteLine("Stan głowicy: " + turing.StanGłowicy); Console.WriteLine("Taśma: " + new string(turing.Taśma)); Console.WriteLine("Program: "); foreach (string linia in turing.Program) Console.WriteLine(linia); } } class Program { static void Main(string[] args) { //string[] kodProgramu = File.ReadAllLines("program.txt"); //string taśma = File.ReadAllText("taśma.txt"); string[] kodProgramu = { "aABb", "bBRb", "bAAa" }; string taśma = "aAABCAD"; Console.WriteLine("Początkowy stan maszyny: " + taśma); Console.WriteLine("Program: "); foreach (string linia in kodProgramu) Console.WriteLine(linia); Turing turing = new Turing(taśma, kodProgramu); //TuringHelper.ConsoleWriteLine(turing); turing.ConsoleWriteLine(); turing.Run(); //Console.WriteLine(turing.Output.Length.ToString()); Console.WriteLine("\nWynik działania programu: "); foreach(string s in turing.Output) Console.WriteLine(s); } } } namespace MaszynaTuringa { using Czwórki = SortedList<(char stanGłowicy, char wartośćNaTaśmie), (char nowyStanGłowicy, char nowaWartośćNaTaśmie)>; public class Turing { public char[] Taśma { get; private set; } public char StanGłowicy { get; private set; } public int PołożenieGłowicy { get; private set; } public string[] Program { get; private set; } private Czwórki sparsowanyProgram; public string[] Output { get; private set; } /* private static ((int, char) stanGłowicy, string taśma) analizujTaśmęZeStanemGłowicy(string s) { int położenieGłowicy = -1; int liczbaMałychLiter = 0; int liczbaZnakówNiebędącychLiterami = 0; for(int i = 0; i < s.Length; ++i) { if (char.IsLower(s[i])) { liczbaMałychLiter++; położenieGłowicy = i; } if (!char.IsLetter(s[i])) liczbaZnakówNiebędącychLiterami++; } if (liczbaMałychLiter != 1) throw new Exception("Błędny zapis taśmy. Musi być jeden symboli głowicy"); if (liczbaZnakówNiebędącychLiterami > 0) throw new Exception("Niedozwolone znaki w opisie taśmy"); (int, char) stanGłowicy = (położenieGłowicy, s[położenieGłowicy]); string taśma = s.Remove(położenieGłowicy, 1); return (stanGłowicy, taśma); } */ private static (char[] taśma, char stanGłowicy, int położenieGłowicy) analizujTaśmęZeStanemGłowicy(string s) { int położenieGłowicy = -1; int liczbaMałychLiter = 0; int liczbaZnakówNiebędącychLiterami = 0; for(int i = 0; i < s.Length; ++i) { if (char.IsLower(s[i])) { liczbaMałychLiter++; położenieGłowicy = i; } if (!char.IsLetter(s[i])) liczbaZnakówNiebędącychLiterami++; } if (liczbaMałychLiter != 1) throw new Exception("Błędny zapis taśmy. Musi być jeden symboli głowicy"); if (liczbaZnakówNiebędącychLiterami > 0) throw new Exception("Niedozwolone znaki w opisie taśmy"); string taśma = s.Remove(położenieGłowicy, 1); return (taśma.ToCharArray(), s[położenieGłowicy], położenieGłowicy); } private static bool czyCzwórkaPoprawna(string linia) { Func isLowerLetter = (char c) => { return c >= 'a' && c <= 'z'; }; Func isUpperLetter = (char c) => { return c >= 'A' && c <= 'Z'; }; return isLowerLetter(linia[0]) && isUpperLetter(linia[1]) && isUpperLetter(linia[2]) && isLowerLetter(linia[3]); } private static Czwórki parsujProgram(string[] kodProgramu) { Czwórki czwórki = new Czwórki(); foreach(string linia in kodProgramu) { if(string.IsNullOrWhiteSpace(linia)) continue; if(!czyCzwórkaPoprawna(linia)) throw new Exception("Niepoprawna linia kodu: " + linia); (char, char) bieżącyStan = (linia[0],linia[1]); (char, char) nowyStan = (linia[3],linia[2]); if(czwórki.ContainsKey(bieżącyStan)) throw new Exception("Program nie może zawierać dwóch linii o tych samych dwóch pierwszych literach"); czwórki.Add(bieżącyStan, nowyStan); } return czwórki; } public Turing(string taśmaZeStanemGłowicy, string[] program) { var stanMaszyny = analizujTaśmęZeStanemGłowicy(taśmaZeStanemGłowicy); this.StanGłowicy = stanMaszyny.stanGłowicy; this.PołożenieGłowicy = stanMaszyny.położenieGłowicy; this.Taśma = stanMaszyny.taśma; this.Program = program; } public void Run() { sparsowanyProgram = parsujProgram(Program); List output = wykonajProgram((Taśma, StanGłowicy, PołożenieGłowicy), sparsowanyProgram); Output = output.ToArray(); } private static (char nowyStanGłowicy, char nowaWartośćLubPolecenie)? znajdźPolecenie( char stanGłowicy, char wartośćNaTaśmie, Czwórki program) { (char, char) bieżącyStan = (stanGłowicy, wartośćNaTaśmie); if(program.ContainsKey(bieżącyStan)) return program[bieżącyStan]; else return null; } private static List wykonajProgram( (char[] taśma, char stanGłowicy, int położenieGłowicy) stanMaszyny, Czwórki program) { List historia = new List(); (char nowyStanGłowicy, char nowaWartośćLubPolecenie)? polecenie; while((polecenie = znajdźPolecenie(stanMaszyny.stanGłowicy, stanMaszyny.taśma[stanMaszyny.położenieGłowicy], program)) != null) { stanMaszyny.stanGłowicy = polecenie.Value.nowyStanGłowicy; switch(polecenie.Value.nowaWartośćLubPolecenie) { case 'L': stanMaszyny.położenieGłowicy--; //Console.WriteLine("*L"); break; case 'R': stanMaszyny.położenieGłowicy++; //Console.WriteLine("*R"); break; default: stanMaszyny.taśma[stanMaszyny.położenieGłowicy] = polecenie.Value.nowaWartośćLubPolecenie; //Console.WriteLine("*1" + stanMaszyny.położenieGłowicy); //Console.WriteLine("*1" + polecenie.Value.nowaWartośćLubPolecenie); //Console.WriteLine("*1" + stanMaszyny.taśma[stanMaszyny.położenieGłowicy]); break; } historia.Add(pobierzŁańcuchOpisującyStanMaszyny(stanMaszyny)); Console.WriteLine(new string(stanMaszyny.taśma)); } return historia; } private static string pobierzŁańcuchOpisującyStanMaszyny((char[] taśma, char stanGłowicy, int położenieGłowicy) stanMaszyny) { string s = new string(stanMaszyny.taśma); //Console.WriteLine("*2" + s); s = s.Insert(stanMaszyny.położenieGłowicy, stanMaszyny.stanGłowicy.ToString()); //Console.WriteLine("*3" + s); //Console.WriteLine("*3" + stanMaszyny.położenieGłowicy); //Console.WriteLine("*3" + stanMaszyny.stanGłowicy); return s; } } }