На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Мини-соревнование №00 , Поиск близкого числа
    Всем здрасте! :D
    Давно уже собирался, но, наконец, решил начать вести рубрику мини-соревнований.
    Для участия приглашаются все желающие.
    p.s. Всех мужчин с праздником! ;)


    Постановка задачи.
    Написать функцию поиска в ряде целых чисел наиболее близкого числа к Z. При нахождении нескольких таких чисел выбрать первое наибольшее, если Z>0, первое наименьшее, если Z<0 или любое первое, если Z=0. Адрес массива знаковых 2-байтовых чисел передается в паре регистров DS:SI, размер массива - в регистре CX, а число Z - в регистре AX. Значение остальных регистров не определено. Вернуть в регистре AX порядковый номер числа (отсчет вести с нуля). Если CX=0, вернуть 0.

    Пример.
    Ряд чисел: 9 4 -11 8 -7 0 8 2
    Z=6
    Результат: 3
    Объяснение: наиболее близкие к 6 числа 4 и 8, но т.к. Z>0, мы выбираем 8, в представленном ряде чисел оно идёт под номером 3.

    Критерий оценки.
    Наименьший размер кода.

    Платформа.
    MS-DOS.

    Продолжительность соревнования.
    До 9 марта 2006 года включительно.

    Награда.
    1 dgm.

    Свои работы кидайте мне в приват, а в теме просто указывайте размер получившейся программы с учётом команды ret.

    Удачи! ;)
      Есть некоторые вопросы
      1. разрядность Z (и чисел в массиве)
      2. если нашли Z?
      3. куда слать исходники
        процессор? любой больше 386?
          лично я уже код написал :tong: проверяю, модернезирую..
          - а вот куда его слать потом это вопрос?
          - и еще Женя, в виде подпрограммы пойдет?
          - и можно ли будет исправить его потом в догонку, если возникнет необходимость?
          - и так понял, что без переменных - только регистры.
          orb сказано же Z - два байта знаковых, и его находить не нужно (оно задано)!!! :wacko:
          Сообщение отредактировано: kardinal -
            Цитата kardinal @
            Z - два байта знаковых, и его находить не нужно (оно задано)
            если оно найдено в последовательности
              Число Z задано изначально, а в массиве ищется наиболее близкое к нему. Если найдено, то оно и будет наиболее близким, логично? :)
              А по поводу подпрограммы (процедурки) - конечно, можно, так даже и надо!
              Куда слать? Хм... ну давайте в приват, а в топике просто укажите размер проги с учётом команды ret (описал в первом посте) :)
              Активность пока не ахти, так что продлеваем ещё на недельку, до 9.02.

              Добавлено
              kardinal, здоровая у тебя, однако, процедурка получилась :)
              Аж 62 байта!
                7in X
                Цитата
                kardinal, здоровая у тебя, однако, процедурка получилась. Аж 62 байта!

                Ну вот... :'(
                  Если используются строковые команды то обязательно явно сбрасывать флаг направления?
                    captain cobalt
                    Цитата
                    Если используются строковые команды то обязательно явно сбрасывать флаг

                    Обыкновенно не надо, если ты перед этим не мудрил с направлением.
                      captain cobalt
                      Лучше сбросить! В условии написано:
                      Цитата 7in X @
                      Значение остальных регистров не определено

                      И регистр флагов сюда тоже входит ;)
                        Сократил еще на 5 байт :whistle: днем скину..

                        Невезуха, наоборот баг нашел при Z<0, стало больше.. :blink:
                        Сообщение отредактировано: kardinal -
                          Ну что... соревнование почти заканчивается :)
                          Пока участников трое (работы ещё не проверял)... но ещё есть чуть-чуть времени.
                            Цитата 7in X @
                            работы ещё не проверял
                            А как их проверять?

                            Добавлено
                            правленый вариант вышлю завтра, сегодня не успел :(
                              Странный вопрос... ну во-первых, проанализировать, а во-вторых, через тестовую прогу.
                                Извиняйте, что не опубликовал результаты вовремя, были проблемы со свободным временем.
                                Итак, наши участники:
                                * Lyrik (45 байт)
                                * captain_cobalt (47 байт)
                                * kardinal (62 и 81 байт)
                                * orb (50 байт)
                                Изо всех программ корректно работала только программа captain_cobalt (47 байт). Программа Lyrik'а могла бы победить, но при Z=0 она ищет не первое ближайщее число, а наименьшее (т.е. из 1 и -1 она выберет -1, даже если 1 будет стоять раньше). Т.о...

                                Победителем объявляется captain_cobalt, который награждается 1 dgm! Мои поздравления! ;)

                                Исходный текст программы:
                                ExpandedWrap disabled
                                  ; mini-compo #00
                                  ; http://forum.sources.ru/index.php?showtopic=133825
                                  ; captain cobalt, 08mar2006, 47 bytes
                                   
                                          CLD
                                          PUSH CX
                                          JCXZ EXIT0
                                            PUSH CX
                                            XCHG AX,BP
                                            MOV DI,-1
                                  L1:       LODSW
                                            MOV DX,BP
                                            SUB DX,AX
                                            JG $+4
                                             NEG DX
                                            NEG AX
                                            JZ $+4
                                            JNS $-4
                                            CMP DI,DX
                                            JC L2
                                              JNZ $+6
                                                CMP BX,AX
                                                JNG L2
                                              POP BX
                                              MOV DI,DX
                                              MOV BX,AX
                                              PUSH CX
                                  L2:       LOOP L1
                                            POP CX
                                  EXIT0:  POP AX
                                          SUB AX,CX
                                          RET

                                Программы тестировались на последовательностях:
                                ExpandedWrap disabled
                                  z   dw  6, 6, 0, 0, -3, -3, 0    ; числа Z, последовательно передаваемые в AX
                                  data    dw  9, 4, -11, 8, -7, 0, 8, 2
                                      dw  9, 8, -11, 4, -7, 0, 8, 2
                                      dw  5, -2, 7, 4, 1, 6, -1, 3
                                      dw  5, -2, 7, 4, -1, 6, 1, 3
                                      dw  4, 6, -5, 12, -101, 27, -1, 0
                                      dw  4, 6, -1, 12, -101, 27, -5, 0
                                  ; cx = 8 для всех случаев
                                  ; правильные ответы: 3, 1, 4, 4, 2, 6, 0

                                2 Lyrik: Даю тебе ещё один шанс. Исправишь свою программу так, чтобы она работала корректно и была менее 47 байт (46,45...), тоже получишь 1 dgm ;)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0795 ]   [ 15 queries used ]   [ Generated: 8.10.24, 05:56 GMT ]