Форум программистов, компьютерный форум CyberForum.ru

Проверка задачи. - C++

Восстановить пароль Регистрация
 
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
30.01.2012, 23:49     Проверка задачи. #1
вечер добрый.
решал тут задачу, был уверен в решении, получил 30/100 баллов.

у кого будет время, посмотрите пожалуйста, и дайте пример, где она будет валится, у меня не получилось.
Задача B. Сокращение ссылок. - http://neerc.ifmo.ru/school/io/archi...l-20120129.pdf

C++
1
2
3
4
5
6
7
8
9
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
#include <fstream>
#include <string>
#include <cctype>
 
int main() {
    std::ifstream ifs("twi.in");
    std::ofstream ofs("twi.out");
    const std::string link = "http://",
                      pat = "...";
    std::string str;
    int size;
    bool flag;
    ifs >> size;
    ifs.ignore(1, '/n');
    std::getline(ifs, str);
    if (size >= str.size()) {
        ofs << str << std::endl << "0";
        return 0;
    }
    int reduce = str.size() - size;
    int cnt, temp, idx = 0;
    while ((idx = str.find(link, idx)) != std::string::npos) {
        flag = true;
        if (!reduce)
            break;
        cnt = 0;
        while (str[idx] != ' ' && idx < str.size()) {
            if (!std::isalpha(str[idx]) && !std::isdigit(str[idx]) &&
                str[idx] != '/' && str[idx] != ':' && str[idx] != '.')
                flag = false;
            ++cnt, ++idx;
        }
        if (!flag)
            continue;
        temp = cnt - (cnt - reduce) + pat.size();
        if (temp > cnt)
            temp = cnt;
        str.erase(idx - temp, temp);
        str.insert (idx - temp, pat);
        idx -= temp - pat.size();
        reduce -= temp - pat.size();
    }
    ofs << str << std::endl << reduce;
    ifs.close();
    ofs.close();
    return 0;
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 23:49     Проверка задачи.
Посмотрите здесь:

C++ Проверка!
проверка C++
Проверка с if C++
проверка на цифру C++
C++ Проверка if
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Serejke_qq
31.01.2012, 00:57
  #2

Не по теме:

не грузит задание. Выписали бы его сюда.

I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
31.01.2012, 02:33     Проверка задачи. #3
Как-то странно. Наверное, вы выложили не финальную версию кода, потому что у меня программа вылетает при первых попавшихся значениях.
Брал
std::string str = " http://hello text http://hi.hi";
int size = 20;

Добавлено через 1 час 21 минуту
У меня получилось что-то подобное:
C++
1
2
3
4
5
6
7
8
9
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
#include <iostream>
#include <string>
 
void main() 
{
    std::string str = "This link is not valid [url]http://iojury@gmail.com[/url] but this one is valid http://godzilla";
    int size = 81;
 
    const std::string http = "http://", pat = "...";
    
    if (size >= str.size()) 
    {
        std::cout << str << std::endl << "0";
        return;
    }
 
    int reduce = str.size() - size;
    
    int found = 0;
    while ((found = str.find(http, found)) != std::string::npos) 
    {
        if(found && str[found-1]!=' ' && str[found-1]!='\n')continue;
 
        int end = found+http.size();
        while(end < str.size() && ((str[end]>='a' && str[end]<='z') || (str[end]>='.' && str[end]<=':')))++end;
 
        if(end!=str.size() && str[end]!=' ' && str[end]!='\n')
        {
            found = end;
            continue;
        }
 
        if(end-found >= reduce+3)
        {
            str.replace(end-reduce-3,reduce+3,pat);
            break;
        }
        str.replace(found,end-found,pat);
        reduce = reduce - (end-found)+3;
        found += 3;
    }
    std::cout << str << std::endl << str.size()-size << std::endl;
    system("pause");
    return;
}
Само собой, нужно подогнать ввод/вывод под требования задачи

Upd: теги [url] форум вставляет в код автоматически и убрать их не получается
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
31.01.2012, 08:38     Проверка задачи. #4
neske, Для Вас контрпример:
67
Visit hhttp://olimpiads.ru/zaoch/ and hhttp://acmp.timus.ru --- it,s interesting.
и небольшая цитата из условия задачи:
Перед ссылкой также идет либо пробел, либо начало строки.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
31.01.2012, 12:46     Проверка задачи. #5
C++
1
2
3
4
5
6
7
8
9
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/////////////////////////////////////////////////////////////////////////////////////////
//ФОРМАТ ВХОДНОГО ФАЙЛА
//В первой строке входного файша дано одно число l (2 <= l <= 10000) -
//ограничение на размер сообщения. Вторая строка содержит текст сообщения s. 
//Строка не пустая, содержит не более 10000 символов и заканчивается переводом строки, 
//который не входит в текст сообщения. Гарантируется, что в строке есть хотя бы одна 
//ссылка.
//
//ФОРМАТ ВЫХОДНОГО ФАЙЛА
//В первой строке выходного файла выведите сжатый текст. Во второй строке выведите "0",
//если сокращенное сообщение умещается в ограничение на длину сообщений. Иначе 
//выведите количество символов, на которое превышено ограничение на размер сообщения.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <deque>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef T_str::size_type    T_pos;
typedef std::deque<T_str>   T_words;
/////////////////////////////////////////////////////////////////////////////////////////
void  get_links
    (
        const T_str&    message,
        T_words&        links
    )
{
    const T_str         LINK_HED   =   "http://";
    std::istringstream  ssin(message);
    T_str   cur_word;
    while(ssin >> cur_word)
    {
        if(cur_word.find(LINK_HED) == 0)
        {
            links.push_back(cur_word);
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  reduce_link
    (
        int         size_surplus,
        T_str&      message,
        T_words&    links
    )
{
    const T_str     ELLIPSIS    =   "...";    
 
    int             pref_len        
        =   std::max
                (
                    0,
                        int( links.front().size() ) 
                    -   size_surplus 
                    -   int( ELLIPSIS.size() )
                );
 
    T_pos           link_pos    =   message.find( links.front() );
 
    message.replace
        (
            link_pos + pref_len,
            links.front().size() - pref_len,
            ELLIPSIS
        );
    links.pop_front();
}
/////////////////////////////////////////////////////////////////////////////////////////
void  reduce_links
        (
            int         message_size_max,
            T_str&      message,
            T_words&    links,
            int&        size_surplus
        )
{
    const int   SIZE_SURPLUS_MIN    =   0;
 
    while(
                    (
                        size_surplus    
                            =   std::max
                                    (
                                        SIZE_SURPLUS_MIN, 
                                            int( message.size() ) 
                                        -   message_size_max
                                    )
                    )
 
                >   SIZE_SURPLUS_MIN
 
            &&  !links.empty()
         )
    {
        reduce_link
            (
                size_surplus,
                message,
                links
            );
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    const T_str     IFILE_NAME          = "i.txt";
    const T_str     OFILE_NAME          = "o.txt";
 
    std::ifstream   ifile( IFILE_NAME.c_str() );
 
    int             message_size_max    = 0;
    ifile >> message_size_max;
    ifile.ignore();
 
    std::cout   << "message_size_max = "
                << message_size_max
                << std::endl;
 
    T_str   message;
    getline(ifile, message);
 
    std::cout   << "message = "
                << message
                << std::endl;
 
    T_words  links;
 
    get_links
        (
            message,
            links
        );
 
    int     size_surplus = 0;
 
    reduce_links
        (
            message_size_max,
            message,
            links,
            size_surplus
        );
 
    std::ofstream   ofile( OFILE_NAME.c_str() );
    ofile       << message
                << std::endl
                << size_surplus
                << std::endl;
 
    std::cout   << message
                << std::endl
                << size_surplus
                << std::endl;
}
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
31.01.2012, 15:32  [ТС]     Проверка задачи. #6
Цитата Сообщение от I.M. Посмотреть сообщение
Брал
std::string str = " http://hello text http://hi.hi";
int size = 20;
out -
... text http://h...
0
вроде все правильно.

valeriikozlov, забыл добавить, там делали объявления -
12:39 В задаче Сокращение ссылок правильный ответ на четвертый тест из условия:This link is not valid http://iojury@gmail.com but this one is valid http://go...0
13:26 В задаче Сокращение ссылок текст сообщения всегда представляет собой одну строку. В примерах из условия текст перенесен для того чтобы помещаться на лист.
67
Visit hhttp://olimpiads.ru/zaoch/ and hhttp://acmp.timus.ru --- it,s interesting.
out -
Visit hhttp://ol... and hhttp://acmp.timus.ru --- it,s interesting.
0
Добавлено через 8 минут
аа, перед ссылкой не может другого символа быть, вон оно что, тьфу) спасибо
Yandex
Объявления
31.01.2012, 15:32     Проверка задачи.
Ответ Создать тему
Опции темы

Текущее время: 06:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru