Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

CodeDojo Statemachine Linecounter

By: a guest on Jan 24th, 2013  |  syntax: C#  |  size: 5.74 KB  |  views: 30  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace CodeDojo.Linjeteller
  5. {
  6.     internal class Program
  7.     {
  8.         private static void Main(string[] args)
  9.         {
  10.             var startTime = DateTime.Now;
  11.             var startState = ConstructParser();
  12.             var initTime = DateTime.Now;
  13.             foreach (var s in args)
  14.             {
  15.                 var runTime = DateTime.Now;
  16.                 var linesOfCode = GetLinesOfCode(s, startState);
  17.                 var stepTime = DateTime.Now;
  18.                
  19.                 Console.WriteLine("Antall linjer: {0}", linesOfCode);
  20.                 Console.WriteLine("Run: {0}", (stepTime - runTime).Milliseconds);
  21.                 Console.WriteLine("------------------------");
  22.             }
  23.             var stopTime = DateTime.Now;
  24.  
  25.             Console.WriteLine("InitTime: {0}", (stopTime - startTime).Milliseconds);
  26.             Console.Read();
  27.         }
  28.  
  29.         private static State ConstructParser()
  30.         {
  31.             var startState = new State();
  32.             var firstSlashState = new State();
  33.             var secondSlashState = new State();
  34.  
  35.             var firstSlashTextState = new State();
  36.             var secondTextSlashState = new State();
  37.  
  38.             var firstAsteriskState = new State();
  39.             var secondAsteriskState = new State();
  40.  
  41.             var firstTextAsteriskState = new State();
  42.             var secondTextAsteriskState = new State();
  43.             var textState = new State() { IsCode = true };
  44.             var quoteState = new State();
  45.  
  46.             #region startstate
  47.             startState.DefaultState = textState;
  48.             startState.ValidStates.Add('/', firstSlashState);
  49.             startState.ValidStates.Add('\t', startState);
  50.             startState.ValidStates.Add('\n', startState);
  51.             startState.ValidStates.Add(' ', startState);
  52.             #endregion
  53.  
  54.             #region quoteState
  55.             quoteState.DefaultState = quoteState;
  56.             quoteState.ValidStates.Add('\n', startState);
  57.             quoteState.ValidStates.Add('"', textState);
  58.             #endregion
  59.  
  60.             #region textState
  61.             textState.DefaultState = textState;
  62.             textState.ValidStates.Add('/', firstSlashTextState);
  63.             textState.ValidStates.Add('"', quoteState);
  64.             textState.ValidStates.Add('\n', startState);
  65.             #endregion
  66.  
  67.             #region firstSlashTextState
  68.             firstSlashTextState.DefaultState = textState;
  69.             firstSlashTextState.ValidStates.Add('/', secondTextSlashState);
  70.             firstSlashTextState.ValidStates.Add('*', firstTextAsteriskState);
  71.             #endregion
  72.  
  73.             #region secondSlashState
  74.             secondTextSlashState.DefaultState = secondTextSlashState;
  75.             secondTextSlashState.ValidStates.Add('\n', startState);
  76.             #endregion
  77.  
  78.             #region firstSlashState
  79.             firstSlashState.ValidStates.Add('/', secondSlashState);
  80.             firstSlashState.ValidStates.Add('*', firstAsteriskState);
  81.             firstSlashState.DefaultState = textState;
  82.             #endregion
  83.  
  84.             #region secondSlashState
  85.             secondSlashState.DefaultState = secondSlashState;
  86.             secondSlashState.ValidStates.Add('\n', startState);
  87.             #endregion
  88.  
  89.             #region firstTextAsteriskState
  90.             firstTextAsteriskState.DefaultState = firstTextAsteriskState;
  91.             firstTextAsteriskState.ValidStates.Add('*', secondTextAsteriskState);
  92.             #endregion
  93.  
  94.             #region secondTextAsteriskState
  95.             secondTextAsteriskState.DefaultState = firstTextAsteriskState;
  96.             secondTextAsteriskState.ValidStates.Add('/', startState);
  97.             #endregion
  98.  
  99.             #region firstAsteriskState
  100.             firstAsteriskState.ValidStates.Add('*', secondAsteriskState);
  101.             firstAsteriskState.DefaultState = firstAsteriskState;
  102.             #endregion
  103.  
  104.             #region secondAsteriskState
  105.             secondAsteriskState.DefaultState = firstAsteriskState;
  106.             secondAsteriskState.ValidStates.Add('/', startState);
  107.             #endregion
  108.  
  109.             return startState;
  110.         }
  111.  
  112.         public static int GetLinesOfCode(string pathToFile, State currentState)
  113.         {
  114.             if (string.IsNullOrEmpty(pathToFile))
  115.                 throw new ArgumentException();
  116.  
  117.             var file = System.IO.File.ReadAllLines(pathToFile);
  118.             var counter = 0;
  119.  
  120.  
  121.             foreach (var line in file)
  122.             {
  123.                 var lineHasBeenIncremented = false;
  124.                 foreach (var c in line.ToCharArray())
  125.                 {
  126.                     currentState = NewState(currentState, c);
  127.                     if (currentState.IsCode && !lineHasBeenIncremented)
  128.                     {
  129.                         lineHasBeenIncremented = true;
  130.                         counter++;
  131.                     }
  132.                 }
  133.                 currentState = NewState(currentState, '\n');
  134.             }
  135.             return counter;
  136.         }
  137.  
  138.         private static State NewState(State currentState, char c)
  139.         {
  140.             if (currentState.ValidStates.ContainsKey(c))
  141.             {
  142.                 currentState = currentState.ValidStates[c];
  143.             }
  144.             else if (currentState.DefaultState != null)
  145.             {
  146.                 currentState = currentState.DefaultState;
  147.             }
  148.             return currentState;
  149.         }
  150.     }
  151.  
  152.     public class State
  153.     {
  154.         public Dictionary<char, State> ValidStates { get; set; }
  155.         public State DefaultState = null;
  156.         public bool IsCode = false;
  157.  
  158.         public State()
  159.         {
  160.             ValidStates = new Dictionary<char, State>();
  161.         }
  162.     }
  163. }