Что такое элегантный способ решить эту проблему максимума и минимума в Ruby или Python?

1

Следующее может быть сделано шаг за шагом, несколько неуклюжий, но мне интересно, есть ли элегантный способ сделать это.

Существует страница: http://www.mariowiki.com/Mario_Kart_Wii, где есть 2 таблицы... есть

Mario    -   6   2   2   3   -   -
Luigi    2   6   -   -   -   -   -
Diddy Kong   -   -   3   -   3   -   5
  [...]

Название "Mario" и т.д. - имена персонажей Марио Карта Wii. Цифры для бонусных очков для:

Speed    Weight  Acceleration    Handling    Drift   Off-Road    Mini-Turbo

а затем есть таблица 2

Standard Bike S 39  21  51  51  54  43  48  
Bullet Bike 53  24  32  35  67  29  67      
Bubble Bike / Jet Bubble    48  27  40  40  45  35  37  
  [...]

Это также характеристики для велосипеда или карты.

Интересно, какое самое элегантное решение для поиска всех максимальных комбинаций скорости, веса, ускорения и т.д., а также для минимума, либо напрямую используя HTML на этой странице, либо копируя и вставляя числа в текстовый файл.

Собственно, в этой таблице персонажей Марио Бауэр-младший - все средние персонажи, Baby Mario to Dry Bones - это маленькие персонажи, а остальные - большие персонажи, за исключением маленьких, средних или больших Mii. имя говорит. Маленькие персонажи могут ездить только на маленьком велосипеде или маленьком картинге и т.д. Для средних и больших.

Обновление: было бы неплохо также отфильтровать только тип Kart или Bike при печати результатов, так как некоторые люди играют только с байками и только для дрейфа "in" или "out" типа для велосипедов, так как некоторые люди играют только с использованием типа "в дрифте". Также приятно распечатать результат, который имеет такое же максимальное или минимальное значение (разные символы на разных картинах или байках, которые добавляют к одному и тому же значению). Ответ Хью на печать верхних значений и нижних значений тоже хорош, так как некоторые из значений довольно близки, например 73 или 72.

  • 1
    Теперь я хочу снова сыграть в Mario Kart ...
Теги:

3 ответа

8
Лучший ответ

В вашей проблеме есть две части. Анализ HTML и анализ. Разбор HTML-это утомительная работа, и я подозреваю, что не так много, что вы можете сделать, чтобы сделать ее изящной. Анализ непросто, но есть несколько способов сделать это в Python, который, я думаю, можно считать элегантным. Я собираюсь обсудить способы выражения анализа грубой силы в элегантном и сжатом виде. Я не буду обсуждать способы сделать это быстрее, чем грубая сила, потому что набор данных настолько крошечный.

import collections

Stats = collections.namedtuple("Stats", "speed weight acceleration handling drift offroad turbo")

Сначала мы создаем именованный кортеж под названием "Статистика". Это объект, который мы будем использовать для представления статистики водителя или транспортного средства. Именованные кортежи хороши, потому что:

  • Их можно определить очень кратко.
  • Они предоставляют конструктор, который просто берет поля в порядке.
  • Они позволяют нам получить доступ к любому полю по имени, например. driver.weight
  • Они обеспечивают удобный для чтения формат __str__: "Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)"
  • Они могут быть доступны как последовательность, как обычный кортеж.

Определить функцию для добавления двух наборов статистики:

def add_stats(xs, ys):
    return Stats(*[(x+y) for (x,y) in zip(xs,ys)])

Zip принимает две последовательности и возвращает последовательность пар элементов из каждой последовательности. Например. zip ([1,2,3], ['a', 'b', 'c']) == [(1, 'a'), (2, 'b'), (3, c) ]). Затем мы используем понимание списка ([blah for blah in blah]), чтобы добавить статистику каждой из этих пар. Наконец, мы передаем это конструктору Stats. * Означает, что мы хотим использовать каждый элемент в последовательности в качестве аргумента функции.

class ThingWithStats(object):
    def __init__(self, name, stats):
        self.name = name
        self.stats = Stats(*stats)
    def __str__(self):
        return self.name + " (" + str(self.stats) + ")"

class Driver(ThingWithStats):
    pass

class Vehicle(ThingWithStats):
    pass

class Combination(ThingWithStats):
    def __init__(self, driver, vehicle):
        self.name = driver.name + " riding " + vehicle.name
        self.stats = add_stats(driver.stats, vehicle.stats)

Теперь мы определили классы для представления драйверов, транспортных средств и их комбинаций. Обратите внимание, что конструкторы для Driver and Vehicle (унаследованные от ThingWithStats) могут принимать любую последовательность соответствующей длины в качестве аргумента stats. Они используют * для преобразования последовательности в объект stats. Посмотрим, почему это удобно в ближайшее время.

def make_combinations(drivers, vehicles):
    return [
        Combination(driver, vehicle)
        for driver in drivers
        for vehicle in vehicles]

