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

В какой-то момент мне надоело это бесцельное сидение дома. Поскольку нормального спортинвентаря у нас нет (только эспандеры и турник), решился заказать в онлайне наборные гантели. По случаю в комплекте было ещё и некое подобие грифа для свинчивания двух гантелек в одну штангу. Но максимальный вес был всё равно смешной - 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)
for line in result:
print("%4.2f %s" % (line*4, line))

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

if __name__ == "__main__":
main()```

```
```
Tags:
• #### Разруха или чернуха?

Я не был в России уже много лет, так что информацию получаю очень опосредовано. Одни говорят, что всё - зашибись, другие - тихий ужас. Причём…

• #### Роскомнадзор, заблокируй сайт Вконтакта!

https://vk.com/id418846577 Вся стена в нацистских цитатах, лозунгах, символике. Более 1600 "друзей" и 500 фолловеров, причем очень много…

• #### ВЫ НИЧЕГО НЕ ПОНИМАЕТЕ!!1

Те, кто застал СССР ребёнком, приучен до конца доедать содержимое тарелки... ... потому то в СССР было ИЗОБИЛИЕ ПРОДУКТОВ. Все, кто воспитан в…

• Post a new comment

#### Error

Anonymous comments are disabled in this journal

default userpic