morgan73

StringMatrixRotation

Jun 6th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
Add Comment
Please, Sign In to add comment