coolwolf0 - Северный наблюдатель (coolwolf0) wrote,
coolwolf0 - Северный наблюдатель
coolwolf0

Чем отличается программист от культуриста?

В какой-то момент мне надоело это бесцельное сидение дома. Поскольку нормального спортинвентаря у нас нет (только эспандеры и турник), решился заказать в онлайне наборные гантели. По случаю в комплекте было ещё и некое подобие грифа для свинчивания двух гантелек в одну штангу. Но максимальный вес был всё равно смешной - 29 Кг. Я же на работе в качалке жал гантельки 2х20, а штангу и больше нагружал (тренажёр Смита не считается - это безобразие). В своё время в Марвелле я с 15-килограммовыми "блинами" (в качестве разминки) делал "бабочку". Так вот, прикупил к имеющемуся (по принципу "каши из топора") ещё четыре диска по 5 кило. Сразу стало гораздо лучше. Но что делает программист перед тем, как попробовать новые "блины"? Он пишет программу для табуляции раскладки дисков по весу.

Под катом опенсорс.

#! /usr/bin/env python
"""
Dumbell tabulate
Take a set of dumbell discs, limit of single arrangement 
and print all arrangements sorted by sum
"""

def get_inputs():
    """
    @return: dictionary with elements "discs" (array of floats) and "limit" (integer)
    """
    return {"discs": [5, 2.5, 2, 1.5, 1.25], "limit": 4}

def build_discs_key(discs):
    """
    Build a string representation of given discs set
    @param discs: list of floats
    @return: string representing those elements
    """
    # "[__{}__]".format(d)
    return ' '.join([str(d) for d in sorted(discs, reverse=True)])

def subsets(elements, amount):
    """
    Get all subsets of array elements with exactly "amount" items
    For amount == 1 - return list of elements
    For amount == N - take all combinations of N-1 + the rest
    """
    if amount <= 1:
        return [[e] for e in elements]
    result = []
    for e in elements:
        # build subset of "e" and combinations of the rest
        subset = elements[:]
        subset.remove(e)
        for s in subsets(subset, amount-1):
            result.append([e]+s)
    return result

def generate_options(discs, limit):
    """
    Generate possible options from inputs
    @param discs: list of disc weights
    @param limit: max amount of discs per option
    @return: dictionary of combinations and their weights
    combination is an ordered set of weights in string representation
    """
    combinations = {}
    key = build_discs_key(discs)
    print("Discs set: {}".format(key))
    print("Discs capacity: {}".format(limit))
    for total in range(1, limit+1):
        # take all combinations of "total" discs from array
        for combination in subsets(discs, total):
            key = build_discs_key(combination)
            # skip existing combinations
            if key in combinations:
                continue
            combinations[key] = sum(combination)
    return combinations

def show_result(options):
    result = [[options[k], k] for k in options.keys()]
    result.sort(key=lambda x: x[0])
    for line in result:
        print("%4.2f %s" % (line[0]*4, line[1]))

def main():
    inputs = get_inputs()
    options = generate_options(inputs["discs"], inputs["limit"])
    show_result(options)

if __name__ == "__main__":
    main()



Tags: дыбр, программирование, спорт
Subscribe

  • Как я уделал винду

    Да, это заняло почти весь выходной день, и ситуацию инициировал я сам, но никаких умышленных диверсий не проводилось. Итак, начнём по порядку. Утро…

  • Дыбрики 2021

    Получили с женой вторую дозу вакцины - она на следующий день чувствовала себя не очень (пришлось отменить прогулку в окрестностях стольного града…

  • Тряхнул стариной (и немного новизной)

    Для нового проекта в области DevOps учу кучу незнакомых вещей: все эти IPMI, DCMI, SNMP и прочая, и прочая. В одной из под-задачек понадобилось…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments