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 Stack<(bool, int, int)> _ope = new Stack<(bool, int, int)>(); public static void Solve(IO io) { _s = io.Read(4, t => t.Select(u => u - 'A').Take(4).ToArray()); var next = 1; var (r, c) = Find(next); MakeFirstRow(); MakeRowNext(1); MakeRowNext(2); MakeRow(3); // kuso of kuso if (_s[3][3] == 14) Swap(3, 2); io.WriteLine(_ope.Count); foreach (var (f, x, y) in _ope) { io.WriteLine($"{(f ? 'R' : 'C')} {x} {y}"); } } // for debug public static void Print() { for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) Console.Write($"{_s[i][j]} "); Console.WriteLine(); } } public static (int, int) Find(int v) { if (v < 0) return (-1, v + 4); for (var i = 0; i < 4; i++) for (var j = 0; j < 4; j++) if (_s[i][j] == v) return (i, j); throw new Exception("unreachable"); } 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.Push((true, r, 1)); } public static void Right(int r, int x) { Repeat(() => Right(r), x); _ope.Push((true, r, x)); } 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.Push((true, r, 3)); } public static void Left(int r, int x) { Repeat(() => Left(r), x); _ope.Push((true, r, Round(4 - x))); } 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.Push((false, c, 1)); } public static void Down(int c, int x) { Repeat(() => Down(c), x); _ope.Push((false, c, x)); } 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.Push((false, c, 3)); } public static void Up(int c, int x) { Repeat(() => Up(c), x); _ope.Push((false, c, Round(4 - x))); } // _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); Repeat(() => Right(r), 2); Down(c); Left(r); Up(c); Left(r); } public static void MakeFirstRow() { for (var i = 0; i < 4; i++) { var (r, c) = Find(i); Repeat(() => Left(r), Round(c - i)); Repeat(() => Up(i), r); } } // r != 1 && r != 3 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; } Repeat(() => Down(i), rn - r); if (i == 2) Repeat(() => Down(i + 1), rn - r); Repeat(() => Left(rn), Round(cn - i)); Repeat(() => Up(i), rn - r); if (i == 2) Repeat(() => Up(i + 1), rn - r); } } // r == 3 public static void MakeRow(int r) { var next = r * 4; for (var i = 0; i < 4; i++) { var (_, c) = Find(next); while (c > i) { Swap(r, c - 1); (_, c) = Find(next); } } } 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 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