Advertisement
Guest User

Untitled

a guest
May 25th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Arithmetic {
  6.  
  7. class Program {
  8.  
  9. static void Main(string[] args) {
  10. var message = "AAABBBCCDD";
  11. var code = "BBC";
  12.  
  13. var symbols = CalculateProbs(message);
  14.  
  15. Console.WriteLine("Original list\n");
  16. DisplayList(symbols);
  17.  
  18. var codeWord = GetCodeWord(symbols, code);
  19. var tag = (codeWord.High + codeWord.Low) / 2;
  20. Console.WriteLine($"\nTag({codeWord.Name}) = " +
  21. $"({codeWord.High} + {codeWord.Low}) / 2 = {tag}");
  22. }
  23.  
  24.  
  25. static List<Symbol> CalculateProbs(string message) {
  26. var uniqueChars = message.Distinct().ToList();
  27.  
  28. var symbols = new List<Symbol>();
  29. foreach (var item in uniqueChars) {
  30. double probability = message.Count(c => c == item) / (double)message.Length;
  31. symbols.Add(new Symbol(item, probability));
  32. }
  33.  
  34. symbols = symbols.OrderBy(i => i.Name).OrderBy(i => i.Probability).ToList();
  35.  
  36. for (int i = 0; i < symbols.Count; i++) {
  37. symbols[i].Low = symbols.Take(i).Sum(s => s.Probability);
  38. symbols[i].High = symbols.Take(i + 1).Sum(s => s.Probability);
  39. }
  40.  
  41. symbols.Reverse();
  42.  
  43. return symbols;
  44. }
  45.  
  46. static Symbol GetCodeWord(List<Symbol> symbols, string code) {
  47. var currentChar = code[0];
  48. code = code.Substring(1);
  49.  
  50. var symbol = symbols.Find(s => s.Name == currentChar);
  51. var high = symbol.High;
  52. var low = symbol.Low;
  53.  
  54. foreach (var item in symbols) {
  55. item.High = high;
  56. item.Low = low + (high - low) * item.Low;
  57. high = item.Low;
  58. }
  59.  
  60. symbols.Last().Low = low;
  61.  
  62. Console.WriteLine($"\nExamining ({symbol.Name})\n");
  63. DisplayList(symbols);
  64.  
  65. if (code.Length > 1) return GetCodeWord(symbols, code);
  66.  
  67. return symbols.Find(i => i.Name == char.Parse(code));
  68. }
  69.  
  70. static void DisplayList(List<Symbol> symbols) {
  71. symbols.ForEach(i => Console.WriteLine($"\t{i.High}\n{i.Name}"));
  72. Console.WriteLine($"\t{symbols.Last().Low}");
  73. }
  74. }
  75.  
  76. class Symbol {
  77.  
  78. public Symbol(char name, double probability) {
  79. Name = name;
  80. Probability = probability;
  81. }
  82.  
  83. public char Name { get; set; }
  84. public double Low { get; set; }
  85. public double High { get; set; }
  86. public double Probability { get; set; }
  87. }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement