Loading...

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

alexandar_zhelev avatar alexandar_zhelev 1 Точки

Problem 2 - Mathematical Expression

Привет на всички,

Относно втората задача " Mathematical Expression", накратко в условието е казано да използваме функция която проверява дали всяка скоба има своята обратна, обаче нямам идея как трябва да изглежда самата функция. След дълго ровене из нета в търсене на решение, в повечето случеи се използват стекове, а другия вариант който открих е да цепим стринга и да пазим бройка за всяка скоба да има обратна, но отново нямам идея как да го осъществя като код, защото нищо не схаванах от кода на другите. Пробвах се да хардкодна, макар че ми беше ясно, че няма да взема пълните точки в Judge, но все пак ми даде 60/100. 

Тагове:
0
C++ Fundamentals
krstoilo avatar krstoilo 3 Точки

Аз използвах стек, въпреки че това е материал от следващата лекция...
Стори ми се най-просто.

Ако искаш, ще ти пратя paste на кода. :)

0
alexandar_zhelev avatar alexandar_zhelev 1 Точки

Добре, няма да откажа :D, а в Judge всички точки ли си взе?

0
AlexanderHr avatar AlexanderHr 18 Точки

Какво правя с живота си xD? Два часа пиша решение за различна задача. Anyway, ето решения за problem 4 - brackets

Ето ти най-малкият код, който върви на тази задача.

#include <stdio.h>
main(){
char e[2]{2};
while((e[1]=getchar())!=10)
    if(e[1]=='('||e[1]=='['||e[1]=='{')e[(*e)++]=e[1];
    else if(e[1]-e[--(*e)]>2)*e=0;
puts(*e==2?"valid":"invalid");
}

Ако някой може да измисли по-малък, плс да ми пише, че сега съм инвестиран.

EDIT:

I've peaked

#include<stdio.h>
main(){
char e[2]{2};
while((e[1]=getchar())!=10)
    if(0x01^e[1]&0b11)e[(*e)++]=e[1];
    else if(e[1]-e[--(*e)]>2)*e=0;
puts(*e==2?"valid":"invalid");
}

It might fry the judge since it's writing on memory which is not delegated to the exe, but I doubt it.

0
06/10/2019 23:58:25
dmartinov avatar dmartinov 37 Точки

Макар, да е в страни от темата, би ли хръвлил малко разяснения върху този синтаксис, тъй като изглежда малко по-advanced от това, което сме учили до момента. Горе долу си обясних как са нещата, но не бих отказал малко допълнителни обяснения :)

Иначе го пробвах и наистина работи :)

1
AlexanderHr avatar AlexanderHr 18 Точки
char e[2]{2};

- инициализира масив от charove с първи елемент равен на 2

while((e[1]=getchar())!=10)

- чети по един чар докато не стигнеш до нов ред, запиши прочетения чар в e[1]

if(0x01^e[1]&0b11)

- aко e[1] НЕ завършва на 01 в бинарния си запис, значи е отваряща скоба

e[(*e)++]=e[1];

- Използваме първия елемент на масива е като брояч, който го инициализирахме с 2. Записваме прочетения char в поредния елемент от масива, като нашият брояч ни казва индекса на елемента. Заедно с тази операция ние увеличаваме брояча.

else if(e[1]-e[--(*e)]>2)*e=0;

 - Ако не е отваряща скоба => гледаме дали последната отваряща е с максимум 2 по-малка от сегашната затваряща. Ако не е => имаме размешкани скоби и нулираме брояча, което прави следващия char да се запише в самият брояч. Това кара програмата да прескочи няколко индекса и следователно всяка следваща операция ще е грешна, което ще накара следващата проверка да каже че expressiona e грешен. Заедно с тази проверка ние намаляваме брояча.

puts(*e==2?"valid":"invalid");

- puts: печата даден стринг. Ако всяка скоба е била затворена И скобите не са били размешкани, то брояча трябва да се озове обратно със стойност 2. => тогава печатаме че expression-a е валиден. Иначе невалиден.

1
dmartinov avatar dmartinov 37 Точки

Мега добро обяснение! Благодаря за което!

Това е най-най-краткото решение на задачата, което съм виждал до момента.

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