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

Формула, по которой можно вычислить время наступления Рагнарека - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Neotwalker
21 / 1 / 0
Регистрация: 22.12.2013
Сообщений: 132
22.07.2014, 18:56     Формула, по которой можно вычислить время наступления Рагнарека #1
Рагнарек должен наступить с минуты на минуту. Но Один не знает, когда именно он наступит.
Локи, как самый умный, сказал Одину формулу, по которой можно вычислить время наступления Рагнарека. К сожалению, Одину с одним глазом сложно уследить за всеми скобками в выражении, поэтому он решил заменить скобки первого уровня на фигурные, а второго уровня – на квадратные, остальные же оставить круглыми. То есть выражение x * (y + (z * (5 + 3))) изменится на x * {y + [z * (5 + 3)]}.
Но Один не умеет программировать, Один умеет драться, поэтому программу придется написать вам. Не гневите Одина.
В первой и единственной строке входного файла указана формула, состоящая из букв латинского алфавита, знаков арифметических действий, пробелов, цифр и скобок. Гарантируется, что скобки образуют правильную скобочную последовательность. Длина формулы не превышает 105.
Выведите эту строку в формате удобном для чтения Одину.

Пример ввода 1

x * (y + (z * (5 + 3)))

Пример вывода 1

x * {y + [z * (5 + 3)]}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 18:56     Формула, по которой можно вычислить время наступления Рагнарека
Посмотрите здесь:

C++ можно ли как нибудь ввести своё время в формате HH:MM:SS
В текстовом файле записана формула. Вычислить значение данной формулы C++
C++ Для функции f(x), график которой представлен на рисунке. Вычислить F(a).
Можно ли изменить иконку окна во время выполнения программы? C++
За какое время можно досканально изучить C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3124 / 1350 / 167
Регистрация: 20.02.2013
Сообщений: 3,868
Записей в блоге: 18
22.07.2014, 20:01     Формула, по которой можно вычислить время наступления Рагнарека #2
Вообще-то, Один - Бог мудрости и тайного знания (магии). За эти знания он в своё время и пожертвовал глаз, если мне не изменяет память. И уж кому как не Одину уметь программировать! )))
А драться все асы были не дураки, но особенно в этом отличились Тор и Один, да.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
22.07.2014, 20:58     Формула, по которой можно вычислить время наступления Рагнарека #3
std::string::find + std::string::find_last_of по 2 раза, std::string::replace 4 раза
Бендерродригез
22.07.2014, 21:04
  #4

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Вообще-то, Один - Бог мудрости и тайного знания (магии). За эти знания он в своё время и пожертвовал глаз, если мне не изменяет память. И уж кому как не Одину уметь программировать! )))
А драться все асы были не дураки, но особенно в этом отличились Тор и Один, да.
Таки кроме того, Локи скорее был хитрозадый, чем самый умный.

gru74ik
Модератор
 Аватар для gru74ik
