[Workshop] 4. Decode and Decrypt


0
Здравейте! Докато е все още свежа задачата след workshop-a някой би ли се нагърбил да изкаже мнение защо моето решение дава 70/100 в БГКОДЕР и къде евентуално може да ми е грешката? Гледах решението на Коцето, но така и не разбрах моята логика къде куца. Ето и линк към условието/бгкодер: ЦЪК
using System; using System.Text; class Program { //Encode(Encrypt(message, cypher) + cypher) + lengthOfCypher static void Main(string[] args) { Start(); } public static void Start() { string cypherText = Console.ReadLine(); int cypherLenght = Convert.ToInt32(GetCypherLength(cypherText)); string decodedText = Decode(cypherText, cypherLenght); string cypher = decodedText.Substring(decodedText.Length - cypherLenght); string neededText = decodedText.Substring(0, decodedText.Length - cypherLenght); string result = Encrypt(neededText, cypher); Console.WriteLine(result); //Console.WriteLine(Encode(Encrypt(result,cypher) + cypher) + cypherLenght); } public static string GetCypherLength(string cypherText) { string strCyperLenght = ""; for (int i = cypherText.Length - 1; i >= 0; i--) { if (char.IsDigit(cypherText[i])) { strCyperLenght = cypherText[i] + strCyperLenght; } else { break; } } return strCyperLenght; } public static string Decode(string cypherText, int cypherLength) { StringBuilder decodedText = new StringBuilder(); int currentNumber = 0; for (int i = 0; i < cypherText.Length - ((cypherLength).ToString()).Length - 1; i++) { if (char.IsDigit(cypherText[i])) { currentNumber = int.Parse(cypherText[i].ToString()); for (int j = 0; j < currentNumber; j++) { decodedText.Append(cypherText[i + 1]); } i++; } else { decodedText.Append(cypherText[i]); } } if (!char.IsDigit(cypherText[cypherText.Length - ((cypherLength).ToString()).Length - 2])) { decodedText.Append(cypherText[cypherText.Length - ((cypherLength).ToString()).Length - 1]); } return decodedText.ToString(); } public static string Encrypt(string message, string cypher) { StringBuilder result = new StringBuilder(); if (message.Length >= cypher.Length) { for (int i = 0, j = 0; i < message.Length; i++, j++) { result.Append((char)('A' + ((message[i] - 'A') ^ (cypher[j] - 'A')))); if (j == cypher.Length - 1) { j = -1; } } } else { bool overlapped = false; char[] textArr = new char[message.Length]; for (int i = 0, j = 0; i < cypher.Length; i++, j++) { if (!overlapped) { textArr[j] = (char)(((message[j] - 'A') ^ (cypher[i] - 'A')) + 'A'); } else { textArr[j] = (char)(((textArr[j] - 'A') ^ (cypher[i] - 'A')) + 'A'); } if (j == textArr.Length - 1) { j = -1; overlapped = true; } } for (int i = 0; i < textArr.Length; i++) { result.Append(textArr[i]); } } return result.ToString(); } public static string Encode(string text) // JUST FOR CHECK { StringBuilder result = new StringBuilder(); int counter = 1; for (int i = 0; i < text.Length - 1; i++) { if (text[i] == text[i + 1]) { counter++; } else { if (counter > (counter.ToString()).Length + 1) { result.Append(counter.ToString()); result.Append(text[i]); } else { for (int ki = 0; ki < counter; ki++) { result.Append(text[i]); } } counter = 1; } if (i == text.Length - 2 && counter != 1) { if (counter > (counter.ToString()).Length + 1) { result.Append(counter.ToString()); result.Append(text[i]); } else { for (int ki = 0; ki < counter; ki++) { result.Append(text[i]); } } } } if (text[text.Length - 1] != text[text.Length - 2]) { result.Append(text[text.Length - 1]); } return result.ToString(); } }



Отговори



1
На пръв поглед виждам две грешки в Decode. По условие се прави такова кодиране за някой символ само, ако кодираната поредица е по-къса от оригиналната. Така например 2a не трябва да се разкодира като aa, а като aa. Втората грешка в този метод ти е, че не допускаш възможността за това числото пред символа да е повече от един символ. Така например 10a ще ти се разкодира като 0a. Пробвай ге тези неща. Аз сега не мога да ги пробвам тук.

от ShwangShwing (344 точки)


0

Здравей, колега. Разгледах твоя код, пробвах го за да видя дали имаше същите грешки като мен, но ние с теб малко по различен начин сме решавали тази задача. Ще ти оставя моето решение, дано да ти помогне.

using System; namespace decodeAndDecrypt { class Program { static string GetCypherLength(string cypherText) { string cypherLength = ""; for (int i = cypherText.Length - 1; Char.IsDigit(cypherText[i]); i--) { cypherLength = cypherText[i] + cypherLength; } return cypherLength; } static string Decode(string cypherText, string cypherLength) { string decoded = ""; var textAndCypher = cypherText.Substring(0, cypherText.Length - cypherLength.Length); string num = ""; for (int i = 0; i < textAndCypher.Length; i++) { if (Char.IsDigit(textAndCypher[i])) { num += textAndCypher[i]; } if (num == "") { num = "1"; } if (!Char.IsDigit(textAndCypher[i])) { decoded += new string(textAndCypher[i], int.Parse(num)); num = ""; } } return decoded; } static string[] GetMessageAndCypher(string decoded, int cypherLength) { string message = decoded.Substring(0, decoded.Length - cypherLength); string cypher = decoded.Substring(decoded.Length - cypherLength); string[] mesNCypher = { message, cypher }; return mesNCypher; } static string Decrypt(string message, string cypher) { string encrypted = string.Empty; string code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`"; if (message.Length >= cypher.Length) { for (int i = 0, j = 0; i < message.Length; i++, j++) { if (j >= cypher.Length) { j = 0; } encrypted += (char)((code.IndexOf(message[i]) ^ (code.IndexOf(cypher[j]))) + 65); } } if (message.Length < cypher.Length) { for (int i = 0; i < message.Length; i++) { int j = i + message.Length; if (j < cypher.Length) { encrypted += (char)(((code.IndexOf(message[i]) ^ code.IndexOf(cypher[i]))^ code.IndexOf(cypher[j])) + 65); } else { encrypted += (char)((code.IndexOf(message[i]) ^ code.IndexOf(cypher[i])) + 65); } } } return encrypted; } static void Main() { string input = Console.ReadLine(); string cypherLength = GetCypherLength(input); string decoded = Decode(input, cypherLength); string[] msgAndCypher = GetMessageAndCypher(decoded, int.Parse(cypherLength)); string encrypted = Decrypt(msgAndCypher[0], msgAndCypher[1]); Console.WriteLine(encrypted); } } }


от Procelius (70 точки)