View difference between Paste ID: KBBUw1Yx and 4Pt58Ega
SHOW: | | - or go back to the newest paste.
1
namespace _12_StringMatrixRotation
2
{
3
    using System;
4
    using System.Collections.Generic;
5
    using System.Linq;
6
    using System.Text.RegularExpressions;
7
8
    class StringMatrixRotation
9
    {
10
        static void Main()
11
        {
12
            var matrix = new List<Queue<char>>();
13
14
            var rotations = new Queue<int>();
15
            var rotRegex = new Regex(@"(\d+)");
16
17
            // parse input
18
            while (true)
19
            {
20
                var cmd = Console.ReadLine();
21
22
                if(cmd == "END")
23
                {
24
                    break;
25
                }
26
27
                if (rotRegex.IsMatch(cmd))
28
                {
29
                    var degree = rotRegex.Match(cmd).Groups[1].Value;
30
                    rotations.Enqueue(int.Parse(degree));
31
                }
32
                else
33
                {
34
                    matrix.Add(new Queue<char>(cmd.ToCharArray()));
35
                }
36
            }
37
38
            // extend queues
39
            var width = matrix.Max(s => s.Count);
40
            var height = matrix.Count;
41
42
            foreach (var q in matrix)
43
            {
44
                if(q.Count < width)
45
                {
46
                    while (q.Count != width)
47
                    {
48
                        q.Enqueue(' ');
49
                    }
50
                }
51
            }
52
53
            // compute target rotation
54
            var totalRotation = rotations.Sum();
55
            var degreeReach = (totalRotation >= 360) ? totalRotation % 360 : totalRotation;
56
57
            var quarterRotations = degreeReach / 90;
58
59
            // apply rotation
60
            bool compareWidth = true;
61
            for (int i = 0; i < quarterRotations; i++)
62
            {
63
                var buffer = new List<Queue<char>>();
64
                for (int c = 0; c < ((compareWidth) ? width : height); c++)
65
                {
66
                    var q = new Queue<char>();
67
68
                    for (int r = matrix.Count - 1; r >= 0; r--)
69
                    {
70
                        var symbol = matrix[r].Dequeue();
71
                        q.Enqueue(symbol);
72
                    }
73
                    buffer.Add(q);
74
                }
75
76
                matrix = buffer;
77
78
                compareWidth = !compareWidth;
79
            }
80
81
            // print
82
            foreach (var item in matrix)
83
            {
84
                while (item.Count > 0)
85
                {
86
                    Console.Write(item.Dequeue());
87
                }
88
                Console.WriteLine();
89
            }
90
        }
91
    }
92
}