// 计数 void Counter(Tape &t) { Controller c; c.AddRule(0, '0', 0, '0', 'R'); c.AddRule(0, '1', 0, '1', 'R'); c.AddRule(0, ' ', 1, ' ', 'L'); c.AddRule(1, '0', 0, '1', 'R'); c.AddRule(1, '1', 1, '0', 'L'); c.AddRule(1, ' ', 0, '1', 'R'); c.Run(t, true); }
// 按位取反 void BitwiseFlip(Tape &t) { Controller c; // 如果这里看到的是0,那么S1将写1; // 如果这里看到的是1,那么S2将写0。 c.AddRule(0, '0', 1, ' ', 'R'); c.AddRule(0, '1', 2, ' ', 'R'); c.AddRule(0, '$', 4, '$', 'S'); c.AddRule(1, '0', 1, '0', 'R'); c.AddRule(1, '1', 1, '1', 'R'); c.AddRule(1, ' ', 3, '1', 'L'); c.AddRule(1, '$', 1, '$', 'R'); c.AddRule(2, '0', 2, '0', 'R'); c.AddRule(2, '1', 2, '1', 'R'); c.AddRule(2, ' ', 3, '0', 'L'); c.AddRule(2, '$', 2, '$', 'R'); // 往回移到数字开头。 c.AddRule(3, '0', 3, '0', 'L'); c.AddRule(3, '1', 3, '1', 'L'); c.AddRule(3, ' ', 0, ' ', 'R'); c.AddRule(3, '$', 3, '$', 'L'); c.MarkFinal(4); c.Run(t, true); }
// 打印交错01串 void ZeroOneString(Tape &t) { Controller c; c.AddRule(0, ' ', 1, '0', 'R'); c.AddRule(1, ' ', 0, '1', 'R'); c.Run(t, true); }
// a<=b? // 必须同等长度 void Less(Tape &t) { Controller c; // 若第一位为0,则去(a) // 若第一位为1,则去(b) c.AddRule(0, '0', 1, ' ', 'R'); c.AddRule(0, '1', 4, ' ', 'R'); c.AddRule(0, '$', 6, ' ', 'R'); // 等于最后也写0 // (a) 若0,把第二个数的第一位改成$;若1,则确定小于 c.AddRule(1, '0', 1, '0', 'R'); c.AddRule(1, '1', 1, '1', 'R'); c.AddRule(1, '$', 2, '$', 'R'); c.AddRule(2, '$', 2, '$', 'R'); c.AddRule(2, '0', 3, '$', 'L'); c.AddRule(2, '1', 9, ' ', 'R'); // 移回第一个数开头。 c.AddRule(3, '0', 3, '0', 'L'); c.AddRule(3, '1', 3, '1', 'L'); c.AddRule(3, '$', 3, '$', 'L'); c.AddRule(3, ' ', 0, ' ', 'R'); // (b) 如果第二个数的第一位是1继续比较;如果是0,那确定大于 c.AddRule(4, '0', 4, '0', 'R'); c.AddRule(4, '1', 4, '1', 'R'); c.AddRule(4, '$', 5, '$', 'R'); c.AddRule(5, '$', 5, '$', 'R'); c.AddRule(5, '0', 6, ' ', 'R'); c.AddRule(5, '1', 3, '$', 'L'); // 最后写0 c.AddRule(6, '0', 6, ' ', 'R'); c.AddRule(6, '1', 6, ' ', 'R'); c.AddRule(6, '$', 6, ' ', 'R'); c.AddRule(6, ' ', 7, '0', 'R'); // 最后写1 c.AddRule(9, '0', 9, ' ', 'R'); c.AddRule(9, '1', 9, ' ', 'R'); c.AddRule(9, '$', 9, ' ', 'R'); c.AddRule(9, ' ', 7, '1', 'R'); //c.AddRule(7, ' ', 8, '$', 'L'); c.MarkFinal(7); c.Run(t, true); }