Эта функция использует понимание списка, чтобы найти все комбинации некоторого списка драйверов и некоторого списка транспортных средств. Обратите внимание, что, используя несколько "for" s в одном понимании, мы получаем все комбинации. Это также иногда называют декартовым произведением.

Теперь вот скудный бит - данные. Я скопировал и вставил их и использовал магию vim, чтобы массировать их в правильном формате. Извините, у меня нет ничего более умного для этого. Обратите внимание, что для аргумента stats мы передаем правильный кортеж. Как упоминалось выше, конструктор преобразуется в объект stats. Здесь мы немного помешали.

medium_drivers = [
    Driver("Mario",        (0, 6, 2, 2, 3, 0, 0)),
    Driver("Luigi",        (2, 6, 0, 0, 0, 0, 0)),
    Driver("Peach",        (2, 0, 5, 0, 6, 0, 0)),
    Driver("Daisy",        (4, 0, 0, 2, 0, 0, 3)),
    Driver("Yoshi",        (0, 3, 0, 0, 3, 5, 0)),
    Driver("Birdo",        (0, 3, 0, 0, 0, 3, 5)),
    Driver("Diddy Kong",   (0, 0, 3, 0, 3, 0, 5)),
    Driver("Bowser Jr.",   (0, 0, 0, 0, 0, 3, 3)),
    Driver("Medium Mii",   (3, 3, 0, 0, 0, 3, 3)),
    ]

small_drivers = [
    Driver("Baby Mario",   (0, 8, 0, 6, 0, 0, 0)),
    Driver("Baby Luigi",   (5, 8, 0, 0, 0, 0, 0)),
    Driver("Baby Peach",   (3, 6, 3, 3, 0, 0, 0)),
    Driver("Baby Daisy",   (5, 6, 0, 0, 0, 0, 3)),
    Driver("Toad",         (0, 0, 6, 0, 6, 0, 0)),
    Driver("Toadette",     (3, 0, 0, 0, 0, 6, 0)),
    Driver("Koopa Troopa", (0, 0, 0, 3, 0, 0, 6)),
    Driver("Dry Bones",    (0, 0, 3, 0, 3, 0, 6)),
    Driver("Small Mii",    (3, 3, 0, 0, 3, 0, 3)),
    ]

large_drivers = [
    Driver("Wario",        (0, 3, 0, 0, 0, 3, 6)),
    Driver("Waluigi",      (0, 0, 6, 0, 5, 3, 0)),
    Driver("Donkey Kong",  (0, 3, 2, 2, 0, 0, 3)),
    Driver("Bowser",       (2, 5, 0, 0, 3, 0, 0)),
    Driver("King Boo",     (0, 0, 0, 5, 0, 3, 0)),
    Driver("Rosalina",     (3, 0, 0, 3, 0, 0, 3)),
    Driver("Funky Kong",   (4, 0, 0, 0, 0, 3, 0)),
    Driver("Dry Bowser",   (0, 0, 0, 0, 0, 6, 6)),
    Driver("Large Mii",    (3, 0, 3, 3, 3, 0, 3)),
    ]

small_vehicles = [
    Vehicle("Standard Kart S",             (41, 29, 48, 48, 51, 40, 45)),
    Vehicle("Baby Booster / Booster Seat", (27, 27, 56, 64, 37, 54, 59)),
    Vehicle("Concerto / Mini Beast",       (55, 32, 29, 32, 64, 27, 64)),
    Vehicle("Cheep Charger",               (34, 24, 64, 56, 59, 45, 54)),
    Vehicle("Rally Romper / Tiny Titan",   (46, 35, 43, 43, 29, 64, 40)),
    Vehicle("Blue Falcon",                 (60, 29, 35, 29, 43, 24, 29)),

    Vehicle("Standard Bike S",             (39, 21, 51, 51, 54, 43, 48)),
    Vehicle("Bullet Bike",                 (53, 24, 32, 35, 67, 29, 67)),
    Vehicle("Nano Bike / Bit Bike",        (25, 18, 59, 67, 40, 56, 62)),
    Vehicle("Quacker",                     (32, 17, 67, 60, 62, 48, 57)),
    Vehicle("Magikruiser",                 (43, 24, 45, 45, 32, 67, 43)),
    Vehicle("Bubble Bike / Jet Bubble",    (48, 27, 40, 40, 45, 35, 37)),
    ]

