Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

t.316 avatar t.316 137 Точки

[Exam Problems] C# Basics - Problem{5} - Bit Builder

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

Може ли някой да ми каже, защо това решение ми дава само 10 точки в Judge и как да го направя да работи коректно?

http://pastebin.com/FK1MvyrU

При примерните данни от условието работи коректно.

Видях авторското решение и знам, че задачата може да се реши по друг начин, но искам да знам как може да се направи и така.

Ето и линк към Judge:

https://judge.softuni.bg/Contests/Practice/Index/36#4

Тагове:
1
Programming Basics
KatyaMarincheva avatar KatyaMarincheva 572 Точки
Best Answer

Здравей Тодоре,

Докарах ти  решението до 100 точки, но имам още малко работа по него. Самото ти решение е много интересно, и честно казано аз самата съм решавала тази задача само със стринг, твоето решение е много добро като план.

Първото, което промених беше проверката за quit:

        while (true)
        {
            string input = Console.ReadLine();
            int position;
            if (input != "quit")
            {
                position = int.Parse(input);
            }
            else
            {
                break;
            }

            string command = Console.ReadLine();

И с това от 10, точките станаха 20.

Второто беше: flip командата, този код:result = ~(1 << position) & result; ти нулираше единички, но ако там има нула и искаш тя да стане единичка - това не се получаваше. Смених го на result = (1 << position) ^ result; и решението даде 70 точки.

Последните 30 точки ги получих като смених твоя код за командата "insert", с insert метода от авторското решение - т.е. има нещо неточно в "insert" кода ти, но още търся какво. Например дава разни отрицателни числа на output, когато judge очаква положителни.

Иначе - поздравления за подхода! Много интелигентно замислено, и с малко доизглаждане - както виждаш даде 100 точки :)

ЕДИТ: оказва се че и insert метода ти си е супер, имал е съвсем дребна грешка:

 това  long mask = 1 << position; трябва да се промени така:  long mask = (long)1 << position;

Иначе по подразбиране 1 е int, и 1 << position си става отрицателно още преди да се присвои на long mask.

С това последно уточнение решението ти дава 100 точки в judge със съвсем собствени методи :)

0
18/06/2015 16:07:04
t.316 avatar t.316 137 Точки

Благодаря Катя!

Много се радвам, че се получава и така задачата.

1
18/06/2015 16:32:19
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Поздравления за идеята! - иначе дребни уточнения по кода в началото е нормално да се налагат.

-1
t.316 avatar t.316 137 Точки

Много благодаря!

Сега се сетих да попитам дали е разрешено по време на изпита да копирам и използвам част от тази задача (или от някоя друга), която съм решавал и имам на лаптопа си. Примерно, ако част от задачата ми на изпита е да променя бита на дадена позиция да си копирам flip.

 

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

На изпита можеш да копираш всичко отвсякъде - от интернет, от форума, от твои предишни решения, от github repository (твое или такова което използваш за справка) - идеята е, че никой от нас не измисля или създава нов C# синтаксис, ние само интелигентно използваме, в нови ситуации познат код или код производен на този който вече познаваме.

А за конкретното решение - пропуснах да ти кажа, че проверката за quit команда трябва винаги да се прави преди каквото и да било прасване или опит за ползване на input - защото нормално в поне един тест на задача от този тип първата и единствена команда ще ти е quit.

-1
t.316 avatar t.316 137 Точки

За проверката се усетих след като прочетох отговора ти и я корегирах.

Ето го и решението, което дава 100 точки:

http://pastebin.com/drusJuc2

Благодаря отново.

1
18/06/2015 17:53:29
mbeleva88 avatar mbeleva88 69 Точки

Здравейте,

Линка към задачата не е актуален вече, ще може ли да качите пак решението ?

Мерси предварително!

 

0
Innos avatar Innos 419 Точки

Видях какво беше постнал вчера, но нямах време да отговоря. На въпроса проблемите са няколко 1во гърми ти 1 тест с runtime error това е защото не си се подсигурил за възможността в инпута да ти подадат веднага "quit" като 1ва команда, след като си влезеш в цикъла проверяваш, но още първото четене преди цикъла няма проверката. Другите проблеми бяха следните:

не си покрил случайте в който нека да кажем имаме int.max (32 та бита са единици) и ти подадат insert командата тогава ще имаш 33 бита единици, но понеже ползваш int няма как да ги побереш и най-лявата ще се изреже което ще доведе до грешен резултат.
 

Някой неща също за които да се внимава при битовите задачи е bitwise shift операторите << и >>, когато искаш да шифтваш с над 31 позиции левия операнд трябва да е задължително long или ulong и още нещо специфично тъй като забелязах че използваше повече >> шифт. Има специфика че ако числото е отрицателно (sign bit-а му е 1ца) се изпълнява arithmetic shift (ако примерно 31 ти бит е единица и шифтнеш надясно новия бит който ще се появи на 31 позиция ще е 1 вместо 0 за да запази отрицателността на числото), но това са подробности.

Ето едно преработване на решението ти от вчера което направих.

0
kaloyannikov avatar kaloyannikov 531 Точки

http://pastebin.com/psDwkez6

 

къде ми е грешката , дава само 30 не ми е ясно защо става така

0
21/12/2015 21:47:17
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.