Próbuję zrobić to zadanie:
http://www.codeabbey.com/index/task_view/variable-length-code
W zasadzie nie jest ono trudne, i stworzyłem kod, który powinien działać bez problemów. Jednak, między pożądanym wyjściem, a moim wyjściem są pewne różnice, i kompletnie nie wiem z czego one wynikają. I stąd moje pytanie, czy ktoś mógłby naprowadzić mnie, gdzie popełniam błąd:
Mój kod:
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace Variable_Length_Code
{
class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
string[] res = Encode(s);
foreach (var x in res) Console.Write(x + " ");
Console.ReadLine();
}
static string[] xSplit(string s, int len)
{
return Regex.Matches(s, ".{1," + len + "}").Cast<Match>().Select(n => n.Value).ToArray();
}
static string ConvertBinToHex(string binstr)
{
return Convert.ToInt32(binstr, 2).ToString("x");
}
static string[] Encode(string raw)
{
string res = "";
foreach(var c in raw)
{
switch (c)
{
case ' ':
res += "11";
break;
case 't':
res += "1101";
break;
case 'n':
res += "10000";
break;
case 's':
res += "0101";
break;
case 'r':
res += "01000";
break;
case 'd':
res += "00101";
break;
case '!':
res += "001000";
break;
case 'c':
res += "000101";
break;
case 'm':
res += "000011";
break;
case 'g':
res += "0000100";
break;
case 'b':
res += "0000010";
break;
case 'v':
res += "00000001";
break;
case 'k':
res += "0000000001";
break;
case 'q':
res += "000000000001";
break;
case 'e':
res += "101";
break;
case 'o':
res += "10001";
break;
case 'a':
res += "011";
break;
case 'i':
res += "01001";
break;
case 'h':
res += "0011";
break;
case 'l':
res += "001001";
break;
case 'u':
res += "00011";
break;
case 'f':
res += "000100";
break;
case 'p':
res += "0000101";
break;
case 'w':
res += "0000011";
break;
case 'y':
res += "0000001";
break;
case 'j':
res += "000000001";
break;
case 'x':
res += "00000000001";
break;
case 'z':
res += "000000000000";
break;
}
}
while (res.Length % 8 != 0) res += "0";
string[] ReadyToConvert = xSplit(res, 8);
string[] ans = new string[ReadyToConvert.Length];
for(int i = 0; i != ReadyToConvert.Length; i++)
{
string s = ConvertBinToHex(ReadyToConvert[i]);
if(s.Length == 1)
{
s = "0" + s;
}
ans[i] = s.ToUpper();
}
return ans;
}
}
}
Moje wyjście:
D8 EB 24 90 39 52 AB 12 40 69 77 02 FA 6F 76 B9 02 22 DD C0 B9 09 81 68 5B 02 D8 6E 42 EB DA BE 9D 03 9B 01 B8 83 24 9C 80 B1 07 51 A0 64 DE 22 60 DA 04 68 BA 57 70 C7 02 A5 75 30 08 34 A9 D2 E5 AB A8 18 BA 98 C3 88 9B 24 9D 84 AB AD 00 35 77 02 E0 AD 87 A7 70 AF 53 61 BA 8C 41 2A 1C 05 BC 44 F4 EA DC 81 62 4C 60 9A BB 81 75 18 A7 A5 78 44 1F A7 78 51 6A AA 74 08
Oczekiwane wyjście:
98 CB 24 90 39 52 AB 12 40 69 77 02 F2 6E 76 B9 02 22 DD C0 B9 09 81 68 5B 02 D8 4E 42 CB 9A BC 9D 03 9B 01 B8 83 24 9C 80 B1 07 51 A0 64 DE 22 60 DA 04 68 BA 57 70 C7 02 A5 65 30 08 34 A9 D2 E5 AB 28 18 B2 98 C3 88 9B 24 9D 84 AB AD 00 35 77 02 E0 AD 87 27 70 AE 53 61 3A 8C 41 2A 1C 05 BC 44 E4 EA DC 81 62 4C 60 9A BB 81 75 18 A7 A5 78 44 1F 27 78 51 6A AA 64 08