3124 / 1350 / 167
Регистрация: 20.02.2013
Сообщений: 3,868
Записей в блоге: 18
22.07.2014, 22:04     Формула, по которой можно вычислить время наступления Рагнарека #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
/// [url]http://www.cyberforum.ru/cpp-beginners/thread1232196.html[/url]
/*
Рагнарек должен наступить с минуты на минуту. Но Один не знает,
когда именно он наступит. Локи, как самый умный, сказал Одину
формулу, по которой можно вычислить время наступления Рагнарека.
К сожалению, Одину с одним глазом сложно уследить за всеми
скобками в выражении, поэтому он решил заменить скобки первого
уровня на фигурные, а второго уровня – на квадратные, остальные
же оставить круглыми. То есть выражение x * (y + (z * (5 + 3)))
изменится на x * {y + [z * (5 + 3)]}. Но Один не умеет
программировать, Один умеет драться, поэтому программу придется
написать вам. Не гневите Одина.
В первой и единственной строке входного файла указана формула,
состоящая из букв латинского алфавита, знаков арифметических
действий, пробелов, цифр и скобок. Гарантируется, что скобки
образуют правильную скобочную последовательность. Длина формулы
не превышает 105. Выведите эту строку в формате удобном для
чтения Одину.
 
Пример ввода 1:
x * (y + (z * (5 + 3)))
 
Пример вывода 1:
x * {y + [z * (5 + 3)]}
 
*/
 
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string formula;
    cout << "\nВведите формулу. Введённые Вами данные будут "
            "сохранены в файл ragnarok.txt.\n";
    getline(cin, formula);
    ofstream fout;
    fout.open("ragnarok.txt");
    fout << formula << endl;
    fout.close ();
    cout << "\nФормула сохранена в файл ragnarok.txt.\n" << endl;
    cout << "\nИдёт преобразование формулы.\n" << endl;
    for (int i=0; i<20; i++)
    {
        Sleep(300);
        cout << "*";
    }
    cout << endl;
 
    ifstream fin;
    fin.open("ragnarok.txt");
    getline(fin, formula);
 
    int i=0;
    int size = formula.length();
    while (i<size)
    {
        if(formula[i]=='(')
        {
            formula[i]='{';
            break;
        }
        ++i;
 
    }
    while (i<size)
    {
        if(formula[i]=='(')
        {
            formula[i]='[';
            break;
        }
        ++i;
 
    }
    while (i<size)
    {
        if(formula[i]==')')
        {
            formula[i]=')';
            break;
        }
        ++i;
 
    }
    while (i<size)
    {
        if(formula[i]==')')
        {
            formula[i]=']';
            break;
        }
        ++i;
 
    }
    while (i<size)
    {
        if(formula[i]==')')
        {
            formula[i]='}';
            break;
        }
        ++i;
    }
    cout << "Теперь Один может прочитать формулу:" << endl;
    for (int i=0; i<size; i++)
    {
        cout << formula[i];
    }
    return 0;
}
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
22.07.2014, 23:27     Формула, по которой можно вычислить время наступления Рагнарека #6
Имхо так проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
 
using namespace std;
 
void replace(string &s, char first, char last)
{
    size_t firstIndex = s.find_first_of('(');
    size_t lastIndex = s.find_last_of(')');
    s[firstIndex] = first;
    s[lastIndex] = last;
}
 
int main()
{
    string s = "x * (y + (z * (5 + 3)))";
    replace(s, '{', '}');
    replace(s, '[', ']');
    cout << s;
}
Sergio Leone
2447 / 1092 / 398
Регистрация: 07.06.2014
Сообщений: 3,245
22.07.2014, 23:55     Формула, по которой можно вычислить время наступления Рагнарека #7
Psilon, а Вы не путаете уровень скобок (читай "вложенность" ) и нумерацию (порядковый) скобок в выражени?

