Olej писал(а):
А теперь оригинал задачи, предложенный из Израиля:
Они ещё предлагают это делать на скорость: через 30 минут они отключают окно редактирования.
Но, по-моему, это как-раз глупость...
Модифицированный мой вариант (тот, который а). сделан в 30 минут и, поэтому, черновой и б). сделан по принципу "не особенно вникая что делает код", т.е. как выше названо класс 1):
Код: Выделить всё
char *func2(char *s, char a, char b) {
char *aptr = strchr( s, a ),
*bptr = strchr( s, b );
return 0 == strlen( s ) ? ( ( ( a == 0 ) || ( b == 0 ) ) ? s : NULL ) :
( ( NULL == aptr ) && ( NULL == bptr ) ) ? NULL :
aptr == NULL ? bptr :
bptr == NULL ? aptr :
bptr < aptr ? bptr : aptr;
}
И тестовая задача, проверяющая эквивалентность (результата func1() и func2() - исходной и модифицированной):
Код: Выделить всё
struct test {
const char *str;
char a, b;
friend inline ostream& operator << ( ostream& stream, test& obj ) {
stream << '<' << ( obj.str ? obj.str : "NULL" ) << "|'";
if( isprint( obj.a ) ) stream << obj.a;
else stream << '\\' << int( obj.a );
stream << "'|'";
if( isprint( obj.b ) ) stream << obj.b;
else stream << '\\' << int( obj.b );
stream << "'>";
return stream;
}
};
void strshow( char* s, const char* s1 ) {
if( NULL == s ) cout << "NULL";
else if( '\0' == *s ) cout << "\"\"";
else cout << (char)*s << "[" << s - s1 << "]";
}
int main( int argc, char **argv ) {
test at[] = {
{ "123456789", '7', '3' },
{ "123456789", '7', '8' },
{ "123455432", '7', '3' },
{ "123456789", '5', 'A' },
{ "123456789", 'B', '6' },
{ "123456789", 'x', 'y' },
{ "", 2, 3 },
{ "", 5, 0 },
};
for( uint i = 0; i < sizeof( at ) / sizeof( at[ 0 ] ); i++ ) {
char *pf1 = func1( (char*)at[ i ].str,
at[ i ].a, at[ i ].b ),
*pf2 = func2( (char*)at[ i ].str,
at[ i ].a, at[ i ].b );
cout << i + 1 << " : " << at[ i ] << " => ";
strshow( pf1, at[ i ].str );
cout << " ... ";
strshow( pf2, at[ i ].str );
cout << endl;
}
return 0;
}
В массив тестов at[] вы можете вписать любые тестовые комбинации.
Выполнение:
Код: Выделить всё
olej@nvidia ~/2015_WORK/in.WORK/SchoolCPP/strsimpl $ ./strsimpl
1 : <123456789|'7'|'3'> => 3[2] ... 3[2]
2 : <123456789|'7'|'8'> => 7[6] ... 7[6]
3 : <123456789432|'7'|'3'> => 3[2] ... 3[2]
4 : <123456789|'5'|'A'> => 5[4] ... 5[4]
5 : <123456789|'B'|'6'> => 6[5] ... 6[5]
6 : <123456789|'x'|'y'> => NULL ... NULL
7 : <|'\2'|'\3'> => NULL ... NULL
8 : <|'\5'|'\0'> => "" ... ""
Отличная идея! для задач - модифицировать заданный код, а не писать собственную реализацию.
Умение работать (практика) с чужим кодом (да ещё написанном и форматированном в самых разных стилях) - это, порой,
важнее, чем писать собственный код. Особенно это так в мире опенсорсных проектов, Linux, где в каждом крупном проекте приходится использовать десятки уже существующих публичных и опенсорсных.