Opis problemu
Biorąc pod uwagę zestaw unikatowych, pierwszych liczb pierwszych (niekoniecznie obejmujących 2), generuj iloczyn wszystkich kombinacji pierwszych mocy tych liczb pierwszych - np. Bez powtórzeń - a także 1. Na przykład, biorąc pod uwagę zbiór {2, 3, 5, 7}, produkujesz {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210}, ponieważ:
1 = 1
2 = 2
3 = 3
5 = 5
6 = 2 x 3
7 = 7
10 = 2 x 5
14 = 2 x 7
15 = 3 x 5
21 = 3 x 7
30 = 2 x 3 x 5
35 = 5 x 7
42 = 2 x 3 x 7
70 = 2 x 5 x 7
105 = 3 x 5 x 7
210 = 2 x 3 x 5 x 7
Zauważ, że jeśli liczebność twojego zestawu wejściowego wynosi k, to da ci 2 ^ k członków w zestawie wyjściowym.
Zasady / warunki
- Możesz używać dowolnego języka. Cel najmniejszej liczby znaków w kodzie źródłowym.
- Twoje rozwiązanie musi być kompletnym programem lub pełną funkcją. Funkcja może być anonimowa (jeśli Twój język obsługuje funkcje anonimowe).
- Twoje rozwiązanie powinno obsługiwać produkty do co najmniej 2 ^ 31. Nie przejmuj się wykryciem lub obsługą przepełnienia liczb całkowitych, jeśli masz przekazane liczby, których produkt jest zbyt wielki, aby je reprezentować. Proszę jednak podać granice swoich obliczeń.
- Możesz zaakceptować listę lub zestaw i stworzyć listę lub zestaw. Możesz założyć, że dane wejściowe są posortowane, ale nie musisz tworzyć posortowanych danych wyjściowych.
tło
Kiedy lub dlaczego jest to przydatne? Jednym z użytecznych miejsc jest generowanie tabeli mnożników do równoległego wyścigu w algorytmie faktorowania liczb całkowitych znanym jako faktoryzacja form kwadratowych. Tam każdy nieparzysty mnożnik, który próbujesz, zmniejsza prawdopodobieństwo niepowodzenia algorytmu (w celu znalezienia współczynnika) o około 50% na twardych półpierwszych liczbach. Zatem z zestawem generujących liczb pierwszych {3, 5, 7, 11}, który wytwarza zestaw 16 próbnych mnożników do równoległego wyścigu, algorytm zawodzi około 2 ^ 16 czasu na twardych półpierwszych. Dodanie 13 do listy liczb pierwszych daje zestaw 32 próbnych mnożników, zmniejszając prawdopodobieństwo niepowodzenia do około 2 ^ –32, dając drastyczną poprawę wyniku bez dodatkowych kosztów obliczeniowych (ponieważ nawet przy dwukrotnie większej liczbie mnożników ścigających się równolegle, na średnia nadal znajduje odpowiedź w tej samej łącznej liczbie kroków).
źródło
1 0
bash --version
CJam, 13 bajtów
Odczytuje tablicę (np.
[2 3 5 7]
) Ze STDIN. Wypróbuj online.Funkcja anonimowa miałaby taką samą liczbę bajtów:
Przykładowy przebieg
Jak to działa
źródło
Haskell, 22
rozwiązaniem jest funkcja anonimowa:
przykładowe użycie:
objaśnienie:
(:[1])
jest funkcją, która po podaniu liczbyx
zwraca listę[x,1]
.mapM(:[1])
jest funkcją, która podając listę liczb odwzorowuje funkcję(:[1])
nad nimi i zwraca każdy możliwy sposób wyboru elementu z każdej listy. na przykładmapM(:[1]) $ [3,4]
najpierw mapuje funkcję do pobrania[[3,1] , [4,1]]
. możliwe są następujące opcje[3,4]
(wybranie pierwszej liczby obu)[3,1]
[1,4]
i[1,1]
dlatego zwraca[[3,4],[3,1],[1,4],[1,1]]
.następnie
map product
odwzorowuje wszystkie opcje i zwraca ich produkty, które są pożądanym produktem wyjściowym.ta funkcja jest polimorficzna w swoim typie, co oznacza, że może działać na wszystkich typach liczb. możesz
Int
podać mu listę, a wynikiem będzie lista,Int
ale można ją również zastosować do listy typówInteger
i zwróć listęInteger
. oznacza to, że funkcja przepełnienia nie określa zachowania, ale typu danych wejściowych (ekspresyjny system typów Haskella :))źródło
Integer
jest nieograniczony typ liczb całkowitych. Jest teżInt
32-bitowa liczba całkowita, ale w większości to tylko starsza rzecz.Mathematica,
1817 bajtówTo anonimowa funkcja. Nazwij to jak
źródło
×@@@𝒫@#
powinno być nie do pobicia.(*/@#~2#:@i.@^#)
16 znaków w J;)Aktualizacja: C (funkcja f), 92
Nawet jako funkcja jest to wciąż najdłuższy wpis tutaj. Po raz pierwszy podałem tablicę o nieznanej długości jako argument funkcji w C i najwyraźniej nie ma możliwości, aby funkcja C wiedziała o długości przekazywanej do niej tablicy, ponieważ argument jest przekazywany jako wskaźnik ( niezależnie od użytej składni). Dlatego do podania długości wymagany jest drugi argument.
Zachowałem wyjście na standardowe wyjście, ponieważ ustawienie tablicy liczb całkowitych i zwrócenie jej prawie na pewno byłoby dłuższe.
Dzięki Dennis za wskazówki.
Zobacz funkcję
f
(92 znaki z wyłączeniem niepotrzebnych białych znaków) w programach testowych poniżej.Wyjście przez printf
Dane wyjściowe za pomocą wskaźnika tablicy
C (program), 108
wykluczając niepotrzebne białe znaki.
Dane wejściowe z wiersza poleceń, dane wyjściowe na standardowe wyjście. C nie wygra tutaj, ale może spróbuję przejść na funkcję jutro.
Zasadniczo iterujemy wszystkie
1<<c
kombinacje liczb pierwszych, przy czym każdy fragmenti/c
związany jest z obecnością lub brakiem określonej liczby pierwszej w produkcie. „Pętla wewnętrzna”i%c
przebiega przez liczby pierwsze, mnożąc je zgodnie z wartościąi/c.
Gdyi%c
osiągnie 0, produkt jest wyprowadzany, a następnie ustawiany na 1 dla następnej „zewnętrznej” iteracji.co ciekawe,
printf("%d ",p,p=1)
nie działa (zawsze drukuje 1). To nie jest pierwszy raz, gdy widziałem dziwne zachowanie, gdy wartość jest użyta w aprintf
i przypisana później w tym samym nawiasie. Możliwe jest w tym przypadku, że drugi przecinek nie jest traktowany jako separator argumentów, ale raczej jako operator.Stosowanie
źródło
-Wsequence-point
lub-Wall
GCC będzie narzekać.c-=1
sięc--
lub nawet użyći=--c<<c
, jeśli nie przeszkadza UB (wydaje się działać z GCC). 2. Oba zastosowania||
można zastąpić operatorami trójskładnikowymi:p=i%c?p:!!printf("%d ",p)
orazp*=(i/c>>i%c)&1?1:atoi(v[i%c+1])
c-=1
jest tak podstawowym golfem, że nie powinienem tego przegapić, ale był to szybki błąd, ponieważ zapomniałem, że jest jeden dodatkowy ciąg w argv (nazwa programu),i=..c<<c
działa na GCC / cygwin, ale zostawiłem swój oryginalny zaprogramuj w obecnej postaci i przejdź do funkcji. Właśnie się dowiedziałem, żesizeof
nie działa na tablicach przekazywanych jako argumenty funkcji. Włączyłem twoje sugestie dotyczące operatorów trójskładnikowych do funkcji. Utknąłem z wyjściem na standardowe wyjście, ponieważ nie widzę krótkiego sposobu na zwrócenie tablicy.Haskell, 27 bajtów
Jest to implementacja HJMell odpowiedzi CJam @ sudo jako funkcji anonimowej. Nie pokona niesamowitego rozwiązania Haskell @proud haskeller, ale i tak go tu zostawię.
Objaśnienie:
foldr
przyjmuje funkcję binarną, wartość i listę. Następnie zastępuje każdą komórkę minusy na liście przez aplikację funkcji i koniec listy o wartość, na przykład:foldr f v [a,b,c] == f a (f b (f c v))
. Naszą wartością jest lista zawierająca jeden element1
, a funkcją binarną jestf = (=<<)(++).map.(*)
. Terazf
bierze liczbęn
, tworzy funkcję,(n*)
która się zwielokrotnian
, czyni z niej funkcję,g = map(n*)
która stosuje tę funkcję do wszystkich elementów listy i przekazuje tę funkcję do(=<<)(++)
. Tutaj(++)
jest funkcja konkatenacji i(=<<)
jest monadycznego powiązań , które w tym przypadku odbywa się(++)
ig
, i daje funkcję, która pobiera w wykazie, stosujeg
do jego kopii i łączy oba.W skrócie: zacznij od
[1]
i dla każdego numerun
na liście wejściowej weź kopię bieżącej listy, pomnóż wszystko przezn
i dołącz ją do bieżącej listy.źródło
Python: 55 znaków
Rekurencyjnie generuje produkty, wybierając kolejno włączenie lub wyłączenie każdej liczby.
źródło
and
jeśli napiszesz sumę na odwrót?PARI / GP , 26 bajtów
Dłuższe wersje obejmują
(30 bajtów) i
(31 bajtów).
Zauważ, że jeśli dane wejściowe byłyby matrycą faktoryzacji, a nie zestawem, 18 bajtów można zapisać za pomocą
divisors
samego. Ale wydaje się, że konwersja zestawu na macierz faktoryzacji zajmuje więcej niż 18 bajtów. (Czy mogę to zrobić w 39 bajtach bezpośrednio jakov->concat(Mat(v~),Mat(vectorv(#v,i,1)))
lub 24 bajty przez pomnożenie i ponowne faktoringv->factor(factorback(v))
, czy ktoś może zrobić lepiej?)źródło
Szałwia -
3634Zasadniczo to samo co rozwiązanie Martina Büttnera , jeśli dobrze to rozumiem. Jak wspomniałem w komentarzu, równie dobrze mogę opublikować to jako odpowiedź.
Jest to anonimowa funkcja, którą można na przykład wywołać w następujący sposób:
źródło
J (20)
Okazało się to dłużej, niż się spodziewałem lub oczekiwałem. Nadal: krótszy niż haskel!
Stosowanie:
Działa to dla dowolnego zestawu liczb, nie tylko liczb pierwszych. Ponadto liczby pierwsze mogą mieć nieograniczony rozmiar, o ile tablica ma postfiks
x
:2 3 5 7x
źródło
*/@#~2#:@i.@^#
jest alternatywą dla 14 bajtów.05AB1E , 2 bajty
Wypróbuj online!
Wyjaśnienie
źródło
R, 56 bajtów
Rozważam tutaj, że s jest zestawem (i listą). Jestem pewien, że można go jeszcze skrócić. Zobaczę.
źródło
PHP, 97 bajtów
źródło