попробуйте на таком контрпримере:
A + (B * ((C + D) + (N+K))) * (A + B) * (D * (B - (C + (E+K))))
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
23.07.2014, 08:14     Формула, по которой можно вычислить время наступления Рагнарека #8
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/////////////////////////////////////////////////////////////////////////////////////////
//Рагнарек должен наступить с минуты на минуту. Но Один не знает, когда именно он наступит.
//Локи, как самый умный, сказал Одину формулу, по которой можно вычислить время наступления 
//Рагнарека. К сожалению, Одину с одним глазом сложно уследить за всеми скобками в выражении, 
//поэтому он решил заменить скобки первого уровня на фигурные, а второго уровня – на квадратные, 
//остальные же оставить круглыми. То есть выражение x * (y + (z * (5 + 3))) изменится 
//на x * {y + [z * (5 + 3)]}.
//Но Один не умеет программировать, Один умеет драться, поэтому программу придется написать вам. 
//Не гневите Одина.
//В первой и единственной строке входного файла указана формула, состоящая из букв латинского 
//алфавита, знаков арифметических действий, пробелов, цифр и скобок. Гарантируется, что скобки 
//образуют правильную скобочную последовательность. Длина формулы не превышает 105.
//Выведите эту строку в формате удобном для чтения Одину.
//
//Пример ввода 1
//
//x * (y + (z * (5 + 3)))
//
//Пример вывода 1
//
//x * {y + [z * (5 + 3)]}
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <stack>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
char    const   LEFT_ROUND_BRACKET      =   '(';
char    const   RIGHT_ROUND_BRACKET     =   ')';
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
T_str   get_rand_str_with_round_brackets()
{
    static  unsigned    const   LINE_LEN_MIN_MIN    =   3;
    static  unsigned    const   LINE_LEN_MIN        =   30;
    static  unsigned    const   LINE_LEN_MAX        =   80;
 
    T_str   res_str;
    int     level       =   0;
    char    cur_symb    =   0;
 
    do
    {
        res_str.clear();
        for(;;)
        {
            if  (
                    level == 0
                )
            {
                if  (
                        res_str.size()  >   (
                                                rand() % 2
                                                    ?   LINE_LEN_MIN_MIN
                                                    :   LINE_LEN_MIN
                                            )
                    )
                {
                    break;
                }
 
                ++level;
                cur_symb    =   LEFT_ROUND_BRACKET;
            }
            else
            {
                if  (
                        rand() % 2
                    )
                {
                    ++level;
                    cur_symb = LEFT_ROUND_BRACKET;
                }
                else
                {
                    --level;
                    cur_symb = RIGHT_ROUND_BRACKET;
                }
            }//else
 
            res_str.push_back( cur_symb );
        }//for
    }
    while   (
                res_str.size() > LINE_LEN_MAX
            );
 
    return  res_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_replace_bracket
{
    //-----------------------------------------------------------------------------------
    static  int     const   LEVEL_MAX   =   3;
    //-----------------------------------------------------------------------------------
    int     level_;
    //-----------------------------------------------------------------------------------
    T_replace_bracket()
        :
        level_()
    {}
    //-----------------------------------------------------------------------------------
    char    operator()  ( char  &   symb )
    {
        static  T_str   const   BRACKETS    =   "**{}[]()";
        char                    res_symb    =   0;
 
        switch( symb )
        {
        case    LEFT_ROUND_BRACKET:
            ++level_;
 
            res_symb    =   BRACKETS
                                [
                                    ind_of_level( level_ ) * 2
                                ];
            break;
 
        case    RIGHT_ROUND_BRACKET:
 
            res_symb    =   BRACKETS
                                [
                                    ind_of_level( level_ ) * 2 + 1
                                ];
 
            --level_;
            break;
 
        default:
            res_symb    =   symb;
        }//switch
 
        return  res_symb;
    }
    //-----------------------------------------------------------------------------------
    int     ind_of_level( int   level )
    {
        return  level > LEVEL_MAX
                    ?   LEVEL_MAX
                    :   level;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
void    transform_brackets( T_str   &   formula )
{
    std::transform
        (
            formula.begin       (),
            formula.end         (),
            formula.begin       (),
            T_replace_bracket   ()
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    srand(unsigned(time(0)));
    T_str   const   formula_const       =   "A + (B * ((C + D) + (N+K))) * (A + B) * (D * (B - (C + (E+K))))";
    T_str   const   formula_const_1     =   "x * (y + (z * (5 + 3)))";
 
    for(;;)
    {
        T_str   formula     =   rand() % 2
                                    ?   get_rand_str_with_round_brackets()
                                    :   rand() % 2
                                            ?   formula_const
                                            :   formula_const_1;
 
        std::cout   <<  std::endl
                    <<  formula
                    <<  std::endl;
 
        transform_brackets( formula );
        std::cout   <<  formula
                    <<  std::endl;
 
        system("pause");
    }//for
}
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
23.07.2014, 08:54     Формула, по которой можно вычислить время наступления Рагнарека #9
Один я не понимаю, что и зачем вы там навертели в такой простой задаче? Видимо, изучение С++ необратимо захламляет мозг ООПом и прочими высокими абстракциями...
Задачка-то чисто алгоритмическая, хоть на С++, хоть на C#, хоть на Паскале решается по одному принципу. Главное - продумать принцип. Для этого достаточно блокнота (бумажного).

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
#include "greatest.h"
 
void brackets(char* str)
{
    const char left[] = { '{', '[', '(' };
    const char right[] = { '}', ']', ')' };
    int i = -1;
    while( *str ) {
        if( *str == '(' ) {
            if( ++i == 3 ) { i = 0; }
            *str = left[i];
        } else if( *str == ')' ) {
            *str = right[i];
            if( --i == -1 ) { i = 2; }
        }
        ++str;
    }
}
 
TEST brackets_1()
{
    char s[] = "()";
    brackets(s);
    ASSERT_STR_EQ(s, "{}");
    PASS();
}
 
TEST brackets_2()
{
    char s[] = "(())";
    brackets(s);
    ASSERT_STR_EQ(s, "{[]}");
    PASS();
}
 
TEST brackets_3()
{
    char s[] = "((()))";
    brackets(s);
    ASSERT_STR_EQ(s, "{[()]}");
    PASS();
}
 
TEST brackets_4()
{
    char s[] = "(((())))";
    brackets(s);
    ASSERT_STR_EQ(s, "{[({})]}");
    PASS();
}
 
TEST brackets_5()
{
    char s[] = "x * (y + (z * (5 + 3)))";
    brackets(s);
    ASSERT_STR_EQ(s, "x * {y + [z * (5 + 3)]}");
    PASS();
}
 
TEST brackets_6()
{
    char s[] = "A + (B * ((C + D) + (N+K))) * (A + B) * (D * (B - (C + (E+K))))";
    brackets(s);
    ASSERT_STR_EQ(s, "A + {B * [(C + D) + (N+K)]} * {A + B} * {D * [B - (C + {E+K})]}");
    PASS();
}
 
SUITE(the_suite)
{
    RUN_TEST(brackets_1);
    RUN_TEST(brackets_2);
    RUN_TEST(brackets_3);
    RUN_TEST(brackets_4);
    RUN_TEST(brackets_5);
    RUN_TEST(brackets_6);
}
 
GREATEST_MAIN_DEFS();
 
int main(int argc, char **argv) {
    GREATEST_MAIN_BEGIN();      /* command-line arguments, initialization. */
    RUN_SUITE(the_suite);
    GREATEST_MAIN_END();        /* display results */
}
Код
C:\UTIL\tcc>tcc.exe -Wall -run brackets.c

* Suite the_suite:
......
6 tests - 6 pass, 0 fail, 0 skipped (1 ticks, 0.001 sec)

Total: 6 tests (15 ticks, 0.015 sec)
Pass: 6, fail: 0, skip: 0.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
23.07.2014, 09:14     Формула, по которой можно вычислить время наступления Рагнарека #10
Sergio Leone, okay, уговорили
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
#include <iostream>
#include <string>
 
 
using namespace std;
 
 
int main()
{
    string s = "A + (B * ((C + D) + (N+K))) * (A + B) * (D * (B - (C + (E+K))))";
    int level = 0;
    size_t i = 0;
    for (char c : s)
    {
        if (c == '(')
        {
            if (level < 2)
                s[i] = level ? '[' : '{';
            level++;
        }
        if (c == ')')
        {
            if (level <= 2)
                s[i] = level > 1 ? ']' : '}';
            level--;
        }       
        i++;
    }
    cout << s;
    return 0;
}
Добавлено через 2 минуты
Vtulhu, один я не понимаю, зачем вы пишете конструкции в таком стиле:
if( ++i == 3 ) { i = 0; }
вам не говорили, что одна строчка - один оператор? Тут их вообще 3, и если ++i == 3 это еще понятно, то вот i = 0 вообще не в кассу

Добавлено через 4 минуты
Vtulhu, и у вас ятп неправильно работать будет, например, на такой строке
C++
1
"A + (B * ((C + D) + (N+(K+(M+(N+T)))))) * (A + B) * (D * (B - (C + (E+K))))"
Судя по алгоритму вы просто сбрасываете счетчик, а это неправильно

Добавлено через 1 минуту
Mr.X, господи, 200 строк на элементарную задачу. У вас болезнь овер-инжинеринга
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
23.07.2014, 09:33     Формула, по которой можно вычислить время наступления Рагнарека #11
Зачем regex? Зачем s.length? Зачем проверять символ на закрывающую скобку, даже если она открывающая?

И самое главное - неужели эта программа выдает правильный ответ? Еще раз напоминаю про блокнот (бумажный).
Правильный ответ должен быть такой: A + {B * [(C + D) + (N+K)]} * {A + B} * {D * [B - (C + {E+K})]}

Вот, прочтите статью, очень поучительно - http://habrahabr.ru/post/153225/

Добавлено через 9 минут
Цитата Сообщение от Psilon Посмотреть сообщение
вам не говорили, что одна строчка - один оператор?
Из любого правила есть исключения. Это, кстати, во многих коуд-гайдах прописано. Здесь вся строчка имеет один простой смысл, размазывать ее по строчкам - значит УХУДШАТЬ понимание. Впрочем, Вы и так, и эдак не поняли алгоритм (не только мой алгоритм, но и общий принцип, а может быть даже и ТЗ), судя по этому комментарию:

Цитата Сообщение от Psilon Посмотреть сообщение
Судя по алгоритму вы просто сбрасываете счетчик, а это неправильно
Сколько стоит блокнот? Выделите из бюджета семьи 50р. Зато Вы (и работодатель) себя через неделю не узнаете.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
23.07.2014, 09:56     Формула, по которой можно вычислить время наступления Рагнарека #12
Зачем regex? Зачем s.length?
думал сначала регэкспами пройтись, потом передумал. Они плохо иерархические структуры обрабатывают
Зачем проверять символ на закрывающую скобку, даже если она открывающая?
допишите перед вторым if else если вам проще. Конечно, косяк, но компиль за мной в любом случае подберет, так что не критично.
Цитата Сообщение от Vtulhu Посмотреть сообщение
И самое главное - неужели эта программа выдает правильный ответ? Еще раз напоминаю про блокнот (бумажный).
Правильный ответ должен быть такой: A + {B * [(C + D) + (N+K)]} * {A + B} * {D * [B - (C + {E+K})]}
это неправильный ответ как бы. Читаем ТЗ
первого уровня на фигурные, а второго уровня – на квадратные, остальные же оставить круглыми
и понимаем, что E+K должны быть круглыми, у вас - фигурные.

Цитата Сообщение от Vtulhu Посмотреть сообщение
Вот, прочтите статью, очень поучительно - http://habrahabr.ru/post/153225/
во-первых при чем тут это? Во-вторых я в любом случае не согласен с автором, что
паттерны опять провалились и ООП вместе с ним. А вот супер-функция на 100500 строк - это, оказывается, быстрая разработка.
далее
Из любого правила есть исключения. Это, кстати, во многих коуд-гайдах прописано.
разве что преподавателем младших курсов универа, который окромя паскаля и фортрана на Эльбрусах ничего и не знает.
Цитата Сообщение от Vtulhu Посмотреть сообщение
Сколько стоит блокнот? Выделите из бюджета семьи 50р. Зато Вы (и работодатель) себя через неделю не узнаете.
я бы понял иронию, если бы вы сами могли читать задание нормально. А так - жаль, жаль, мимо.
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
657 / 68 / 12
Регистрация: 22.06.2014
Сообщений: 147
23.07.2014, 10:32     Формула, по которой можно вычислить время наступления Рагнарека #13
Для поиска разного рода вложенностей должна применяться рекурсия, имхо.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
23.07.2014, 10:51     Формула, по которой можно вычислить время наступления Рагнарека #14
Martein, тезис тьюринга-черча, в студию
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
657 / 68 / 12
Регистрация: 22.06.2014
Сообщений: 147
23.07.2014, 11:06     Формула, по которой можно вычислить время наступления Рагнарека #15
Цитата Сообщение от Psilon Посмотреть сообщение
Martein, тезис тьюринга-черча, в студию
А я совсем новичок, не понимаю про что вы говорите. Там про то, что всё вычислимое может быть вычислено рекурсией?
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
23.07.2014, 11:23     Формула, по которой можно вычислить время наступления Рагнарека #16
Martein, если коротко, то да
Если сложно и точно, то классы вычислимых и общерекурсивных функций совпадают.

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

Добавлено через 47 секунд
Кстати, на этом свойстве построено разворачивание хвостовой рекурсии в циклы в компиляторах. Теоретически любую рекурсию можно развернуть в цикл, но на практике компилятор недостаточно умен, чтобы развернуть что-то сложнее хвостовой
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
23.07.2014, 11:45     Формула, по которой можно вычислить время наступления Рагнарека #17
Цитата Сообщение от Psilon Посмотреть сообщение
Mr.X, господи, 200 строк на элементарную задачу.
Ну, сравнение некорректное, так как у меня там еще и генерация тестовых строк. Да и, мне кажется, что ясность кода и минимальность строк в программе - вещи немного противоположные.
А так-то да, сам алгоритм вам короче удалось выразить. Возьмите на полке пирожок. Только зачем вы весь код в main поместили? От этого ваш успех несколько смазывается.
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
23.07.2014, 12:28     Формула, по которой можно вычислить время наступления Рагнарека #18
Цитата Сообщение от Psilon Посмотреть сообщение
первого уровня на фигурные, а второго у
Тогда согласен, был невнимателен. Казалось само собой разумеющимся, что скобки должны меняться циклически.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
23.07.2014, 13:53     Формула, по которой можно вычислить время наступления Рагнарека #19
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, сравнение некорректное, так как у меня там еще и генерация тестовых строк. Да и, мне кажется, что ясность кода и минимальность строк в программе - вещи немного противоположные.
согласен.

Однако ваш код в вертикальным форматированием абсолютно нечитаем. ИМО офк.
Цитата Сообщение от Mr.X Посмотреть сообщение
А так-то да, сам алгоритм вам короче удалось выразить. Возьмите на полке пирожок. Только зачем вы весь код в main поместили? От этого ваш успех несколько смазывается.
спасибо за пирожок.

А почему в main? А почему бы и нет? Дублированности кода нет, значит все правильно сделал. Это и называется овер-инжинерингом "а вдруг кому-нибудь понадобится эта функция, вынесу её отдельно". В результате код гнется не там, где надо, и миллиарды функций разбросано, которые используются каждая один раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 14:24     Формула, по которой можно вычислить время наступления Рагнарека
Еще ссылки по теме:

C++ Программа, с помощью которой можно вводить данные о жильцах а также реализовывать следующие функции:
Как создать Программу с которой можно будет поговорить C++
Составить программу, в которой можно ввести данные из предметной области и получить определенную информацию C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,693
23.07.2014, 14:24     Формула, по которой можно вычислить время наступления Рагнарека #20
Цитата Сообщение от Psilon Посмотреть сообщение
Однако ваш код в вертикальным форматированием абсолютно нечитаем.
Ну, это индивидуально. Вообще, я заметил, что мой код никого не оставляет равнодушным. Одним он резко нравится, другим так же резко нет.
Цитата Сообщение от Psilon Посмотреть сообщение
ИМО офк.
А можете пояснить что это означает?
Цитата Сообщение от Psilon Посмотреть сообщение
А почему в main? А почему бы и нет?
Ну, на мой взгляд как-то очень не того. В других языках по-моему так вообще не делают. Да и из сишников я думал только студенты-недоучки. Хотя и в книгах подобное встречается.
Yandex
Объявления
23.07.2014, 14:24     Формула, по которой можно вычислить время наступления Рагнарека
Ответ Создать тему
Опции темы

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