Wyzwanie:
Otrzymujesz ciąg zawierający tylko cyfry. Twoim zadaniem jest wyprowadzenie minimalnej liczby liczb pierwszych, które muszą zostać połączone w celu utworzenia łańcucha. Jeśli jest to niemożliwe, wyjdź 0
.
Przypadki testowe:
Wejście -> Wyjście:
252 -> 3
235 -> 2
92 -> 0
31149 -> 2
Odpowiedzi:
JavaScript (ES6),
123121120 bajtówZapisano bajt dzięki @Neil!
Wyjaśnienie
Pobiera jeden ciąg jako dane wejściowe. Ze względu na metodę sprawdzania pierwotnego (podział próby rekurencyjnej) największą liczbą, którą można bezpiecznie sprawdzić, jest
13840
. Niektóre liczby powyżej tego nie będą działać z powodu przekroczenia maksymalnego rozmiaru stosu wywołań. Jednak kończy się natychmiast dla każdego obsługiwanego przypadku.źródło
i?(a=...)&&(b=...)&&a+b:0
nai&&(a=...)&&(b=...)&&a+b
?MATL ,
2624 bajtówW przypadku niektórych przypadków testowych zajmuje to kilka sekund.
Wypróbuj online!
Wyjaśnienie
źródło
Pyth, 16 bajtów
Zestaw testowy
Wyjaśnienie do naśladowania.
źródło
Pyth -
191716 bajtówPakiet testowy .
źródło
Bash + coreutils,
169158149 bajtówLiczymy jako jedności, wypisując linię z jednym
b
dla każdej liczby pierwszej i zakończeniema
na końcu linii (tak, żeprintf
ma token do pracy).Test pierwotności polega na
factor $n | grep -q ': \w*$'
określeniu, czy liczba ma dokładnie jeden czynnik pierwszy.Rekurencyjnie dzielimy dane wejściowe; jeśli lewa połowa jest liczbą pierwszą, filtrujemy wyniki prawej połowy, dodając po jednej do każdej wartości. Zwrócenie
a
danych wejściowych o zerowej długości przerywa rekurencję.Na koniec bierzemy wszystkie wyniki i sortujemy, aby znaleźć najkrótszy (ignorując te, które nie muszą
a
oznaczać sukcesu); musimy usunąć dwa (dla wstawionegoa
i dla nowego wiersza), a następnie policzyć znaki, aby dać wynik.Testy
Dodałem
111
do testów, aby pokazać, że1
jest poprawnie uważany za niepierwszy.źródło
c
generować finał0
. Jednak nie tak bardzo lubi obfity stderr. Jeśli chcesz, możesz użyć (wersji) mojej odpowiedzi jako podstawy własnej.Mathematica,
142135 bajtówJak widać, Mathematica nie została stworzona do tego zadania. Pobiera listę cyfr.
źródło
And@@
zamiastAllTrue
? Powinny zaoszczędzić 4-5 bajtów.Flatten[#,1]
=Join@@@#