def podzielnosc(gorny, i, j, count):
return sorted( {_ for _ in range(floor(gorny/i)*i, gorny-i*(count+1), -i)} |
{_ for _ in range(floor(gorny/j)*j, gorny-j*(count+1), -j)})[-count:]
Jedyne rozwiązanie bez itertools które udało mi się napisać o zbliżonej prędkości funkcji @enedil do zadanego problemu.
Przy dużej ilości elementów wybieranych (np. poniżej 999999, 150 elementów) albo dla dużych dzielnych (typu dzielone przez 33 lub 83) działa szybciej, jednak dla zadanej ilości elementów o małych dzielnikach zdecydowanie będzie lepsza funkcja napisana przez enedila :).
Oczywiście zarówno mój jak i enedila nie odfiltrują wartości poniżej dolnego zakresu - bo go tutaj nie ma, więc jeśli ktoś chce wszystko w zakresie podzielne przez jedną i drugą liczbę, nadal lekko zrefatoryzowane zbiory będą lepsze.
def podzielnosc(gorny, dolny, i, j):
return sorted( {_ for _ in range(floor(gorny/i)*i, dolny, -i)} |
{_ for _ in range(floor(gorny/j)*j, dolny, -j)})
Kombinacja dwóch powyższych, gdzie może wystąpić zarówno dolny zakres jak i ilość elementów:
def podzielnosc(gorny, dolny, i, j, ilosc):
return sorted( {_ for _ in range(floor(gorny/i)*i, max((gorny-i*(count+1), dolny)), -i)} |
{_ for _ in range(floor(gorny/j)*j, max((gorny-j*(count+1), dolny)), -j)})[-ilosc:]
Jeśli ktoś by potrzebował najszybszy sposób do zadanej ilości elementów, to najszybsza wersja jest w komentarzu pod postem enedila, to tylko zmiana warunków, ale to zajmuje najwięcej czasu w jego funkcji ;P. Dlatego z tą zmianą może się wykonać nawet kilkukrotnie nim wykona się którykolwiek z powyższych.