Podając liczbę całkowitą n
, zwróć liczbę sposobów, w których n można zapisać jako listę liczb pierwszych. Na przykład 2323
można zapisać jako (2,3,23)
, (23,23)
lub (2,3,2,3)
lub (23,2,3)
, aby uzyskać dane wyjściowe 4
. Jeśli nie można tego zapisać w ten sposób, powinieneś wydrukować 0
.
Liczba pierwsza, taka jak 019
lub, 00000037
jest poprawną liczbą pierwszą dla tego problemu.
Przypadki testowe:
5 -> 1
55 -> 1
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach w każdym języku!
Edycja: teraz wiem, dlaczego następnym razem powinienem użyć piaskownicy
code-golf
math
primes
set-partitions
takielunek
źródło
źródło
Odpowiedzi:
Haskell ,
9689 bajtów5 bajtów zapisanych dzięki testowi pierwszeństwa H.PWiz
Wypróbuj online!
Wyjaśnienie
Pierwszą rzeczą, która jest zrobiona, jest utworzenie pierwszej funkcji testowej
przy użyciu twierdzenia Wilsonaprzy użyciu definicji liczby pierwszej.Następnie zacznij definiować
f
. Pierwszą rzeczą, o której pomyślałem, kiedy zobaczyłem ten problem, było użycie programowania dynamicznego. Jednak programowanie dynamiczne kosztuje bajty, więc wykorzystuje to algorytm „programowania dynamicznego psuedo”. Podczas gdy w programowaniu dynamicznym zapisujesz tutaj w pamięci wykres Directed Acyclic, po prostu używamy rekurencji i ponownie obliczamy każdy węzeł za każdym razem, gdy go potrzebujemy. Traci cały czas korzyści z programowania dynamicznego, ale jest to golf golfowy więc kogo to obchodzi. (wciąż lepsze niż wyszukiwanie brutalną siłą)Algorytm wygląda następująco: tworzymy Directed Acyclic Graph, L , gdzie każdy węzeł reprezentuje podłańcuch liczby. W szczególności L i reprezentuje ostatnie i cyfry naszego wejścia (nazwijmy to n ).
Zdefiniować L 0 ma wartość 1, a każdy z inną wartość L mają sumę poszczególnych L j, tak, że j <i a podłańcuchem n od I do j jest liczbą pierwszą.
Lub we wzorze:
Następnie zwraca wartość w najszerszym największy wskaźnik L . ( L k gdzie k jest liczbą cyfr n )
źródło
Galaretka , 8 bajtów
Wypróbuj online!
-1 bajt dzięki Leaky Nun
-1 bajt dzięki Dennis
Wyjaśnienie
źródło
Brachylog , 10 bajtów
Wypróbuj online!
Najpierw
ṫ
konwertuje dane wejściowe na ciąg.{…}ᶜ
Liczy liczbę możliwych wyników dla…
.Wewnątrz
{…}
wyjścieṫ
jest podawane do~c
. Wyjście tego predykatu spełnia to, że po połączeniu jest równe wkładowi. Jest podawany doịᵐ
, co określa, że jego wyjściem jest wejście z każdym łańcuchem przekonwertowanym na liczbę całkowitą.ṗᵐ
określa, że jego dane wejściowe składają się z liczb pierwszychźródło
{~cṗᵐ}ᶜ
. Jest to bardzo powolne, ponieważ~c
na liczbach całkowitych działa z arytmetyką ograniczeń, ale teoretycznie działa.Pyth , 13 bajtów
Zestaw testowy.
źródło
Python 2 ,
1059591 bajtówTo jest bardzo wolne.
Wypróbuj online!
źródło
Python 2 , 161 bajtów
Wypróbuj online!
Funkcja
g
tworzy rekurencyjnie partycje (pobiera ciąg jako dane wejściowe, ale wyświetla listę list liczb całkowitych). Większość pozostałego kodu to tylko implementacja „czy liczbad
pierwsza?”.źródło
Gaia , 12 bajtów
Wypróbuj online!
źródło
Czysty ,
199141131 bajtówWypróbuj online!
źródło
J ,
6564 bajtówWypróbuj online!
źródło
Pyth, 12 bajtów
Pobiera dane wejściowe jako liczbę całkowitą, wyjścia
True
lubFalse
Wypróbuj online!
źródło