medium_vehicles = [
    Vehicle("Standard Kart M",                (46, 45, 40, 43, 45, 35, 40)),
    Vehicle("Nostalgia 1 / Classic Dragster", (37, 43, 59, 54, 54, 40, 51)),
    Vehicle("Wild Wing",                      (57, 51, 21, 29, 59, 24, 59)),
    Vehicle("Turbo Blooper / Super Blooper",  (50, 40, 35, 37, 21, 54, 35)),
    Vehicle("Royal Racer / Daytripper",       (34, 45, 51, 59, 32, 48, 54)),
    Vehicle("B Dasher Mk. 2 / Sprinter",      (64, 48, 27, 24, 37, 21, 24)),

    Vehicle("Standard Bike M",                (43, 37, 43, 45, 48, 37, 43)),
    Vehicle("Mach Bike",                      (55, 37, 24, 32, 62, 27, 62)),
    Vehicle("Bon Bon / Sugarscoot",           (32, 32, 54, 62, 35, 51, 56)),
    Vehicle("Rapide / Zip Zip",               (41, 35, 45, 51, 29, 62, 45)),
    Vehicle("Nitrocycle / Sneakster",         (62, 40, 29, 27, 40, 24, 27)),
    Vehicle("Dolphin Dasher",                 (48, 43, 37, 40, 24, 56, 37)),
    ]

large_vehicles = [
    Vehicle("Standard Kart L",              (48, 59, 37, 40, 40, 35, 35)),
    Vehicle("Offroader",                    (39, 64, 48, 54, 18, 43, 45)),
    Vehicle("Flame Flyer",                  (62, 59, 16, 21, 48, 18, 48)),
    Vehicle("Piranha Prowler",              (55, 67, 29, 35, 35, 29, 27)),
    Vehicle("Aero Glider / Jetsetter",      (69, 56, 21, 17, 27, 16, 16)),
    Vehicle("Dragonetti / Honeycoupe",      (53, 62, 27, 29, 56, 24, 56)),

    Vehicle("Standard Bike L",              (46, 54, 40, 43, 43, 37, 37)),
    Vehicle("Bowser Bike / Flame Runner",   (60, 54, 18, 24, 51, 21, 51)),
    Vehicle("Wario Bike",                   (37, 59, 51, 56, 21, 45, 48)),
    Vehicle("Twinkle Star / Shooting Star", (50, 48, 29, 32, 59, 27, 59)),
    Vehicle("Torpedo / Spear",              (67, 56, 24, 18, 29, 18, 18)),
    Vehicle("Phantom",                      (43, 51, 43, 48, 17, 56, 40)),
    ]

С этой целью мы составляем списки всех комбинаций:

small_combinations = make_combinations(small_drivers, small_vehicles)
medium_combinations = make_combinations(medium_drivers, medium_vehicles)
large_combinations = make_combinations(large_drivers, large_vehicles)

all_combinations = small_combinations + medium_combinations + large_combinations

Наконец, мы делаем базовый анализ в списке всех комбинаций:

print "Max speed:", max(all_combinations, key=lambda c:c.stats.speed)
print "Max weight:", max(all_combinations, key=lambda c:c.stats.weight)
print "Max acceleration:", max(all_combinations, key=lambda c:c.stats.acceleration)
print "Max handling:", max(all_combinations, key=lambda c:c.stats.handling)
print "Max drift:", max(all_combinations, key=lambda c:c.stats.drift)
print "Max offroad:", max(all_combinations, key=lambda c:c.stats.offroad)
print "Max turbo:", max(all_combinations, key=lambda c:c.stats.turbo)
print
print "Min speed:", min(all_combinations, key=lambda c:c.stats.speed)
print "Min weight:", min(all_combinations, key=lambda c:c.stats.weight)
print "Min acceleration:", min(all_combinations, key=lambda c:c.stats.acceleration)
print "Min handling:", min(all_combinations, key=lambda c:c.stats.handling)
print "Min drift:", min(all_combinations, key=lambda c:c.stats.drift)
print "Min offroad:", min(all_combinations, key=lambda c:c.stats.offroad)
print "Min turbo:", min(all_combinations, key=lambda c:c.stats.turbo)

Функции min и max предоставляют аргумент key для этой цели. Он принимает функцию, которая берет элемент из списка и возвращает значение, которое вы хотите отсортировать. Вот результаты:

Max speed: Funky Kong riding Aero Glider / Jetsetter (Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16))
Max weight: Bowser riding Piranha Prowler (Stats(speed=57, weight=72, acceleration=29, handling=35, drift=38, offroad=29, turbo=27))
Max acceleration: Toad riding Quacker (Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57))
Max handling: Baby Mario riding Nano Bike / Bit Bike (Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62))
Max drift: Toad riding Bullet Bike (Stats(speed=53, weight=24, acceleration=38, handling=35, drift=73, offroad=29, turbo=67))
Max offroad: Toadette riding Magikruiser (Stats(speed=46, weight=24, acceleration=45, handling=45, drift=32, offroad=73, turbo=43))
Max turbo: Koopa Troopa riding Bullet Bike (Stats(speed=53, weight=24, acceleration=32, handling=38, drift=67, offroad=29, turbo=73))

Min speed: Baby Mario riding Nano Bike / Bit Bike (Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62))
Min weight: Toad riding Quacker (Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57))
Min acceleration: Wario riding Flame Flyer (Stats(speed=62, weight=62, acceleration=16, handling=21, drift=48, offroad=21, turbo=54))
Min handling: Wario riding Aero Glider / Jetsetter (Stats(speed=69, weight=59, acceleration=21, handling=17, drift=27, offroad=19, turbo=22))
Min drift: Wario riding Phantom (Stats(speed=43, weight=54, acceleration=43, handling=48, drift=17, offroad=59, turbo=46))
Min offroad: Donkey Kong riding Aero Glider / Jetsetter (Stats(speed=69, weight=59, acceleration=23, handling=19, drift=27, offroad=16, turbo=19))
Min turbo: Waluigi riding Aero Glider / Jetsetter (Stats(speed=69, weight=56, acceleration=27, handling=17, drift=32, offroad=19, turbo=16))

Другие идеи

Если вы хотите применить это к гораздо большему набору данных, вы можете найти драйвер и автомобиль с минимальным и максимальным для каждого стата, а затем для каждого стата объедините максимальный драйвер с максимальным автомобилем и мини-драйвером с мин. Это будет O (M log M + N log N) вместо O (M * N log M * N). Но вам действительно нужно будет подходить к тысячам водителей и транспортных средств, прежде чем я думаю, что это будет проблемой.

Если вы хотите применить это к массивным наборам данных, которые даже не поместились в память, вы могли бы использовать выражения генератора вместо понимания списков. Вам нужно будет объединить это с синтаксическим анализатором, который может читать и выводить один драйвер/автомобиль за раз.

Вы можете выполнить более конкретные поиски, добавив ограничения. Например, чтобы найти самую быструю комбинацию с turbo >= 50 и обработкой >= 40:

max((combination
    for combination in all_combinations
    if combination.stats.turbo >= 50
    and combination.stats.handling >= 40),
    key=lambda c:c.stats.speed)

Если вы хотите, чтобы все те были привязаны к первому месту, вы могли бы сделать что-то вроде этого:

def all_max(sequence, key):
    top_value = key(max(sequence, key=key))
    return [item for item in sequence if key(item) == top_value]

Назовите его так же, как вы бы набрали max. Он возвращает список всех этих элементов, привязанных к максимальному значению любого ключа.

  • 1
    Священная диссертация Бэтмен! Отличный ответ Weeble :)
  • 0
    вау хорошая работа! Вы закончили и раньше меня ... (Я получил несколько многобайтовых символов из этой таблицы при копировании и вставке в TextMate, и было уже поздно). Вы заядлый игрок Mario Kart? ... Интересно, не заставит ли это некоторых наших читателей сегодня поиграть в Mario Kart ...
Показать ещё 1 комментарий
3

Я добавил расширенный ответ @Weeble несколькими способами:

  • Выводит данные непосредственно со страницы Википедии
  • Использует itertools.product вместо пользовательских make_combinations()
  • Автоматически выполняет итерацию через доступные атрибуты
  • Показывает элементы верхнего и нижнего N для каждого атрибута для каждого размера всадника.

.

from BeautifulSoup import BeautifulSoup
import urllib2
import collections
import itertools

def value(s):
    "Parse string to integer (return 0 on bad string)"
    try:
        return int(s)
    except ValueError:
        return 0

attrs = ('speed','weight','acceleration','handling','drift','offroad','turbo')
Stats = collections.namedtuple('Stats', attrs)
def add_stats(xs,ys):
    return Stats(*(x+y for x,y in zip(xs,ys)))

class ThingWithStats(object):
    def __init__(self, stats):
        super(ThingWithStats,self).__init__()
        self.stats = Stats(*stats)
    def __str__(self):
        return str(self.stats)

class Driver(ThingWithStats):
    @classmethod
    def fromRow(cls,size,row):
        name  = row.th.getText().strip()
        stats = [value(col.getText()) for col in row.findAll('td')]
        return cls(name, size, stats)
    def __init__(self, name, size, stats):
        super(Driver,self).__init__(stats)
        self.name = name
        self.size = size
    def __str__(self):
        return "{0:32} ({1}): {2}".format(self.name, self.size, self.stats)

class Vehicle(ThingWithStats):
    @classmethod
    def fromRow(cls, size, kind, row):
        items = [col.getText() for col in row.findAll('td')]
        name  = items[0].strip()
        stats = [value(item) for item in items[1:8]]
        return cls(name, size, kind, stats)
    def __init__(self, name, size, kind, stats):
        super(Vehicle,self).__init__(stats)
        self.name     = name
        self.size     = size
        self.kind     = kind
    def __str__(self):
        return "{0:30} ({1} {2}): {3}".format(self.name, self.size, self.kind, self.stats)

class DrivenVehicle(ThingWithStats):
    def __init__(self, driver, vehicle):
        if driver.size != vehicle.size:
            raise ValueError('Driver {0} cannot fit vehicle {1}'.format(driver.name, vehicle.name))
        self.driver  = driver
        self.vehicle = vehicle
        self.stats   = add_stats(driver.stats, vehicle.stats)
    def __str__(self):
        return "{0} riding {1}: {2}".format(self.driver.name, self.vehicle.name, self.stats)

def getDrivers(table):
    rows  = table.findAll('tr')[2:]        # skip two header rows
    sizes = 'm'*8 + 's'*8 + 'l'*8 + 'sml'  # this is cheating a bit, but I don't see any way to get it from the table
    return [Driver.fromRow(size,row) for size,row in zip(sizes,rows)]

def getVehicles(table):
    sz = {'Small':'s', 'Medium':'m', 'Large':'l'}
    kd = {'Karts':'k', 'Bikes':'b'}
    size,kind = None,None
    cars = []
    for row in table.findAll('tr'):
        heads = row.findAll('th')
        if len(heads)==1:      # main table heading
            pass
        elif len(heads)==10:   # sub-heading
            s,k = heads[0].getText().strip().split()
            size,kind = sz[s], kd[k]
        else:                  # data
            cars.append(Vehicle.fromRow(size,kind,row))
    return cars

def getData():
    url = 'http://www.mariowiki.com/Mario_Kart_Wii'    # page to look at
    data = urllib2.urlopen(url).read()                 # get raw html
    soup = BeautifulSoup(data)                         # parse

    drivers = []
    cars = []
    for table in soup.findAll('table'):                # look at all tables in page
        try:
            head = table.th.getText()
            if 'Character Bonuses' in head:
                drivers = getDrivers(table)
            elif 'Vehicle Stats' in head:
                cars = getVehicles(table)
        except AttributeError:
            pass

    return drivers,cars

def binBy(attr, lst):
    res = collections.defaultdict(list)
    for item in lst:
        res[getattr(item,attr)].append(item)
    return res

def main():
    drivers,cars = getData()

    drivers = binBy('size', drivers)
    cars    = binBy('size', cars)

    sizes = list(set(drivers.keys()) & set(cars.keys()))
    sizes.sort()

    combos  = {}
    for size in sizes:
        combos[size] = [DrivenVehicle(driver,car) for driver,car in itertools.product(drivers[size], cars[size])]

    topN = 3
    for attr in attrs:
        print "By {0}:".format(attr)
        for size in sizes:
            combos[size].sort(key=lambda dv: getattr(dv.stats,attr), reverse=True)
            print "  ({0})".format(size)
            for dv in combos[size][:topN]:
                print '    '+str(dv)
            print '    ...'
            for dv in combos[size][-topN:]:
                print '    '+str(dv)

if __name__=="__main__":
    main()

и конечные результаты:

By speed:
  (l)
    Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
    Rosalina riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=21, handling=20, drift=27, offroad=16, turbo=19)
    Large Mii riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=24, handling=20, drift=30, offroad=16, turbo=19)
    ...
    Donkey Kong riding Wario Bike: Stats(speed=37, weight=62, acceleration=53, handling=58, drift=21, offroad=45, turbo=51)
    King Boo riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=61, drift=21, offroad=48, turbo=48)
    Dry Bowser riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=56, drift=21, offroad=51, turbo=54)
  (m)
    Daisy riding B Dasher Mk. 2/ Sprinter: Stats(speed=68, weight=48, acceleration=27, handling=26, drift=37, offroad=21, turbo=27)
    Medium Mii riding B Dasher Mk. 2/ Sprinter: Stats(speed=67, weight=51, acceleration=27, handling=24, drift=37, offroad=24, turbo=27)
    Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
    ...
    Birdo riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=35, acceleration=54, handling=62, drift=35, offroad=54, turbo=61)
    Diddy Kong riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=57, handling=62, drift=38, offroad=51, turbo=61)
    Bowser Jr. riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=54, handling=62, drift=35, offroad=54, turbo=59)
  (s)
    Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
    Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
    Baby Peach riding Blue Falcon: Stats(speed=63, weight=35, acceleration=38, handling=32, drift=43, offroad=24, turbo=29)
    ...
    Toad riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=65, handling=67, drift=46, offroad=56, turbo=62)
    Koopa Troopa riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=59, handling=70, drift=40, offroad=56, turbo=68)
    Dry Bones riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=62, handling=67, drift=43, offroad=56, turbo=68)
By weight:
  (l)
    Bowser riding Piranha Prowler: Stats(speed=57, weight=72, acceleration=29, handling=35, drift=38, offroad=29, turbo=27)
    Wario riding Piranha Prowler: Stats(speed=55, weight=70, acceleration=29, handling=35, drift=35, offroad=32, turbo=33)
    Donkey Kong riding Piranha Prowler: Stats(speed=55, weight=70, acceleration=31, handling=37, drift=35, offroad=29, turbo=30)
    ...
    Waluigi riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=35, handling=32, drift=64, offroad=30, turbo=59)
    King Boo riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=37, drift=59, offroad=30, turbo=59)
    Dry Bowser riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=32, drift=59, offroad=33, turbo=65)
  (m)
    Luigi riding Wild Wing: Stats(speed=59, weight=57, acceleration=21, handling=29, drift=59, offroad=24, turbo=59)
    Mario riding Wild Wing: Stats(speed=57, weight=57, acceleration=23, handling=31, drift=62, offroad=24, turbo=59)
    Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
    ...
    Peach riding Bon Bon/ Sugarscoot: Stats(speed=34, weight=32, acceleration=59, handling=62, drift=41, offroad=51, turbo=56)
    Diddy Kong riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=57, handling=62, drift=38, offroad=51, turbo=61)
    Bowser Jr. riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=32, acceleration=54, handling=62, drift=35, offroad=54, turbo=59)
  (s)
    Baby Luigi riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=43, acceleration=43, handling=43, drift=29, offroad=64, turbo=40)
    Baby Mario riding Rally Romper/ Tiny Titan: Stats(speed=46, weight=43, acceleration=43, handling=49, drift=29, offroad=64, turbo=40)
    Baby Daisy riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=41, acceleration=43, handling=43, drift=29, offroad=64, turbo=43)
    ...
    Toad riding Quacker: Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57)
    Koopa Troopa riding Quacker: Stats(speed=32, weight=17, acceleration=67, handling=63, drift=62, offroad=48, turbo=63)
    Dry Bones riding Quacker: Stats(speed=32, weight=17, acceleration=70, handling=60, drift=65, offroad=48, turbo=63)
By acceleration:
  (l)
    Waluigi riding Wario Bike: Stats(speed=37, weight=59, acceleration=57, handling=56, drift=26, offroad=48, turbo=48)
    Waluigi riding Offroader: Stats(speed=39, weight=64, acceleration=54, handling=54, drift=23, offroad=46, turbo=45)
    Large Mii riding Wario Bike: Stats(speed=40, weight=59, acceleration=54, handling=59, drift=24, offroad=45, turbo=51)
    ...
    Rosalina riding Flame Flyer: Stats(speed=65, weight=59, acceleration=16, handling=24, drift=48, offroad=18, turbo=51)
    King Boo riding Flame Flyer: Stats(speed=62, weight=59, acceleration=16, handling=26, drift=48, offroad=21, turbo=48)
    Dry Bowser riding Flame Flyer: Stats(speed=62, weight=59, acceleration=16, handling=21, drift=48, offroad=24, turbo=54)
  (m)
    Peach riding Nostalgia 1/ Classic Dragster: Stats(speed=39, weight=43, acceleration=64, handling=54, drift=60, offroad=40, turbo=51)
    Diddy Kong riding Nostalgia 1/ Classic Dragster: Stats(speed=37, weight=43, acceleration=62, handling=54, drift=57, offroad=40, turbo=56)
    Mario riding Nostalgia 1/ Classic Dragster: Stats(speed=37, weight=49, acceleration=61, handling=56, drift=57, offroad=40, turbo=51)
    ...
    Birdo riding Wild Wing: Stats(speed=57, weight=54, acceleration=21, handling=29, drift=59, offroad=27, turbo=64)
    Daisy riding Wild Wing: Stats(speed=61, weight=51, acceleration=21, handling=31, drift=59, offroad=24, turbo=62)
    Bowser Jr. riding Wild Wing: Stats(speed=57, weight=51, acceleration=21, handling=29, drift=59, offroad=27, turbo=62)
  (s)
    Toad riding Quacker: Stats(speed=32, weight=17, acceleration=73, handling=60, drift=68, offroad=48, turbo=57)
    Toad riding Cheep Charger: Stats(speed=34, weight=24, acceleration=70, handling=56, drift=65, offroad=45, turbo=54)
    Baby Peach riding Quacker: Stats(speed=35, weight=23, acceleration=70, handling=63, drift=62, offroad=48, turbo=57)
    ...
    Small Mii riding Concerto/ Mini Beast: Stats(speed=58, weight=35, acceleration=29, handling=32, drift=67, offroad=27, turbo=67)
    Toadette riding Concerto/ Mini Beast: Stats(speed=58, weight=32, acceleration=29, handling=32, drift=64, offroad=33, turbo=64)
    Koopa Troopa riding Concerto/ Mini Beast: Stats(speed=55, weight=32, acceleration=29, handling=35, drift=64, offroad=27, turbo=70)
By handling:
  (l)
    King Boo riding Wario Bike: Stats(speed=37, weight=59, acceleration=51, handling=61, drift=21, offroad=48, turbo=48)
    Large Mii riding Wario Bike: Stats(speed=40, weight=59, acceleration=54, handling=59, drift=24, offroad=45, turbo=51)
    Rosalina riding Wario Bike: Stats(speed=40, weight=59, acceleration=51, handling=59, drift=21, offroad=45, turbo=51)
    ...
    Wario riding Aero Glider/ Jetsetter: Stats(speed=69, weight=59, acceleration=21, handling=17, drift=27, offroad=19, turbo=22)
    Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
    Dry Bowser riding Aero Glider/ Jetsetter: Stats(speed=69, weight=56, acceleration=21, handling=17, drift=27, offroad=22, turbo=22)
  (m)
    Mario riding Bon Bon/ Sugarscoot: Stats(speed=32, weight=38, acceleration=56, handling=64, drift=38, offroad=51, turbo=56)
    Daisy riding Bon Bon/ Sugarscoot: Stats(speed=36, weight=32, acceleration=54, handling=64, drift=35, offroad=51, turbo=59)
    Peach riding Bon Bon/ Sugarscoot: Stats(speed=34, weight=32, acceleration=59, handling=62, drift=41, offroad=51, turbo=56)
    ...
    Yoshi riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=51, acceleration=27, handling=24, drift=40, offroad=26, turbo=24)
    Birdo riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=51, acceleration=27, handling=24, drift=37, offroad=24, turbo=29)
    Bowser Jr. riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=48, acceleration=27, handling=24, drift=37, offroad=24, turbo=27)
  (s)
    Baby Mario riding Nano Bike/ Bit Bike: Stats(speed=25, weight=26, acceleration=59, handling=73, drift=40, offroad=56, turbo=62)
    Baby Peach riding Nano Bike/ Bit Bike: Stats(speed=28, weight=24, acceleration=62, handling=70, drift=40, offroad=56, turbo=62)
    Koopa Troopa riding Nano Bike/ Bit Bike: Stats(speed=25, weight=18, acceleration=59, handling=70, drift=40, offroad=56, turbo=68)
    ...
    Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
    Small Mii riding Blue Falcon: Stats(speed=63, weight=32, acceleration=35, handling=29, drift=46, offroad=24, turbo=32)
    Toadette riding Blue Falcon: Stats(speed=63, weight=29, acceleration=35, handling=29, drift=43, offroad=30, turbo=29)
By drift:
  (l)
    Waluigi riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=35, handling=32, drift=64, offroad=30, turbo=59)
    Large Mii riding Twinkle Star/ Shooting Star: Stats(speed=53, weight=48, acceleration=32, handling=35, drift=62, offroad=27, turbo=62)
    Bowser riding Twinkle Star/ Shooting Star: Stats(speed=52, weight=53, acceleration=29, handling=32, drift=62, offroad=27, turbo=59)
    ...
    Wario riding Phantom: Stats(speed=43, weight=54, acceleration=43, handling=48, drift=17, offroad=59, turbo=46)
    Funky Kong riding Phantom: Stats(speed=47, weight=51, acceleration=43, handling=48, drift=17, offroad=59, turbo=40)
    Dry Bowser riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=48, drift=17, offroad=62, turbo=46)
  (m)
    Peach riding Mach Bike: Stats(speed=57, weight=37, acceleration=29, handling=32, drift=68, offroad=27, turbo=62)
    Mario riding Mach Bike: Stats(speed=55, weight=43, acceleration=26, handling=34, drift=65, offroad=27, turbo=62)
    Diddy Kong riding Mach Bike: Stats(speed=55, weight=37, acceleration=27, handling=32, drift=65, offroad=27, turbo=67)
    ...
    Medium Mii riding Turbo Blooper/ Super Blooper: Stats(speed=53, weight=43, acceleration=35, handling=37, drift=21, offroad=57, turbo=38)
    Birdo riding Turbo Blooper/ Super Blooper: Stats(speed=50, weight=43, acceleration=35, handling=37, drift=21, offroad=57, turbo=40)
    Bowser Jr. riding Turbo Blooper/ Super Blooper: Stats(speed=50, weight=40, acceleration=35, handling=37, drift=21, offroad=57, turbo=38)
  (s)
    Toad riding Bullet Bike: Stats(speed=53, weight=24, acceleration=38, handling=35, drift=73, offroad=29, turbo=67)
    Dry Bones riding Bullet Bike: Stats(speed=53, weight=24, acceleration=35, handling=35, drift=70, offroad=29, turbo=73)
    Small Mii riding Bullet Bike: Stats(speed=56, weight=27, acceleration=32, handling=35, drift=70, offroad=29, turbo=70)
    ...
    Baby Luigi riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=43, acceleration=43, handling=43, drift=29, offroad=64, turbo=40)
    Baby Daisy riding Rally Romper/ Tiny Titan: Stats(speed=51, weight=41, acceleration=43, handling=43, drift=29, offroad=64, turbo=43)
    Toadette riding Rally Romper/ Tiny Titan: Stats(speed=49, weight=35, acceleration=43, handling=43, drift=29, offroad=70, turbo=40)
By offroad:
  (l)
    Dry Bowser riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=48, drift=17, offroad=62, turbo=46)
    Waluigi riding Phantom: Stats(speed=43, weight=51, acceleration=49, handling=48, drift=22, offroad=59, turbo=40)
    King Boo riding Phantom: Stats(speed=43, weight=51, acceleration=43, handling=53, drift=17, offroad=59, turbo=40)
    ...
    Bowser riding Aero Glider/ Jetsetter: Stats(speed=71, weight=61, acceleration=21, handling=17, drift=30, offroad=16, turbo=16)
    Rosalina riding Aero Glider/ Jetsetter: Stats(speed=72, weight=56, acceleration=21, handling=20, drift=27, offroad=16, turbo=19)
    Donkey Kong riding Aero Glider/ Jetsetter: Stats(speed=69, weight=59, acceleration=23, handling=19, drift=27, offroad=16, turbo=19)
  (m)
    Yoshi riding Rapide/ Zip Zip: Stats(speed=41, weight=38, acceleration=45, handling=51, drift=32, offroad=67, turbo=45)
    Medium Mii riding Rapide/ Zip Zip: Stats(speed=44, weight=38, acceleration=45, handling=51, drift=29, offroad=65, turbo=48)
    Birdo riding Rapide/ Zip Zip: Stats(speed=41, weight=38, acceleration=45, handling=51, drift=29, offroad=65, turbo=50)
    ...
    Diddy Kong riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=48, acceleration=30, handling=24, drift=40, offroad=21, turbo=29)
    Daisy riding B Dasher Mk. 2/ Sprinter: Stats(speed=68, weight=48, acceleration=27, handling=26, drift=37, offroad=21, turbo=27)
    Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
  (s)
    Toadette riding Magikruiser: Stats(speed=46, weight=24, acceleration=45, handling=45, drift=32, offroad=73, turbo=43)
    Toadette riding Rally Romper/ Tiny Titan: Stats(speed=49, weight=35, acceleration=43, handling=43, drift=29, offroad=70, turbo=40)
    Toad riding Magikruiser: Stats(speed=43, weight=24, acceleration=51, handling=45, drift=38, offroad=67, turbo=43)
    ...
    Koopa Troopa riding Blue Falcon: Stats(speed=60, weight=29, acceleration=35, handling=32, drift=43, offroad=24, turbo=35)
    Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
    Baby Daisy riding Blue Falcon: Stats(speed=65, weight=35, acceleration=35, handling=29, drift=43, offroad=24, turbo=32)
By turbo:
  (l)
    Dry Bowser riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=48, acceleration=29, handling=32, drift=59, offroad=33, turbo=65)
    Wario riding Twinkle Star/ Shooting Star: Stats(speed=50, weight=51, acceleration=29, handling=32, drift=59, offroad=30, turbo=65)
    Dry Bowser riding Dragonetti/ Honeycoupe: Stats(speed=53, weight=62, acceleration=27, handling=29, drift=56, offroad=30, turbo=62)
    ...
    King Boo riding Aero Glider/ Jetsetter: Stats(speed=69, weight=56, acceleration=21, handling=22, drift=27, offroad=19, turbo=16)
    Funky Kong riding Aero Glider/ Jetsetter: Stats(speed=73, weight=56, acceleration=21, handling=17, drift=27, offroad=19, turbo=16)
    Bowser riding Aero Glider/ Jetsetter: Stats(speed=71, weight=61, acceleration=21, handling=17, drift=30, offroad=16, turbo=16)
  (m)
    Birdo riding Mach Bike: Stats(speed=55, weight=40, acceleration=24, handling=32, drift=62, offroad=30, turbo=67)
    Diddy Kong riding Mach Bike: Stats(speed=55, weight=37, acceleration=27, handling=32, drift=65, offroad=27, turbo=67)
    Medium Mii riding Mach Bike: Stats(speed=58, weight=40, acceleration=24, handling=32, drift=62, offroad=30, turbo=65)
    ...
    Peach riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=48, acceleration=32, handling=24, drift=43, offroad=21, turbo=24)
    Mario riding B Dasher Mk. 2/ Sprinter: Stats(speed=64, weight=54, acceleration=29, handling=26, drift=40, offroad=21, turbo=24)
    Luigi riding B Dasher Mk. 2/ Sprinter: Stats(speed=66, weight=54, acceleration=27, handling=24, drift=37, offroad=21, turbo=24)
  (s)
    Dry Bones riding Bullet Bike: Stats(speed=53, weight=24, acceleration=35, handling=35, drift=70, offroad=29, turbo=73)
    Koopa Troopa riding Bullet Bike: Stats(speed=53, weight=24, acceleration=32, handling=38, drift=67, offroad=29, turbo=73)
    Small Mii riding Bullet Bike: Stats(speed=56, weight=27, acceleration=32, handling=35, drift=70, offroad=29, turbo=70)
    ...
    Baby Mario riding Blue Falcon: Stats(speed=60, weight=37, acceleration=35, handling=35, drift=43, offroad=24, turbo=29)
    Baby Peach riding Blue Falcon: Stats(speed=63, weight=35, acceleration=38, handling=32, drift=43, offroad=24, turbo=29)
    Baby Luigi riding Blue Falcon: Stats(speed=65, weight=37, acceleration=35, handling=29, drift=43, offroad=24, turbo=29)
3

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

  • 0
    мой вопрос в том, что не является неуклюжим и грубым способом ... также ... даже если в игре много персонажей и байков, вы все равно можете использовать это, не так ли?
  • 0
    Да, но это займет много времени.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню