Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 23.04.2004, 20:25   #1
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default И еще задача

На этот раз предлагаю следующую:
дано: std::string с каким - либо содержанием
надо: убрать все ведущие и конечные пробелы, а в середине слова оставить только единичные.
Пример:
" хелло ворлд йо! "
будет:
"хелло ворлд йо!".
Решение желательно короче - чем короче тем лучше
Reply With Quote
Old 24.04.2004, 08:47   #2
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Code:
string::size_type pos = s.find_last_not_of(' ');

if(pos != string::npos)
 s.erase(pos + 1);

pos = s.find_first_not_of(' ');
if(pos != string::npos)
 s.erase(0, pos);

for(string::iterator it = s.begin(); (it = adjacent_find(it, s.end())) != s.end(); s.erase(it));

Last edited by Aram Hambardzumyan; 24.04.2004 at 08:57.
Reply With Quote
Old 24.04.2004, 09:55   #3
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Code:
s.erase(find_if(s.rbegin(), s.rend(), bind1st(not_equal_to<char>(), ' ')).base(), s.rbegin().base());
s.erase(s.begin(), find_if(s.begin(), s.end(), bind1st(not_equal_to<char>(), ' ')));

for(string::iterator it = s.begin(); (it = adjacent_find(it, s.end())) != s.end(); s.erase(it));
ужас!
Reply With Quote
Old 24.04.2004, 10:26   #4
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Quote:
Originally Posted by Aram Hambardzumyan
Code:
string::size_type pos = s.find_last_not_of(' ');

if(pos != string::npos)
 s.erase(pos + 1);

pos = s.find_first_not_of(' ');
if(pos != string::npos)
 s.erase(0, pos);

for(string::iterator it = s.begin(); (it = adjacent_find(it, s.end())) != s.end(); s.erase(it));
Этот вариант, как и следующий не работают, так как adjacent_find вернет тебе правильный итератор в слове aardvark, что уберет одну букву а, что явно нам не желательно.
Reply With Quote
Old 24.04.2004, 10:29   #5
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Кроме того, что является моей ошибкой в постановке задачи, символы перевода на новую строку, табуляция и прочие тоже считаем за пробелы
Reply With Quote
Old 24.04.2004, 10:34   #6
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

У меня 2 решения одно в лоб и длинное, другое с стиле STL и короткое:
PHP Code:
struct PAreBothSpaces //: public std::binary_function<char, char, bool>
{
    
inline bool operator()(const char c1, const char c2) const {
        return 
isspace(c1) && isspace(c2);
    }
};

void remove_redundant_spaces(std::string s) {
    
s.erase(std::unique(s.begin(), s.end(), PAreBothSpaces()), s.end());
    if (
s.size() && isspace(*s.rbegin()))
        
s.resize(s.length() - 1);
    if (
s.size() && isspace(*s.begin()))
        
s.erase(s.begin());

Reply With Quote
Old 25.04.2004, 17:16   #7
....
 
JennyWren's Avatar
 
Join Date: 04 2004
Location: Across the Universe
Age: 34
Posts: 2,497
Downloads: 1
Uploads: 0
Reputation: 53 | 3
Default

ne takaya uzh trudnaya zadacha
xotay naprimer na java budet polegche chem na C++
Reply With Quote
Old 26.04.2004, 06:24   #8
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

А кто-то говорил, что она сложна?
В QT есть встроеная фунцкия в QString, которая делает это (Сам не видел, с QT не работал, но знающие люди говорили).
Reply With Quote
Old 26.04.2004, 09:33   #9
....
 
JennyWren's Avatar
 
Join Date: 04 2004
Location: Across the Universe
Age: 34
Posts: 2,497
Downloads: 1
Uploads: 0
Reputation: 53 | 3
Default

pro QTString ya tozhe ne slishala !
no i bez etogo mozhno oboitis'
Reply With Quote
Old 26.04.2004, 09:57   #10
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

скорость кода - прежде всего.
Reply With Quote
Old 26.04.2004, 12:16   #11
....
 
JennyWren's Avatar
 
Join Date: 04 2004
Location: Across the Universe
Age: 34
Posts: 2,497
Downloads: 1
Uploads: 0
Reputation: 53 | 3
Default

soglasna !
Reply With Quote
Old 26.04.2004, 13:58   #12
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Скорость кода химера.
Premature Optimization is Evil D.E.Knuth.
Пока с профайлером не посидел и не увидел, где медленно и что медленно - надо работать по принципу "самая простая вещь, которая сработает", а все остальное делается потом.
Reply With Quote
Old 26.04.2004, 14:23   #13
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Скорость кода химера.
Premature Optimization is Evil D.E.Knuth.
Пока с профайлером не посидел и не увидел, где медленно и что медленно - надо работать по принципу "самая простая вещь, которая сработает", а все остальное делается потом.
при этом лучше все-таки постараться, чтобы первая сработавшая вещь была уже достаточно быстрой без профайлера - избегание лишних копирований, повторных инициализаций, плохого дизайна...
Reply With Quote
Old 26.04.2004, 15:32   #14
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Плохая архитектура не имеет никакого отношения к явному кодированиюб это о дизайне.
Присутствие остальных пунктов в твоем перечислении говорит о некачественном кодировании и кривых руках программиста, и имеет мало отношения к технологии - в данном случае C++ Standard Library и алгоритму - в данном случае удаление повторяющихся пробелов.
Мое скрoмное ИМХО (C) утверждает, что STTWW срабатывает в большинстве случаев, если ручки не кривые.
Я думаю, что короткий и понятный код в несколько раз лучше чем запутанный сложный код с goto, который делает все на 50мс быстрее. Простой код - легче отлаживать и быстрее написать. Ведь основаная проблема в написание софта это опоздание от графика (e.g. Mythical Man-Month), а простой код пишется и сдается пользователю гораздп быстрее.
Вот... что-то я разговорился
Reply With Quote
Old 26.04.2004, 16:15   #15
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Присутствие остальных пунктов в твоем перечислении говорит о некачественном кодировании и кривых руках программиста, и имеет мало отношения к технологии - в данном случае C++ Standard Library и алгоритму - в данном случае удаление повторяющихся пробелов.
если говорить только об этом примере, то да. просто я писал вообще. и конечно не призывал лезть из кожи и искать лазейки в обход stl

хотя, если программист опытный, то он и в общем случае с первого раза скодирует правильно и 'локально-оптимально' наверное ты это подразумевал, когда говорил о первой вещи, которая сработает.

кстати, а что за зверь STTWW ?
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 07:23.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.