using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Numerics; using System.Text; using static System.Math; using static System.Linq.Enumerable; using static Extentions; public static class Program { static int[][] _s; static Queue<(bool, int, int)> _ope = new Queue<(bool, int, int)>(100); public static void Solve(IO io) { _s = io.Read(4, t => t.Select(u => u - 'A').Take(4).ToArray()); Print(); MakeRow0(); MakeRowNext(1); MakeRowNext(2); MakeRow3(); Print(); Optimize(); io.WriteLine(_ope.Count); foreach (var (d, i, n) in _ope) { io.WriteLine($"{(d ? 'R' : 'C')} {i} {n}"); } } // for debug public static void Print() { for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) Console.Error.Write($"{_s[i][j]} "); Console.Error.WriteLine(); } } public static int FindColumn(int v, int r) { for (var i = 0; i < 4; i++) if (_s[r][i] == v) return i; throw new UnreachableException(); } public static (int, int) Find(int v) { for (var i = 0; i < 4; i++) for (var j = 0; j < 4; j++) if (_s[i][j] == v) return (i, j); throw new UnreachableException(); } public static int Round(int i) => (i + 4) % 4; public static void Right(int r) { var t = _s[r][3]; _s[r][3] = _s[r][2]; _s[r][2] = _s[r][1]; _s[r][1] = _s[r][0]; _s[r][0] = t; _ope.Enqueue((true, r, 1)); } public static void Right(int r, int n) { Repeat(() => Right(r), n); //_ope.Push((true, r, n)); } public static void Left(int r) { var t = _s[r][0]; _s[r][0] = _s[r][1]; _s[r][1] = _s[r][2]; _s[r][2] = _s[r][3]; _s[r][3] = t; _ope.Enqueue((true, r, 3)); } public static void Left(int r, int n) { Repeat(() => Left(r), n); //_ope.Push((true, r, Round(4 - n))); } public static void Down(int c) { var t = _s[3][c]; _s[3][c] = _s[2][c]; _s[2][c] = _s[1][c]; _s[1][c] = _s[0][c]; _s[0][c] = t; _ope.Enqueue((false, c, 1)); } public static void Down(int c, int n) { Repeat(() => Down(c), n); //_ope.Push((false, c, n)); } public static void Up(int c) { var t = _s[0][c]; _s[0][c] = _s[1][c]; _s[1][c] = _s[2][c]; _s[2][c] = _s[3][c]; _s[3][c] = t; _ope.Enqueue((false, c, 3)); } public static void Up(int c, int n) { Repeat(() => Up(c), n); //_ope.Push((false, c, Round(4 - n))); } // _s[r][c] <-> _s[r][c + 1] public static void Swap(int r, int c) { c = Round(c - 1); Down(c); Left(r); Up(c); Right(r, 2); Down(c); Left(r); Up(c); Left(r); } public static void MakeRow0() { for (var i = 0; i < 4; i++) { var (r, c) = Find(i); Left(r, Round(c - i)); Up(i, r); } } // r == 1 || r == 2 public static void MakeRowNext(int r) { var next = r * 4; for (var i = 0; i < 4; i++, next++) { var (rn, cn) = Find(next); if (rn == r && cn == i) continue; if (i == 2 && _s[r][cn] == next) { Swap(r, cn - 1); continue; } Down(i, rn - r); if (i == 2) Down(3, rn - r); Left(rn, Round(cn - i)); Up(i, rn - r); if (i == 2) Up(3, rn - r); } } public static void MakeRow3() { for (var i = 0; i < 4; i++) { var c = FindColumn(12 + i, 3); while (c > i) { Swap(3, c - 1); c = FindColumn(12 + i, 3); } } } public static void Optimize() { var t = new Queue<(bool, int, int)>(_ope.Count); while (_ope.Any()) { var (fd, fi, n) = _ope.Peek(); var (d, i, cn) = (fd, fi, 0); while (d == fd && i == fi) { _ope.Dequeue(); cn += n; if (!_ope.Any()) break; (d, i, n) = _ope.Peek(); } cn = Round(cn); if (cn > 0) t.Enqueue((fd, fi, Round(cn))); } _ope = t; } public static void Main() { Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { NewLine = "\n", #if DEBUG AutoFlush = true, #else AutoFlush = false, #endif }); Solve(new IO(Console.In, Console.Out)); Console.Out.Flush(); } } public static partial class Extentions { } #region Library // fuckin' slow public class IO { public delegate T Parser(string str); public delegate string Serializer(T value); private TextReader _tr; private TextWriter _tw; public IO(TextReader tr, TextWriter tw) { _tr = tr; _tw = tw; } public string ReadLine() => _tr.ReadLine(); private string ReadWord() { var sb = new StringBuilder(); Repeat(_tr.Read).TakeWhile(c => c != ' ' && c != '\n').ForEach(c => sb.Append((char)c)); return sb.ToString(); } public T Read(Parser parser = null) => parser != null ? parser(ReadWord()) : (T)Convert.ChangeType(ReadWord(), typeof(T)); public (T1, T2) Read( Parser parser1 = null, Parser parser2 = null) => (Read(parser1), Read(parser2)); public (T1, T2, T3) Read( Parser parser1 = null, Parser parser2 = null, Parser parser3 = null) => (Read(parser1), Read(parser2), Read(parser3)); public (T1, T2, T3, T4) Read( Parser parser1 = null, Parser parser2 = null, Parser parser3 = null, Parser parser4 = null) => (Read(parser1), Read(parser2), Read(parser3), Read(parser4)); public T[] Read(int count, Parser parser = null) => Repeat(() => Read(parser), count).ToArray(); public (T1[], T2[]) Read(int count, Parser parser1 = null, Parser parser2 = null) => Repeat(() => Read(parser1, parser2), count).ToArray().Unzip(); public (T1[], T2[], T3[]) Read(int count, Parser parser1 = null, Parser parser2 = null, Parser parser3 = null) => Repeat(() => Read(parser1, parser2, parser3), count).ToArray().Unzip(); public (T1[], T2[], T3[], T4[]) Read(int count, Parser parser1 = null, Parser parser2 = null, Parser parser3 = null, Parser parser4 = null) => Repeat(() => Read(parser1, parser2, parser3, parser4), count).ToArray().Unzip(); public void Write(T value, Serializer serializer = null) { _tw.Write(serializer != null ? serializer(value) : value.ToString()); _tw.Write(' '); } public void Write(T1 value1, T2 value2, Serializer serializer1 = null, Serializer serializer2 = null) { Write(value1, serializer1); Write(value2, serializer2); } public void Write(T1 value1, T2 value2, T3 value3, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null) { Write(value1, serializer1); Write(value2, serializer2); Write(value3, serializer3); } public void Write(T1 value1, T2 value2, T3 value3, T4 value4, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null, Serializer serializer4 = null) { Write(value1, serializer1); Write(value2, serializer2); Write(value3, serializer3); Write(value4, serializer4); } public void WriteLine(T value, Serializer serializer = null) { Write(value, serializer); _tw.WriteLine(); } public void WriteLine(T1 value1, T2 value2, Serializer serializer1 = null, Serializer serializer2 = null) { Write(value1, value2, serializer1, serializer2); _tw.WriteLine(); } public void WriteLine(T1 value1, T2 value2, T3 value3, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null) { Write(value1, value2, value3, serializer1, serializer2, serializer3); _tw.WriteLine(); } public void WriteLine(T1 value1, T2 value2, T3 value3, T4 value4, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null, Serializer serializer4 = null) { Write(value1, value2, value3, value4, serializer1, serializer2, serializer3, serializer4); _tw.WriteLine(); } public void WriteLine(IEnumerable values, Serializer serializer = null) => values.ForEach(v => WriteLine(v, serializer)); public void WriteLine( IEnumerable values1, IEnumerable values2, Serializer serializer1 = null, Serializer serializer2 = null) { foreach (var (v1, v2) in values1.Zip(values2, ValueTuple.Create)) WriteLine(v1, v2, serializer1, serializer2); } public void WriteLine( IEnumerable values1, IEnumerable values2, IEnumerable values3, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null) { foreach (var (v1, v2, v3) in values1.Zip(values2, values3, ValueTuple.Create)) WriteLine(v1, v2, v3, serializer1, serializer2, serializer3); } public void WriteLine( IEnumerable values1, IEnumerable values2, IEnumerable values3, IEnumerable values4, Serializer serializer1 = null, Serializer serializer2 = null, Serializer serializer3 = null, Serializer serializer4 = null) { foreach (var (v1, v2, v3, v4) in values1.Zip(values2, values3, values4, ValueTuple.Create)) WriteLine(v1, v2, v3, v4, serializer1, serializer2, serializer3, serializer4); } } public class UnreachableException : Exception { } public static partial class Extentions { public static void Assert(bool condition) { if (!condition) Environment.Exit(1); } public static string AsString(this IEnumerable source) => new string(source.ToArray()); public static void ForEach(this IEnumerable source, Action action) { foreach (var item in source) action(item); } public static void ForEach(this IEnumerable source, Func func) { foreach (var item in source) func(item); } public static void ForEach(this IEnumerable source, Action action) { var i = 0; foreach (var item in source) action(item, i++); } public static void ForEach(this IEnumerable source, Func func) { var i = 0; foreach (var item in source) func(item, i++); } public static void Repeat(Action action, int count) { for (var i = 0; i < count; i++) action(); } public static void Repeat(Action action, int count) { for (var i = 0; i < count; i++) action(i); } public static IEnumerable Repeat(Func func) { for (var i = 0; ; i++) yield return func(); } public static IEnumerable Repeat(Func func, int count) { for (var i = 0; i < count; i++) yield return func(); } public static IEnumerable Repeat(Func func) { for (var i = 0; ; i++) yield return func(i); } public static IEnumerable Repeat(Func func, int count) { for (var i = 0; i < count; i++) yield return func(i); } public static void Swap(ref T x, ref T y) { var tmp = x; x = y; y = tmp; } public static (T1[], T2[]) Unzip( this ICollection<(T1, T2)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var i = 0; foreach (var (t1, t2) in source) { ts1[i] = t1; ts2[i] = t2; i++; } return (ts1, ts2); } public static (T1[], T2[], T3[]) Unzip( this ICollection<(T1, T2, T3)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var ts3 = new T3[source.Count]; var i = 0; foreach (var (t1, t2, t3) in source) { ts1[i] = t1; ts2[i] = t2; ts3[i] = t3; i++; } return (ts1, ts2, ts3); } public static (T1[], T2[], T3[], T4[]) Unzip( this ICollection<(T1, T2, T3, T4)> source) { var ts1 = new T1[source.Count]; var ts2 = new T2[source.Count]; var ts3 = new T3[source.Count]; var ts4 = new T4[source.Count]; var i = 0; foreach (var (t1, t2, t3, t4) in source) { ts1[i] = t1; ts2[i] = t2; ts3[i] = t3; ts4[i] = t4; i++; } return (ts1, ts2, ts3, ts4); } public static IEnumerable Zip( this IEnumerable first, IEnumerable second, IEnumerable thrid, Func resultSelector) { using (var e1 = first.GetEnumerator()) using (var e2 = second.GetEnumerator()) using (var e3 = thrid.GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext()) yield return resultSelector(e1.Current, e2.Current, e3.Current); } } public static IEnumerable Zip( this IEnumerable first, IEnumerable second, IEnumerable thrid, IEnumerable fourth, Func resultSelector) { using (var e1 = first.GetEnumerator()) using (var e2 = second.GetEnumerator()) using (var e3 = thrid.GetEnumerator()) using (var e4 = fourth.GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext() && e4.MoveNext()) yield return resultSelector(e1.Current, e2.Current, e3.Current, e4.Current); } } } #endregion