Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет qwerty ([info]qwerty)
@ 2010-01-24 17:11:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Задачка

Есть одномерный массив целых. В начале его расположен массив A длиной a, в конце B длиной b, а посредине не интересующий нас мусор длиной c. Требуется красивым образом переместить B в начало, за ним расположить A, причем сделав при этом не более a+b чтений и записей в массив. Судьба мусора не интересует. Файлы, посторонняя память и рекурсия категорически отсутствуют.


(Читать комментарии) - (Добавить комментарий)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 02:07 (ссылка)
Нехорошо GCD считать рекурсивно за неимением стека, а так надо бы заставить себя по существу проверить.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-26 02:26 (ссылка)
Нехорошо придираться.

int nod( int a, int b )
{
int tmp;
while( tmp = a % b )
{
a = b;
b = tmp;
}
return b;
}

теперь надо сказать, что поскольку перескок через мусор во внутреннем цикле не сделан, то незачёт.

tmain уже проверила по существу. Думай так, ты хочешь сдвиг влево на a+c.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 03:25 (ссылка)
Ну, оно же выглядит [чудовищно]. Я, конечно, приведу его в удобочитаемый вид, но не сразу. А для подавления форматирования есть <pre>...</pre>.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-26 03:54 (ссылка)
void swapAB( int a, int c, int b )
{
    int bOfs = a+c, bLen = b;
    int totalSize = a+b+c;

    if ( bOfs && bLen )
    {
        int cycleCount = nod(bLen, bOfs);
        for( int i = 1; i <= cycleCount; i++ )
        {
          int iStart = bOfs+bLen-i;

          int pass = M[iStart];
          for( int dest = iStart-bOfs; dest != iStart; dest = (dest-bOfs+totalSize)%totalSize )
          { 
            int tmp = M[dest];
            M[dest] = pass;
            pass = tmp;
          }
          M[iStart] = pass;
        }
    }
}

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 20:24 (ссылка)
А не читаешь и не пишешь ли ты тут мусор, случайно?

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-26 22:23 (ссылка)

YES!!!!!
>теперь надо сказать, что поскольку перескок через мусор во внутреннем цикле не сделан, то незачёт.

Перескочить просто, но некрасиво.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 23:37 (ссылка)
Вряд ли там просто перескок.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-27 00:07 (ссылка)
Именно перескок. Через пару дней покажу. А сейчас обратно в за п бой.


(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-27 00:18 (ссылка)
Не забудь показать.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-30 14:18 (ссылка)
Ты прав был, никакие два элемента мусора не обрабатываются подряд, поэтому избегать его читать/писать - смысла нет. Т.е. это очень просто, но бессмысленно.

int *M = 0;

int reads = 0, writes = 0;

void writeMem( int i, int val )
{
    M[i] = val;
    ++writes;
}

int readMem( int i )
{
    reads++;
    return M[i];
}

void swapAB( int a, int c, int b )
{
    int bOfs = a+c, bLen = b;
    int totalSize = a+b+c;

    if ( bOfs && bLen )
    {
        int cycleCount = nod(bLen, bOfs);
        for( int i = 1; i <= cycleCount; i++ )
        {
          int iStart = bOfs+bLen-i;

          bool holdsShit = false;
          int pass = readMem(iStart);
          for( int dest = iStart-bOfs; dest != iStart; dest = (dest-bOfs+totalSize)%totalSize )
          { 
            int tmpShit = dest >= a && dest < bOfs;
            int tmp = tmpShit ? 0 : readMem(dest);

            if ( !holdsShit )
                writeMem(dest,pass);

            pass = tmp;
            holdsShit = tmpShit;
          }
          if ( !holdsShit )
            writeMem(iStart,pass);
        }

        if ( reads != a+b || writes != a+b )
            puts( "Uzhas!" );
        writes = reads = 0;                 
    }
}

    M = new int[300];
	for( int a = 0; a < 100; a++ )
	    for( int c = 0; c < 100; c++ )
	        for( int b = 0; b < 100; b++ )
	        {
	            memset( M, -1, 300 * sizeof(int) );
	            for( int i = 0; i < a; i++ )
	                M[i] = b+i;
	            for( int i = 0; i < b; i++ )
	                M[a+c+i] = i;
	                
	            swapAB( a, c, b );
	            
	            for( int i = 0; i < a+b; i++ )
	                if ( M[i] != i )
	                    puts( "Vsye propalo!" );
	            
	        }
    delete []M;


Думать как-то по-другому совсем уже лень. Давайте сюда своё решение, пожалуйста.

(Ответить) (Уровень выше)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-26 03:56 (ссылка)
int nod( int a, int b )
{
    int tmp;
    while( tmp = a % b )
    {
        a = b;
        b = tmp;
    }
    return b;
}

	for( int a = 0; a < 100; a++ )
	    for( int c = 0; c < 100; c++ )
	        for( int b = 0; b < 100; b++ )
	        {
	            memset( M, -1, 300 * sizeof(int) );
	            for( int i = 0; i < a; i++ )
	                M[i] = b+i;
	            for( int i = 0; i < b; i++ )
	                M[a+c+i] = i;
	                
	            swapAB( a, c, b );
	            
	            for( int i = 0; i < a+b; i++ )
	                if ( M[i] != i )
	                    puts( "Vsye propalo!" );
	            
	        }


(Ответить) (Уровень выше)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-26 03:57 (ссылка)
Хочешь я тебя устрою веб-дизайнером ?
Будешь нашим королём.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 04:03 (ссылка)
Спасибо, может, в следующей жизни.

(Ответить) (Уровень выше)


(Читать комментарии) -