public static Dictionary <string, string> Encode(string[] states) { Dictionary <string, string> dic = new Dictionary <string, string>(); string[] codes = new string[states.Length]; int length = (int)Math.Ceiling(Math.Log(states.Length, 2)); for (int i = 0; i < states.Length; i++) { codes[i] = TuringToPost.getCode(i, length, states[i]); } TuringToPost.improveSpaceCode(codes, states); for (int i = 0; i < states.Length; i++) { dic.Add(states[i], codes[i]); } return(dic); }
public string[,] GeneratePostProgram() { TuringToPost t = new TuringToPost(codes[this.Alphabet[0]].Length); List<int> st = new List<int>(); // индексы состояний List<int> refern = new List<int>(); //индексы, в которые будем пихать отсылки int fir = this.Table.Length; // колв-о комманд (строк в таблице) int sec = this.Table[0].Length; // 3 по идее int thi = this.Table[0][0].Length; // кол-во столбцов for(int i=0; i<fir; i++) // генерим программу без отсылок { st.Add(t.Prog.Count + 1); // добавляем индекс состояния for(int j=0; j<thi; j++) { if (Table[i][0][j] == "" && Table[i][1][j] == "") continue; // если состояние не описано string alph = codes[Alphabet[j]], stt = codes[Table[i][0][j]], mover = Table[i][1][j]; int count = this.calcStLen(alph, stt, mover); // длина для неудачной отсылки // неверные отсылки, длину надо прибавлять к текущему состоянию t.Check(alph, t.Prog.Count + 3 * t.Length + 1, t.Prog.Count + count + 1); t.Replace(alph, stt); if (mover == "r") t.MoveRight(); else if (mover == "l") t.MoveLeft(); else if (mover == "halt") t.Stop(); refern.Add(t.Prog.Count - 1); } } t.Stop(); // остановка в конце по сут не нужна, но последняя отсылка указывает на несуществующую команду for (int i = 0, k = 0; i < fir; i++) // генерим отсылки { for (int j = 0; j < thi; j++) { if (this.Table[i][2][j] == "") continue; int statind = this.DicStates[this.Table[i][2][j]]; int what = refern[k++]; int where = st[statind]; if (t.Prog[what][0] != PostCommands.Stop) t.Prog[what][1] = where.ToString(); } } string[,] outst = new string[t.Prog.Count, t.Prog[0].Length]; for (int i = 0; i < outst.GetLength(0); i++) for (int j = 0; j < outst.GetLength(1); j++) outst[i, j] = t.Prog[i][j]; return outst; }