Задачка об уникальных тетрадах

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 11 мар 2010.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В общем думаю так: 1) Делаем циклический сдвиг на 4 бита, ксорим, запоминаем результат во временном регистре. 2) Повторяем пункт 1 семь раз, каждый раз сдвигая дальше и дальше, и на каждой итерации применяя логическое "и" к временному регистру и текущему результату. 3) Применяем операцию "и" ко всем тетрадам временного регистра. 4) Ну и напоследок переводим число в -1. Итого если хотя-бы один раз в одной тетраде получился 0, то результат будет тоже 0.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Так как логическое "и" и есть умножение, но только битовое, то оно здесь прекрасно подходит.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Booster
    Я честно говоря совсем не понял где у вас логическое И, а где ИЛИ, поэтому очень хотелось бы увидеть код.

    persicum
    Весьма перспективная идея, может стать абсолютным чемпионом, после некоторого улучшения.

    всем
    Уже целая страница идей и ни одного рабочего исходника, удивительно...
     
  4. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Это что, издевка такая? Решение ведь самое простое и тривиальное, заводишь словарь на 16 входов и усе...
    Можно отхапать из стека 16 байт типа
    mov ebp,esp
    add esp,16

    А можно делать битовые зарубки на другом регистре, предварительно очищенном. Мда, всего то нужен словать на 16 бит.
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    persicum
    Действительно хорошее решение, любители сдвигать и ксорить тут полностью пролетают. Для них придётся задачку модифицировать.

    Модифицированная версия задачки:
    1) в rax лежит 8 байт, нужно записать в rax 0, если хотя бы да из них совпадают, и FFFFFFFF_FFFFFFFF если все байты различны.
    2) то же самое, вместо rax используется mm0.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    persicum
    Всё это без ветвлений? На пальцах можно?
     
  7. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Booster
    там
    xor ebx,ebx
    xor ecx,ecx
    а потом 8 блоков вида
    bts bx,ax
    adc ecx,0
    rol eax,4
    ну а дальше что-то вроде
    cmp ecx,0
    sbb eax,eax
    not eax
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Booster, n0name, Mikl___ вы давно не пользовались дизассемблером :)

    Код (Text):
    1. neg     reg
    2. sbb     reg, reg
     
  9. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Booster
    если 8 блоков подряд и каждый кончается
    jz @quit
    такое не покатит?

    Типа
    ror 4
    and eax,15
    dec byteptr [ebp-eax]
    jz @quit

    массив инициализируется двойками
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А если будет не 2 совпадения, а 3?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    persicum
    Не катит, в условии чётко сказано - "Без переходов".
     
  12. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну, пусть буду первым (FASM, 85 байт):
    Код (Text):
    1.         xor     edx, edx
    2.         xor     ecx, ecx
    3.         xor     ebx, ebx
    4.         xor     edi, edi
    5.         xor     ebp, ebp
    6.         push    eax
    7.         mov     esi, esp
    8.         rept 4
    9.         {
    10.                 lodsb
    11.                 aam     16
    12.                 mov     cl, al
    13.                 mov     dl, ah
    14.  
    15.                 bts     ebx, ecx
    16.                 sbb     edi, ebp
    17.                 bts     ebx, edx
    18.                 sbb     edi, ebp
    19.         }
    20.         neg     edi
    21.         sbb     eax, eax
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    83 байта
    Код (Text):
    1.         xor     ecx, ecx
    2.         xor     ebx, ebx
    3.         xor     edx, edx
    4.         xor     edi, edi
    5.         push    eax
    6.         mov     esi, esp
    7.         rept 4
    8.         {
    9.                 lodsb
    10.                 aam     16
    11.                 mov     cl, al
    12.                 bts     ebx, ecx
    13.                 sbb     edx, edi
    14.                 mov     cl, ah
    15.                 bts     ebx, ecx
    16.                 sbb     edx, edi
    17.         }
    18.         neg     edx
    19.         sbb     eax, eax
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KeSqueer
    подставил 0x12346789 и получил 0.
     
  15. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Booster
    ну так и должно быть, не повторяются же цифры
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KeSqueer
    >ну так и должно быть, не повторяются же цифры
    Условие внимательней прочитай. ^)
     
  17. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Booster
    :) ну да, нужно наоборот
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    KeSqueer
    Но это же не проблема? not eax в конце и +2(?) байта.
    Пусть код и довольно большой, но надо же с чего-то начинать? Выкладываем решения размером меньше!
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    не лучшее решение
    Код (Text):
    1. mov eax,0ABCDEF0h
    2.     xor ebp,ebp
    3.     xor ecx,ecx
    4.     mov ebx,eax
    5.     rept 7
    6.     ror ebx,4
    7.     mov edx,ebx
    8.     xor edx,eax
    9.     mov esi,edx
    10.     and esi,0Fh
    11.     setz cl
    12.     or ebp,ecx
    13.         mov esi,edx
    14.     and esi,0F0h
    15.     setz cl
    16.     or ebp,ecx
    17.     mov esi,edx
    18.     and esi,0F00h
    19.     setz cl
    20.     or ebp,ecx
    21.     mov esi,edx
    22.     and esi,0F000h
    23.     setz cl
    24.     or ebp,ecx
    25.         mov esi,edx
    26.     and esi,0F0000h
    27.     setz cl
    28.     or ebp,ecx
    29.     mov esi,edx
    30.     and esi,0F00000h
    31.     setz cl
    32.     or ebp,ecx
    33.         mov esi,edx
    34.     and esi,0F000000h
    35.     setz cl
    36.     or ebp,ecx
    37.     mov esi,edx
    38.     and esi,0F0000000h
    39.     setz cl
    40.     or ebp,ecx
    41.     endm
    42.     dec ebp
    43.     mov eax,ebp
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    чуть-чуть подумав
    Код (Text):
    1.     mov eax,0ABCDEF0h
    2.     xor ebp,ebp
    3.     xor ecx,ecx
    4.     mov ebx,eax
    5.     rept 7
    6.     ror ebx,4
    7.     mov edx,ebx
    8.     xor edx,eax
    9.     test edx,0Fh
    10.     setz cl
    11.     or ebp,ecx
    12.     test edx,0F0h
    13.     setz cl
    14.     or ebp,ecx
    15.     test edx,0F00h
    16.     setz cl
    17.     or ebp,ecx
    18.     test edx,0F000h
    19.     setz cl
    20.     or ebp,ecx
    21.     test edx,0F0000h
    22.     setz cl
    23.     or ebp,ecx
    24.     test edx,0F00000h
    25.     setz cl
    26.     or ebp,ecx
    27.     test edx,0F000000h
    28.     setz cl
    29.     or ebp,ecx
    30.     test edx,0F0000000h
    31.     setz cl
    32.     or ebp,ecx
    33.     endm
    34.     dec ebp
    35.     mov eax,ebp