- 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;
}
USB 05.03.2014 23:24 # 0
Мне не нравится, что он намутил в
Красиво, но на читабильность наплювал. За это я думаю его не брать. В ответ он спросил а как бы ты это сделал? Я помялся. Так что стоило ему ответить?
bormand 06.03.2014 05:31 # +3
> хаскеля
О_о
bormand 06.03.2014 06:25 # +2
Ну разве что в генерации мапа муть какая-то, и называть тип otc совсем не айс. Вектор вместо стека еще смущает. Остальное вполне читаемо.
P.S. Что прога на хаскеле, что прога на крестах не обрабатывают другие символы, помимо скобок. Это нормально?
wvxvw 06.03.2014 10:23 # +2
roman-kashitsyn 06.03.2014 07:16 # +4
Может, так:
?
TarasB 06.03.2014 10:02 # +2
wvxvw 06.03.2014 10:24 # +2
Psionic 06.03.2014 14:19 # +1
roman-kashitsyn 06.03.2014 07:19 # +4
Дожили: люди знаю хачкель, но не знают, что проверять сбалансированность скобок надо с помощью стека.
bormand 06.03.2014 07:37 # +2
Знают: Просто не тот контейнер юзают.
roman-kashitsyn 06.03.2014 08:39 # +2
USB 06.03.2014 08:43 # 0
roman-kashitsyn 06.03.2014 10:22 # +1
USB 06.03.2014 10:58 # −1
roman-kashitsyn 06.03.2014 11:09 # 0
да, там автор кода в топике всё правильно сделал, это я затупил.
В общем, в действительности из претензий только неуместный тяжеловесный map и чрезмерное умничанье с transform.
1024-- 06.03.2014 12:58 # 0
roman-kashitsyn 06.03.2014 13:14 # +5
roman-kashitsyn 06.03.2014 11:03 # +1
USB 06.03.2014 11:07 # −1
roman-kashitsyn 06.03.2014 11:13 # +1
В сишечке нет нормального стека из коробки, кратко врядли получится. Разве что ради ржаки держать стейт в сегменте стека, надеясь, что глубина вложенности скобок не будет слишком большой.
roman-kashitsyn 06.03.2014 11:41 # +5
chtulhu 06.03.2014 11:55 # +4
roman-kashitsyn 06.03.2014 12:25 # +3
wvxvw 06.03.2014 16:22 # +2
wvxvw 06.03.2014 16:53 # +5
Даже так, если хочется удавиться за каждую строчку.
roman-kashitsyn 06.03.2014 17:13 # +3
Stertor 06.03.2014 17:13 # −1
guest 07.03.2014 11:03 # −2
Dummy00001 06.03.2014 14:38 # +1
использование вектора вместо стека как по мне это признак того что у чудака уже есть практический опыт работы.
wvxvw 06.03.2014 09:55 # +1
О, давно не было специальных олимпиад!
John386 06.03.2014 11:47 # −5
http://ideone.com/bYmhC8
roman-kashitsyn 06.03.2014 11:49 # +3
John386 06.03.2014 11:50 # +1
John386 06.03.2014 12:33 # −2
roman-kashitsyn 06.03.2014 12:43 # +3
> is_balanced(std::string s)
> string("(){}[]").find(ch)
с++ ведь не ваш основной язык программирования?
John386 06.03.2014 12:48 # +1
А как было бы правильно, и в чем косяки? если вас не затруднит ответить, конечно же)
roman-kashitsyn 06.03.2014 12:54 # +1
2. Передача строки по значению сомнительна, копия тут ни к чему. Тут лучше передавать константную ссылку.
3. string("(){}[]") в теории может приводить к аллокации новой временной строки на каждой итерации цикла.
Мне ещё непонятно, зачем мы пихаем в стек закрывающие скобки, встретившиеся перед открывающими. Поскольку operator[] создаёт запись в таблице при передаче отсутствующего ключа, подозреваю, что у меня получится подобрать к коду контрпример.
roman-kashitsyn 06.03.2014 13:08 # 0
John386 06.03.2014 13:38 # 0
Спасибо за ликбез - буду совершенствоваться :)
Saehrimnir 28.10.2020 20:37 # 0
absolut 06.03.2014 13:41 # −1
roman-kashitsyn 06.03.2014 14:00 # +4
absolut 06.03.2014 14:30 # −1
USB 06.03.2014 15:08 # +1
absolut 06.03.2014 15:17 # +1
нужен домен .sru
defecate-plusplus 06.03.2014 16:46 # +4
absolut 06.03.2014 21:33 # 0
USB 06.03.2014 15:11 # −1
Psionic 06.03.2014 18:38 # 0
Abbath 06.03.2014 21:20 # 0
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
)
Abbath 06.03.2014 22:07 # 0
wvxvw 07.03.2014 00:45 # 0
wvxvw 07.03.2014 02:02 # 0
Но дальше чет не придумывается. :)
wvxvw 07.03.2014 10:52 # −1
Вернее, так.
Теперь нужна только функция выбирающая из списка Х элементы там, где в списке У единицы, и задача решена.
Abbath 07.03.2014 13:47 # −1
Abbath 07.03.2014 13:54 # −1
Пилите, интересно увидеть
wvxvw 07.03.2014 13:59 # −1
USB 07.03.2014 22:43 # +1
Abbath 07.03.2014 14:11 # −1
gost 15.03.2014 19:08 # +2
Abbath 15.03.2014 19:38 # 0
USB 06.03.2014 23:23 # −1
roman-kashitsyn 07.03.2014 14:04 # +3