XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Radiant
Silence
offline
Опыт: 4,907
Активность:
[Task] Нахождение лидера
Задача решена, Toadcop +180 ед. опыта.
» Его вариант решения задачи
Код:
globals
  integer max_killz=0
  integer max_killz_lead=-1
  integer array killz
endglobals

// i - player id
// c - kill count
function AddKillz takes integer i,integer c returns nothing
  set killz[i]=killz[i]+c
 if killz[i]>max_killz then
  set max_killz_lead=i
 endif
endfunction


Постановка задачи

Я тут видел, что раньше устраивали подобные "конкурсы" (Пример) и решил устроить свой.

Задача


написать максимально оптимальный алгоритм нахождения игрока с наибольшем значением убийств.

Подробнее

К примеру у нас есть 12 игроков. Есть глобалка с массивом udg_kills, которая содержит значения их убийств. Нужно создать функцию, которая возвратит номер игрока, лидируещего по значению убийств(Если такого нет, то возвратит -1)
» Пример
Код:
local integer i
udg_kills[0] = 1
udg_kills[1] = 0
udg_kills[2] = 5
set i = FindKillsLeader()
if i == 2 then
    call BJDebugMsg("Я бох! =)")
endif

Правила

Оптимальность не только в производительности, но и в количестве букв, такчто использовать циклы не запрещается. Также можно использовать дополнительные функции.

Естественно я уже написал такой алгоритм. Просто интересно может ли ктонибудь сделать это лучше чем я и как он это сделает.
Задание не сложное, интересное, надеюсь понравится...(может даже пригодится комунибудь)

Отредактировано ShadoW DaemoN, 06.08.2008 в 00:08.
Старый 08.07.2008, 19:17
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Radiant, в примере у тебя отсутствует set в присвоениях, наверно, очень топорился... Свое решение можно скинуть в админ таг и не париться.
Также было бы неплохо написать, как дб оформлена функция, что-то вроде:
Код:
function FindKillsLeader takes nothing returns integer
    // >> ваш код
endfunction

убер простая задача... я затратил на решение менее 5 минут
Старый 08.07.2008, 20:41
Toadcop

offline
Опыт: 54,313
Активность:
всё относительно. по настоящему задачя неправильно поставлена...
сейчас объясню почему =)


1) есть ограничение. 12 игроков (да хоть 8000 впринцыпе.)
2) ЕСЛИ фичя заключаетьса в быстром доступе к инфе то делаетьса по иному.

вот так
Код:
globals
  integer max_killz=0
  integer max_killz_lead=-1
  integer array killz
endglobals

// i - player id
// c - kill count
function AddKillz takes integer i,integer c returns nothing
  set killz[i]=killz[i]+c
 if killz[i]>max_killz then
  set max_killz_lead=i
 endif
endfunction


т.е. всё сразу происходит когда добавляеш киллы.
а потом надо прочитать тока переменую если она -1 то вообще не укого нету киллов. а иначе всегда потом будет лидер.

т.е.
max_killz_lead - id ледирующего игрока.
killz[max_killz_lead] - фраги лидирующего игрока. // если нету фрагов то будет идти значение с 0ля. но вообщем это ничего не меняет.


если вы решали задачю НЕ таким способом вы тогда все уже проиграли :Р
Старый 08.07.2008, 22:24
4go10_frank

offline
Опыт: 2,089
Активность:
Toadcop, браво :)
но можно вопрос, вместо "с" не проще поставить 1 и убрать takes integer c, ведь по идее каждое убийство дает +1 очко (во всех АоСах), и так у нас будет на один параметр меньше :)
Старый 08.07.2008, 23:29
Toadcop

offline
Опыт: 54,313
Активность:
4go10_frank и что это изменит ? то что ничего а тока сделает возможность добавлять n килов.

твоё замечание неочём. это замечание "псевдо задротизма" который реально не знает в чём заключаетьса ключевой момент сбережения произодительности.

вот я тока что пример привёл о чём я. О том что главное не как написан алгоритм а как он построен. "оптимизировать" потом елементарно можно если основа хорошая.
Старый 08.07.2008, 23:39
dk

offline
Опыт: 60,293
Активность:
Задачка так себе, в стандарте просто массив отсортировать и фсе...

//Toadcop не придусмотренно только то, что если игроки сравняются по киллам, то max_killz_lead должно стать -1 (покрайней мере я так понимаю)...
А вобще, конечно, изначально грамотная система лучше чем крутая и оптимальная функция)
Старый 09.07.2008, 07:03
Лось

offline
Опыт: 7,223
Активность:
Radiant тот код который я тебе послал в ПМ был с ошибкой, вот робочий:
Код:
function FindKillsLeader takes nothing returns integer
    local integer i = 0
    local integer ii = 0
    local integer x = 0
    loop
        loop
            if udg_kills[i] > udg_kills[ii] then
                set x = x + 1
            endif            
            set ii = ii + 1           
            exitwhen ii > 11
        endloop
        set ii = 0 
        if x == 11 then
            return i
        endif
        set x = 0
        set i = i + 1
        exitwhen i > 11
    endloop
    return -1
