Algebra Steenrod jest ważną algebrą, która pojawia się w topologii algebraicznej. Algebra Steenroda jest generowana przez operatory zwane „kwadratami Steenroda”, po jednym dla każdej dodatniej liczby całkowitej i. Istnieje podstawa algebry Steenroda składającej się z „dopuszczalnych jednomianów” w operacjach kwadratu. Naszym celem jest wygenerowanie tej podstawy.
Sekwencja liczb całkowitych dodatnich nazywana jest dopuszczalną, jeśli każda liczba całkowita jest co najmniej dwa razy większa od następnej. Na przykład [7,2,1]
jest to dopuszczalne, ponieważ i . Z drugiej strony [3,2]
nie jest dopuszczalne, ponieważ . (W topologii zapisywalibyśmy sekwencję [7,2,1]
).
Stopień sekwencji jest sumą go za wpisy. Na przykład stopień [7,2,1]
wynosi . Nadmiar od dopuszczalnego sekwencji jest pierwszym elementem minus suma pozostałe elementy, to [7,2,1]
jest nadmiar .
Zadanie
Napisz program, który bierze parę dodatnich liczb całkowitych (d,e)
i wyświetla zbiór wszystkich dopuszczalnych sekwencji stopni d
i nadwyżek mniejszych lub równych e
. Wyjście jest zbiorem, więc kolejność dopuszczalnych sekwencji nie ma znaczenia.
Przykłady:
Input: 3,1
Output: [[2,1]]
Tutaj szukamy dopuszczalnych sekwencji o sumie 3. Istnieją dwie opcje, [3]
i [2,1]
. ( [1,1,1]
i [1,2]
mają sumę 3, ale nie są dopuszczalne). Nadmiar [3]
wynosi 3, a nadmiar [2,1]
wynosi . Zatem jedyną sekwencją z nadmiarem jest [2,1]
.
Input: 6, 6
Output: [[6], [5, 1], [4, 2]] (or any reordering, e.g., [[5,1],[4,2],[6]])
Ponieważ nadwyżka jest zawsze mniejsza lub równa stopniowi, nie mamy nadwyżki. Tak więc, jesteśmy po prostu staramy się znaleźć wszystkie dopuszczalne sekwencje stopni 6. opcje są [6]
, [5, 1]
i [4, 2]
. (Mają one więcej niż , , a ).
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
Dopuszczalne sekwencje stopnia 10 to:
[[10], [9,1], [8,2], [7,3], [7,2,1], [6,3,1]]
Mają one odpowiednio , , , , i , więc wszystkie trzy ostatnie działają.
Punktacja
To jest kod golfowy: wygrywa najkrótsze rozwiązanie w bajtach.
Przypadki testowe:
Wszelkie zmiany kolejności danych wyjściowych są równie dobre, więc dla danych wejściowych (3, 3)
, wyjściowych [[3],[2,1]]
lub [[2,1],[3]]
są równie akceptowalne (jednak [[1,2],[3]]
nie są).
Input: 1, 1
Output: [[1]]
Input: 3, 3
Output: [[2,1], [3]]
Input: 3, 1
Output: [[2,1]]
Input: 6, 6
Output: [[6], [5, 1], [4, 2]]
Input: 6, 4
Output: [[5,1], [4,2]]
Input: 6, 1
Output: []
Input: 7, 7
Output: [[7], [6,1], [4,2,1], [5,2]]
Input: 7,1
Output: [[4,2,1]]
Input: 10, 10
Output: [[10], [9,1], [7,2,1], [6,3,1], [8,2], [7,3]]
Input: 10, 5
Output: [[7,3], [7,2,1], [6,3,1]]
Input: 26, 4
Output: [15, 7, 3, 1]
Input: 26, 6
Output: [[16, 7, 2, 1], [16, 6, 3, 1], [15, 7, 3, 1], [16, 8, 2], [16, 7, 3]]
źródło
Odpowiedzi:
05AB1E ,
1612 bajtówZaoszczędzone 4 bajty dzięki Grimy
Wypróbuj online!
Wyjaśnienie
źródło
ćsO-
jest wbudowanyÆ
.À@¨
może być¦@
.Wolfram Language (Mathematica) ,
6762 bajtówWypróbuj online!
-4 bajty przez @attinat
IntegerPartitions@d
: Uzyskaj wszystkie listy liczb całkowitych sumujących się dod
Cases[,...]
: Filtruj według następującego warunku:2#& @@# - d <= e &&
: Dwa razy pierwszy element minus suma jest mniejsza niże
i ...Max@Ratios@#<=.5
: Stosunki kolejnych elementów listy są mniejsze niż 1/2.Ponieważ
e
jest mniej niż .5, możemy to zmienić w łańcuchową nierówność.W przypadku kilku dodatkowych bajtów jest to znacznie szybsze: wypróbuj online!
źródło
Galaretka ,
1615 bajtów-1 dzięki Erikowi Outgolfer (inteligentne dostosowanie do sprawdzania pozwalające na pojedynczy filtr)
Dyadyczny link akceptujący dodatnią liczbę całkowitą
d
po lewej stronie i dodatnią liczbę całkowitąe
po prawej stronie, która daje listę list dodatnich liczb całkowitych.Wypróbuj online! (stopka formatuje wyniki, aby uniknąć listy niejawnego formatowania listy, którą Jelly robi jako pełny program)
W jaki sposób?
źródło
Haskell ,
595854 bajtów1 bajt zapisany dzięki nim
4 bajty zapisane dzięki xnor
Wypróbuj online!
źródło
#
bezpośrednio: Wypróbuj online!JavaScript (V8) ,
88 8781 bajtówPobiera dane wejściowe jako
(e)(d)
. Drukuje sekwencje do STDOUT.Wypróbuj online!
Skomentował
źródło
Pyth , 23 bajty
Wypróbuj online!
źródło
Python 3 ,
213 bajtówZrozumienie gigantycznej listy. Najprawdopodobniej nie jest to najlepszy sposób na zrobienie tego, ale nie mogę wymyślić, jak pominąć instrukcje if
Python 3 , 172 bajty
Wypróbuj online!
Zgodnie z edycjami @Jonas Ausevicius
źródło
all
może pobierać generator, więc możesz to zrobićall(...)
zamiastall([...])
. Wreszcie, ponieważ przesłanie jest funkcją całkowicie anonimową, nie jesteś karany za przypisanie (f=
), a zatem możesz odliczyć ją od wyniku (-2 bajty).[*(...)]
zamiastlist(...)
których zwykle zapisuje bajt, ale w twoim przypadku oszczędza 2, ponieważ pozwala także usunąć spację.[*filter(...)]
. Również mile widziane :)Węgiel drzewny , 42 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Najpierw utwórz listę list z
[1]..[d]
.Dla każdej listy utwórz nowe listy, poprzedzając wszystkie liczby od podwojonego pierwszego numeru,
d
i dołącz te listy do listy list do przetworzenia. Dzięki temud
tworzone są wszystkie dopuszczalne sekwencje zawierające liczby nie większe niż .Wyprowadzaj tylko te listy, których stopień jest
d
i nadwyżka nie jest większa niże
. (Suma stopnia i nadwyżki jest równa dwukrotności pierwszej liczby na liście.)źródło
Python 3 , 156 bajtów
przyjmuje
d,e
jako dane wejściowe; wyświetla listę krotekPodobne do @OrangeCherries odpowiedź i pomoc w komentarzach; ale więcej bajtów zostało zapisanych
Wypróbuj online!
źródło
Galaretka , 18 bajtów
Wypróbuj online!
źródło
Rubinowy , 78 bajtów
Wypróbuj online!
źródło