Russian AI Cup

Расширенный поиск  
Страницы: [1]

Автор Тема: делимся кодом и подходом  (Прочитано 865 раз)

antoshkaplus

  • Newbie
  • *
  • Сообщений: 1
делимся кодом и подходом
« : Октября 20, 2014, 08:15:59 pm »

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

steleal

  • Full Member
  • ***
  • Сообщений: 96
Re: делимся кодом и подходом
« Ответ #1 : Октября 20, 2014, 08:26:40 pm »

А кто  у нас молодежь? А почему только молодежь? "У меня тоже голос, я тоже хочу петь!"
Записан

planB

  • Jr. Member
  • **
  • Сообщений: 33
Re: делимся кодом и подходом
« Ответ #2 : Октября 20, 2014, 10:19:34 pm »

Свою "светлую" мысль я оставил в другом топике.
Записан

2E3S

  • Jr. Member
  • **
  • Сообщений: 14
Re: делимся кодом и подходом
« Ответ #3 : Октября 20, 2014, 10:48:09 pm »

Оценка количества тиков, требующиеся хокеисту за добраться до [движущейся] цели.
Код: (python3) [Выделить]
def estimate_ticks_to(me: Hockeyist, x, y, distance_gap=0, direction='ahead', consider_speed=False, speed_x=0,
                      speed_y=0):

    def quadratic(a, b, c):
        disc_root = math.sqrt((b * b) - 4 * a * c)
        a1 = (-b + disc_root) / (2 * a)
        a2 = (-b - disc_root) / (2 * a)
        return a1 if a1 > 0 else a2 if a2 > 0 else 0

    if direction == 'ahead':
        angle = me.get_angle_to(x, y)
    else:
        angle = normalize_angle(me.get_angle_to(x, y) + pi)
    dist = me.get_distance_to(x, y) - distance_gap
    if dist < 0:
        angle = abs(angle) - pi / 6
        if angle < 0:
            return 0
        else:
            return floor(angle / MyStrategy.params().game.hockeyist_turn_angle_factor)

    turn_ticks = abs(angle) / MyStrategy.params().game.hockeyist_turn_angle_factor
    # a*t**2/2 + v0*t - s = 0
    if consider_speed and (me.speed_x or me.speed_y or speed_x or speed_y):
        if speed_x != 0 or speed_y != 0:
            d_speed_x = me.speed_x - speed_x
            d_speed_y = me.speed_y - speed_y
        else:
            d_speed_x = me.speed_x
            d_speed_y = me.speed_y
        speed_angle = 0 if not me.speed_x and not me.speed_y \
            else get_angle_between_vectors(me.speed_x, me.speed_y, x - me.x, y - me.y)
        abs_speed = sqrt(d_speed_x ** 2 + d_speed_y ** 2)
        rel_speed = abs_speed * cos(speed_angle)
        if abs(speed_angle) >= pi / 2:
            speed_angle = 0
    else:
        rel_speed = 0
        speed_angle = 0
    if direction == 'ahead':
        move_ticks = quadratic(MyStrategy.params().game.hockeyist_speed_up_factor * cos(abs(speed_angle)) / 2,
                               rel_speed, -dist)
    else:
        move_ticks = quadratic(MyStrategy.params().game.hockeyist_speed_down_factor * cos(abs(speed_angle)) / 2,
                               rel_speed, -dist)
    # TODO improve here: the speed cannot be more than 15**-1, so I should compute a distance v0..15**-1,
    # if it's less than actual distance, I should compute separately ticks with constant speed
    return floor(abs(turn_ticks) + abs(move_ticks))
Значение почти точное или немного пессимистичнее реального.
« Последнее редактирование: Октября 20, 2014, 10:51:20 pm от 2E3S »
Записан
Страницы: [1]