Zadanie - niewielkie różnice na wyjściu

Zadanie - niewielkie różnice na wyjściu
camed_
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Białystok
  • Postów: 41
0

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:

Kopiuj
 
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:

Kopiuj
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

Sparrow-hawk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Katowice
  • Postów: 189
1

I chyba lepiej jakbyś użył słownika dla kodowania tych liter zamiast tego switch'a.

Tak na szybko, tyle, że w c++:

Kopiuj
#include <string>
#include <iostream>
#include <bitset>
#include <map>

std::map<char, std::string> letter_codes { { ' ', "11" }, { 't', "1001" }, { 'n', "10000" }, { 's', "0101" }, { 'r',
    "01000" }, { 'd', "00101" }, { '!', "001000" }, { 'c', "000101" }, { 'm', "000011" }, { 'g', "0000100" }, { 'b',
    "0000010" }, { 'v', "00000001" }, { 'k', "0000000001" }, { 'q', "000000000001" }, { 'e', "101" }, { 'o', "10001" },
    { 'a', "011" }, { 'i', "01001" }, { 'h', "0011" }, { 'l', "001001" }, { 'u', "00011" }, { 'f', "000100" }, { 'p',
        "0000101" }, { 'w', "0000011" }, { 'y', "0000001" }, { 'j', "000000001" }, { 'x', "00000000001" }, { 'z',
        "000000000000" } };

int to_hex(std::string bin) {
  std::bitset<8> binary(bin);

  return binary.to_ulong();
}

int main(int argc, char *argv[]) {
  std::string input;
  std::string output;

  std::cout << "Enter text: ";
  getline(std::cin, input);

  for (char &letter : input) {
    output += letter_codes[letter];
  }

  while (output.length() % 8 != 0)
    output += '0';

  for (unsigned int i = 0; i < output.length() / 8; ++i) {
    std::cout << std::hex << to_hex(output.substr(8 * i, 8)) << ' ';
  }

  return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.