endfunction
Старый 09.07.2008, 10:46
Toadcop

offline
Опыт: 54,313
Активность:
dk с ровно таким же успехом можно хранить "преведущего лидера" или делать сравнения по ровным условиям и,и,и,и... т.е. это всё не важно.


омг 2ойные цыклы О_о. я привёл классный пример ^_^ в чём заключаетьса смысл програмирования.
Старый 09.07.2008, 13:09
ScorpioT1000
Работаем
offline
Опыт: отключен
Код:
GetPlayerScore(Player,PLAYER_SCORE_HEROES_KILLED)

^_^
Старый 09.07.2008, 13:19
Toadcop

offline
Опыт: 54,313
Активность:
ScorpioT1000 это герои. + ты пробывал или во время игры это "доступный" параметр ? // а не тока в конце игры (хотя это не совсем логично но кто знает...)
Старый 09.07.2008, 13:24
ScorpioT1000
Работаем
offline
Опыт: отключен
Вот и я про то раз в гуи ее разрешают значит она работает(а почему она должна не работать?), ну ты замени второй аргумент на войска будут войска

ScorpioT1000 добавил:
т.е. близзы уже за вас сделали(там даже лидер вроде есть)
Старый 09.07.2008, 13:54
S

offline
Опыт: 43,833
Активность:
Код:
PLAYER_SCORE_UNITS_KILLED
=O это тоже существует, фантастика =)
Старый 09.07.2008, 14:17
Toadcop

offline
Опыт: 54,313
Активность:
!!! есть ньюанс =) о засчитывание киллов тока когда герой убил когото (напр).
т.е. это просто но не решение всех задачь.
Старый 09.07.2008, 16:45
Radiant
Silence
offline
Опыт: 4,907
Активность:
Лось, тоже самое что и у меня(Я не говорю что ты списал код, который прислал я XD)
Код:
function FindKillsLeader takes nothing returns integer
    local integer i = 0
    local integer i2
    local integer i3
    loop
        set i2 = 0
        set i3 = 0
        loop
            exitwhen GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_PLAYING
            if udg_kills[i] > udg_kills[i2] then
                set i3 = i3 + 1
            endif
            set i2 = i2 + 1
            exitwhen i2 == 11
        endloop
        if i3 == 10 then
            return i
        endif
        set i = i + 1
        exitwhen i == 11
    endloop
    return -1
endfunction


Так или иначе метод Toadcop-а рулит... А метод Skorp-а нужно еще проверить ^^
Старый 09.07.2008, 17:29
S

offline
Опыт: 43,833
Активность:
Цитата:
Так или иначе метод Toadcop-а рулит

с тебя 180 опыта для Toadcop'a xD
Цитата:
exitwhen GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_PLAYING

нафига это? оО Может, комп (АИ) тоже может стать лидером =\
Старый 09.07.2008, 17:32
Radiant
Silence
offline
Опыт: 4,907
Активность:
Sasha, в карте где я использую(использовал) сие была проверка на компа, просто я показал, что здесь должна быть проверка на играбельность игрока...
Цитата:
с тебя 180 опыта для Toadcop'a xD

Забирайте мне не жалко, хотя такого уговора небыло ^^
Старый 09.07.2008, 17:35
J
expert
offline
Опыт: 48,447
Активность:
задача очень легкая, ну на 20-ку опыта потянет...

о ужас, двойные циклы... O_O

если уж и делать проверку через цикл (а не при изменении результата как предложил тоадкопик), то делать так
Код:
function FindKillsLeader takes nothing returns integer
    local integer max = -1
    local integer inx = -1
    local integer i = 0
    loop
        exitwhen i > 11
        if udg_kills[i] > max then
            set max = udg_kills[i]
            set inx = i
        endif
        set i = i + 1
    endloop
    return inx
endfunction


и ненадо больше такие задачи постить, нужно чтото поинтереснее

Отредактировано Jon, 09.07.2008 в 18:01.
Старый 09.07.2008, 17:53
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
А, кстати, я же не запостил свой вариант ^^
Код:
function FindKillsLeader takes nothing returns integer
  local integer i = 0
  local integer j = udg_kills[0]
  local integer k = 0
  loop
    set i = i + 1
    exitwhen i > 11
    if udg_kills[i] > j then
      set j = udg_kills[i]
      set k = i
    elseif udg_kills[i] == j then
      set k = -1
    endif
  endloop
  return k
endfunction

Toadcop, возьми с полки печеньку)
Старый 09.07.2008, 17:55
adic3x

offline
Опыт: 108,439
Активность:
рофл! задача типа найти адрес элемента массива с максимальным значением?! О_о, тянет даже на 10 опыта=))) (т.е. все кто предложил какой то вариант в посте - выигравают!)
аххаха)
Старый 09.07.2008, 18:27
S

offline
Опыт: 43,833
Активность:
Цитата:
Забирайте мне не жалко, хотя такого уговора небыло ^^

был, можем попросить супмодеров поднять логи редактирования ^^
Цитата:
рофл! задача типа найти адрес элемента массива с максимальным значением?!

кстати... даешь еще конкурсЪ
Старый 09.07.2008, 18:42
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 09:25.