Задача от изпита C# Advanced Evening: 01. Secret Numeral System


1

Колеги, тази задача от изпита ми изяде главата. Казвайте как я решихте, че аз повече от 20 точки не можах да докарам ,въпреки отделените срамно количество часове. В един момент осъзнах, че очевидно не разчитам условието правилно, защото дори първия нулев тест, който разписан наръка, според моята логика, не дава искания резултат. Споделям за първия примерен input: vladtosho, peshovlad, toshoharalampi, pesho - според заданието би трябвало да са числата 41, 24, 15, 2 - в седмична бройна система. Преобразувани в десетична, според моите сметки са числата 29, 18, 12, 2. Произведението на седмичните е 29520, а на десетичните е 12528. Нито едно от произведенията не е търсения отговор от 17160. Къде греша?




Отговори



0

Здравей колега,

Като за начало - броичната система е осмична, а не седмична! Пробвай с осмична и ако пак не ти се получават нещата, ще изпратя и моето решение.




1

Ехх... сега още повече ме хвана яд ;)

Благодаря за подсещането.


от grozdanovgg (55 точки)


0

Здрасти,

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


от Itilon (117 точки)


2

Поствам и вече поправеното ми решение за 100 точки, ако е полезно на някой. 

using System; using System.Collections.Generic; using System.Numerics; class Task01 { static List<string> encriptionKeys = new List<string> { "hristo", "tosho", "pesho", "hristofor", "vlad", "haralampi", "zoro", "vladimir" }; static string[] SplitSentenceToWords(string inputSentance) { string[] splitText = inputSentance.Split(new[] { ", " }, StringSplitOptions.None); return splitText; } static BigInteger DivideWordAndReturnNum(string word) { //Declaring variables string newWord = string.Empty; List<int> numbers = new List<int>(); string numbersString = string.Empty; //Some helpful initial numbers int wordLength = word.Length; for (int i = wordLength - 1; i >= 0; i--) { newWord = word.Substring(i); BigInteger keyIndex = encriptionKeys.IndexOf(newWord); if (keyIndex == -1) { continue; } else { numbersString = keyIndex.ToString() + numbersString; word = word.Remove(i); } } BigInteger result = BigInteger.Parse(numbersString); return result; } static List<BigInteger> OctalToDecimal(List<BigInteger> octalNums) { BigInteger result = 0; List<BigInteger> listResults = new List<BigInteger>(); //result = digit + result * 8 for (int j = 0; j < 4; j++) { string temp = octalNums[j].ToString(); for (int i = 0; i < temp.Length; i++) { temp = octalNums[j].ToString(); result = (temp[i] - '0') + result * 8; } listResults.Add(result); result = 0; } return listResults; } static void Main() { //Declare variables var octalNumbersList = new List<BigInteger>(); var decimalNumbersList = new List<BigInteger>(); //Input string[] stickedWords = SplitSentenceToWords(Console.ReadLine()); //Magic // 1. Find numerical value in octal numerical system for the the sticked words foreach (var word in stickedWords) { octalNumbersList.Add(DivideWordAndReturnNum(word)); } // 2. Converting octal list to decimal list decimalNumbersList = OctalToDecimal(octalNumbersList); //Output BigInteger result = 1; foreach (var number in decimalNumbersList) { result *= number; } Console.WriteLine(result); } }


от grozdanovgg (55 точки)


1

това с Replace не бях се сетил!

изглежда красиво


от mitkop (578 точки)


1
Ето го и моето с Regex.Split, ако на някого му е интересно. цък

от grAdi (10 точки)


0

Колеги, не мога да разбера защо не ми работи правилно кода и ще се застрелям вече в крака.

using System; using System.Linq; class Starup { static void Main() { string[] inputArr = Console.ReadLine().Replace("ocaml", "0") .Replace("haskell", "1") .Replace("scala", "2") .Replace("f#", "3") .Replace("rust", "5") .Replace("clojure", "7") .Replace("erlang", "8") .Replace("standardml", "9") .Replace("racket", "10") .Replace("mercury", "12") .Replace("commonlisp", "13") .Replace("scheme", "14") .Replace("curry", "15") .Replace("lisp", "4") .Replace("ml", "6") .Replace("elm", "11").Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries).ToArray(); long sum = 1; for (int i = 0; i < inputArr.Length; i++) { long temp = Convert.ToInt64(inputArr[i], 8); sum *= temp; } } }

P.S. Това е другата 1-ва задачка от сътрешната група.


от olebg (598 точки)


0
Много странен replace - трябва да получиш числа в шестнадесетична система (да направиш същото заместване с 0123456789ABCDEF) и след това да преобразуваш в десетична.

от hankrum (71 точки)

0

колегата е прав - трябва да Replace - неш сама с един символ, но най - просто е да заместваш с шестайстични  цифри,

тоест

вместо 10 - пишеш a,

вместо 11 - пишеш b,

...

вместо 15 - пишеш f,

след това не ти остава нищо друго освен да напишеш ulong.Parse(inputArr[i]) и това ти въвежда първото число. Това е много елегантен подход - видях го от колегата @Nikitoni 

моето решение е по-тъпо, но работи също отлично тук


от mitkop (578 точки)