- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>
#include <iomanip>
using namespace std;
vector<string> bracesExpressionExamples = {
"({[{}]{}[]})",
"({}}{[{}]{}[]})",
"({[{}]{}[]}",
"({[{}]{}]})",
"({[{}{}[]})",
"",
"{}"
};
string openBrace = "({[";
string closeBrace = ")}]";
typedef map<char, char> otc;
const otc& openToCloseBrace(){
static const otc o2c([](){
otc o2c;
transform(
openBrace.begin(), openBrace.end(),
closeBrace.begin(),
inserter(o2c, o2c.begin()),
[](const char open, const char close){return make_pair(open, close);}
);
return o2c;
}());
return o2c;
}
bool checkBraces (const string& e){
vector<char> s;
for(const char b: e)
if(string::npos!=openBrace.find(b))
s.push_back(openToCloseBrace().at(b));
else if(string::npos!=closeBrace.find(b) && (!s.empty()) && b==s.back())
s.pop_back();
else return false;
return s.empty();
}
int main() {
cout<<boolalpha;
transform(
bracesExpressionExamples.begin(),
bracesExpressionExamples.end(),
ostream_iterator<bool>(cout, "\n"),
checkBraces);
return 0;
}
Мне не нравится, что он намутил в
Красиво, но на читабильность наплювал. За это я думаю его не брать. В ответ он спросил а как бы ты это сделал? Я помялся. Так что стоило ему ответить?
> хаскеля
О_о
Ну разве что в генерации мапа муть какая-то, и называть тип otc совсем не айс. Вектор вместо стека еще смущает. Остальное вполне читаемо.
P.S. Что прога на хаскеле, что прога на крестах не обрабатывают другие символы, помимо скобок. Это нормально?
Может, так:
?
Дожили: люди знаю хачкель, но не знают, что проверять сбалансированность скобок надо с помощью стека.
Знают: Просто не тот контейнер юзают.
да, там автор кода в топике всё правильно сделал, это я затупил.
В общем, в действительности из претензий только неуместный тяжеловесный map и чрезмерное умничанье с transform.
В сишечке нет нормального стека из коробки, кратко врядли получится. Разве что ради ржаки держать стейт в сегменте стека, надеясь, что глубина вложенности скобок не будет слишком большой.
Даже так, если хочется удавиться за каждую строчку.
использование вектора вместо стека как по мне это признак того что у чудака уже есть практический опыт работы.
О, давно не было специальных олимпиад!
http://ideone.com/bYmhC8
> is_balanced(std::string s)
> string("(){}[]").find(ch)
с++ ведь не ваш основной язык программирования?
А как было бы правильно, и в чем косяки? если вас не затруднит ответить, конечно же)
2. Передача строки по значению сомнительна, копия тут ни к чему. Тут лучше передавать константную ссылку.
3. string("(){}[]") в теории может приводить к аллокации новой временной строки на каждой итерации цикла.
Мне ещё непонятно, зачем мы пихаем в стек закрывающие скобки, встретившиеся перед открывающими. Поскольку operator[] создаёт запись в таблице при передаче отсутствующего ключа, подозреваю, что у меня получится подобрать к коду контрпример.
Спасибо за ликбез - буду совершенствоваться :)
нужен домен .sru
a=:>;:y NB.'(([{}{}[]]))'
b=:|:(6 12) $,'(){}[]'=/a
b=:(-1 3 5{"(1)b) (1 3 5)}"(1)b
c1=:+/1 0{|:b
c2=:+/3 2{|:b
c3=:+/5 4{|:b
c=:c1,.c2,.c3
no =:_1
n =:#c
while. n~:no do.
no=:n
d=:~.(I.*./"(1)(1 _1)="(1)(2+\(0{|:c))),(I.*./"(1)(1 _1)="(1)(2+\(1{|:c))),(I.*./"(1)(1 _1)="(1)(2+\(2{|:c)))
c=:((i.#c)-.(d,>:d)){c
n=:#c
end.
n=0
)
Но дальше чет не придумывается. :)
Вернее, так.
Теперь нужна только функция выбирающая из списка Х элементы там, где в списке У единицы, и задача решена.
Пилите, интересно увидеть