Telerik Alpha - C# Mock Exam: Numbers


0

Здравейте,

Имам въпрос за задачата Numbers, която се падна на примерния изпит по C# за Telerik Academy Alpha. Задачата в BGCoder

Това е моето решение. 

// Copy Code Snippet Here namespace _12.NumbersAlpha { using System; using System.Linq; using System.Numerics; public class Program { static void Main(string[] args) { string digit, resultString = ""; string command; BigInteger result; for (int index = 0; index < args.Length - 1;) { command = args[index]; if (command == "end") { break; } switch (command) { case "set": resultString = args[index + 1]; index += 2; break; case "front-add": resultString = args[index + 1] + resultString; index += 2; break; case "front-remove": if (char.IsDigit(resultString.FirstOrDefault())) { resultString = resultString.Substring(1, resultString.Length - 1); } index++; break; case "back-add": digit = args[index + 1]; resultString = resultString + digit; index += 2; break; case "back-remove": if (char.IsDigit(resultString.LastOrDefault())) { resultString = resultString.Remove(resultString.Length - 1); } index++; break; case "reverse": resultString = Reverse(resultString); index++; break; case "print": if (BigInteger.TryParse(resultString, out result)) { Console.WriteLine(resultString); } else { Console.WriteLine(); } index++; break; default: index++; break; } } } public static string Reverse(string s) { char[] charArray = s.ToCharArray(); Array.Reverse(charArray); return new string(charArray); } } }

Решението ми дава правилен отговор само за тестовия вариант, който е даден в описанието на задачата, но в BGcoder ми дава 0 точки.

Въпросите са ми следните:

1.Правилно ли приемам входните данни:

You will receive an array of strings as only parameter of the solve(args) function.

Тука малко се обърках с това обяснение solve(args) и предположиш, че входните данни ще ми бъдат подадени на входния параметър на метода Main, който приема string[] args.


2. Винаги ли се очаква след командите set, fornt-add, back-add да има някаква цифра. Или е възможно да има нещо като set а, front-add b или пък да имаме set команда която след нея да няма цифра, ами направо да следва друга команда, примерно front-add.

3. Другото което видях в примерния тестови сценарии, е че има команда decreacе, но тази команда липсва в описанието на задачата и предположих, че е някаква уловка за това на switch-a му сложих default , като след това има index++, който ме праща вече на следващата команда в масива.



Блгодаря предварително!




Отговори



0

Здравей,

Със сигурност не четеш правилно входа. Най-вероятно подобна задача е дадена и на javascript-a и там входа се подава на функцията.

При C# задачите които съм решавал в BGCoder , винаги се е чел входа от конзолата.

Успех


от ktsvetanov (705 точки)


0

Да, благодаря ти. Разгледах пак внимателно условието и намерих начина да чета входа. Просто тази функция ме обърка в началото.

Ето и го и кода, надявам се на някой да му е от полза, в BGCoder ми дава 95 точки, на последния тест ми дава грешка с времето за изпълнение:

// Copy Code Snippet Here namespace _12.NumbersAlpha { using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; public class Program { static void Main(string[] args) { string digit = ""; string command; string[] splitCommand; BigInteger result; List<string> inputCommandsArray = new List<string>(); StringBuilder outputResult = new StringBuilder(); StringBuilder reversedString; while (true) { string input = Console.ReadLine(); inputCommandsArray.Add(input); if (input == "end") { break; } } for (int index = 0; index < inputCommandsArray.Count; index++) { command = inputCommandsArray[index]; if (char.IsDigit(command.LastOrDefault())) { splitCommand = command.Split(' '); command = splitCommand[0]; digit = splitCommand[1]; } if (command == "end") { break; } switch (command) { case "set": if (outputResult.Length > 0) { outputResult.Clear(); outputResult.Append(digit); } else { outputResult.Append(digit); } break; case "front-add": outputResult.Insert(0, digit); break; case "front-remove": if (char.IsDigit(outputResult.ToString().FirstOrDefault())) { outputResult.Remove(0, 1); } break; case "back-add": outputResult.Append(digit); break; case "back-remove": if (char.IsDigit(outputResult.ToString().LastOrDefault())) { outputResult.Remove(outputResult.Length - 1, 1); } break; case "reverse": reversedString = Reverse(outputResult); outputResult.Clear(); outputResult.Append(reversedString); break; case "print": if (BigInteger.TryParse(outputResult.ToString(), out result)) { Console.WriteLine(outputResult.ToString()); } else { Console.WriteLine(); } break; default: break; } } } public static StringBuilder Reverse(StringBuilder s) { StringBuilder reversedString = new StringBuilder(); for (int index = s.Length - 1; index >= 0; index--) { reversedString.Append(s[index]); } return reversedString; } } }


от Maverick (0 точки)

0

Относно входа, честно казано не мога да разбера защо го пълниш в масив и после го прочиташ, това ти увеличава паметта която ползва програмата :).

Можеш да ползваш нещо подобно

           var line = Console.ReadLine().Split(' ');

            while (line[0] != "end")
            {
                switch (line[0])
                {
                   case .......

                    default:
                        break;
                }
                line = Console.ReadLine().Split(' ');
            }

Успех

от ktsvetanov (705 точки)