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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
#1

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

30.01.2012, 23:49. Просмотров 622. Ответов 5
Метки нет (Все метки)

вечер добрый.
решал тут задачу, был уверен в решении, получил 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;
}
Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 23:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка задачи. (C++):

Проверка задачи - C++
просто пока нет программы, пришлось в ручную,боюсь ошибок много допустила. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Visual C++ проверка ввода на число, проверка на кирилицу - C++
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. Этот код проверяет на буквы и знаки,...

Проверка задачи - Prolog
Дано задание:Реализовать вывод решения с прямой (обратной) цепочкой рассуждений для следующей для схемы классификации объектов: ...

Проверка Логической задачи - Логика и множества
Ув. форумчане, можете проверить, правильно ли я решил данную задачу: Если я поеду автобусом (А), а автобус опоздает (В), то я пропущу...

Проверка на существование Задачи - 1С
Подскажите пожалуйста, как можно проверить существует ли уже эта задача, перед записью новой

Проверка решения задачи - Геометрия
Я в нужном направлении, или совсем не то сделал =) ? Даны вершины треугольника A (-1,-2,4), B (-4,-2,0), C (3,2,1). Найти длину...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Serejke_qq
31.01.2012, 00:57
  #2

Не по теме:

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

0
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] форум вставляет в код автоматически и убрать их не получается
1
valeriikozlov
Эксперт C++
4670 / 2496 / 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.
и небольшая цитата из условия задачи:
Перед ссылкой также идет либо пробел, либо начало строки.
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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;
}
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
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 минут
аа, перед ссылкой не может другого символа быть, вон оно что, тьфу) спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2012, 15:32
Привет! Вот еще темы с ответами:

Проверка задачи начинающего программиста - Free Pascal
Сколько из данных чисел больше среднего арифметического. program zad3; uses crt; var a,b,c,n,s,m1,m2,m3:integer; begin clrscr; ...

Проверка решения краевой задачи - Matlab
Задание: 1. Составить решение краевой задачи: y’’-y’+2y/x=x+0.4 , y’(1.4)=4 , y(1.1)-0.5*y’(1.1)=2 методом Ньютона c точностями...

Автоматическая проверка решения задачи на Pascal - Delphi
Программа компилирует Pascal код, необходимо подставить под него несколько in.txt и out.txt файлов (тестов) и узнать сколько из них...

Проверка решении задачи по случайным величинам - Теория вероятностей
Здравствуйте! Проверьте пожалуйста мое решение задачи. Прошу прощения за низкое качество картинки.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.01.2012, 15:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru