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

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

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

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

Имя "Марио" и т. д. являются именами персонажей Mario Kart 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  
  [...]

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 06 марта 2011

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

import collections

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

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

  • Они могут быть определены очень кратко.
  • Они предоставляют конструктор, который просто принимает поля в порядке.
  • Они позволяют нам получить доступлюбое поле по имени, например, 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 и Vehicle (унаследованные от ThingWithStats) могут принимать любую последовательность соответствующей длины в качестве аргумента stats.Они используют * для преобразования последовательности в Stats объект.Вскоре мы увидим, почему это удобно.

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

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

Теперь вот скучный бит - данные.Я скопировал и вставил их и использовал магию 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))

Дополнительные идеи

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

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

Вы можете выполнить более точный поиск, добавив ограничения.Например, чтобы найти самую быструю комбинацию с турбо> = 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. Он возвращает список всех этих элементов, привязанных к максимальному значению любого указанного ключа.

3 голосов
/ 06 марта 2011

Я расширил ответ @ Уибла несколькими незначительными способами:

  1. Получает данные прямо со страницы Википедии
  2. Использует itertools.product вместо пользовательской make_combination ()
  3. Автоматически перебирает доступные атрибуты
  4. Показывает элементы top-N и bottom-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 голосов
/ 06 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...