Zadano mi to pytanie w wywiadzie, ale nie byłem w stanie znaleźć żadnego rozwiązania. Nie wiem, czy pytanie było słuszne, czy nie. Próbowałem dużo, ale nie mogłem znaleźć żadnego rozwiązania. Szczerze mówiąc, nic nie przyszło mi do głowy.
Liczby Rocco
Dodatnia liczba całkowita jest liczbą Rocco, jeśli można ją przedstawić jako lub , gdzie jest liczbą pierwszą.
Pierwsze 10 liczb Rocco to:
Zadanie
Kod musi przyjmować dodatnią liczbę całkowitą jako dane wejściowe i określać, czy jest to liczba Rocco, czy nie.
Punkty brownie
- Napisz funkcję, która oblicza i drukuje liczbę liczb Rocco mniejszą lub równą 1 milionowi.
- Napisz funkcję, która oblicza i drukuje liczbę liczb Rocco z pytania bonusowego (powyżej jednego), które są liczbą pierwszą.
code-golf
decision-problem
number-theory
vijayscode
źródło
źródło
print 0
. Wszystkie liczby Rocco są złożone(n*..)
, więc nie ma liczb pierwszych w żadnym zakresie.Odpowiedzi:
05AB1E , 8 bajtów
Zwraca jeśli jest liczbą Rocco, lub przeciwnym razie.1 n 0
Wypróbuj online!
W jaki sposób?
Biorąc dodatnia , test my czy istnieje czynnik pierwszy o takie, że:n p n
Skomentował
źródło
JavaScript (ES7), 55 bajtów
Wypróbuj online!
W jaki sposób?
Biorąc pod uwagę dodatnią liczbę całkowitą , szukamy liczby pierwszej takiej, że lub .n x x ( x + 14 ) = n x ( x - 14 ) = n
Stąd następujące równania kwadratowe:
Dodatni pierwiastek z to:( 1 )
a dodatni pierwiastek z to:( 2 )
Dlatego problem jest równoważny z testowaniem, czy lub jest liczbą pierwszą.x0 x1
Aby to zrobić, używamy klasycznej funkcji testu pierwotności rekurencyjnej, z dodatkowym testem, aby upewnić się, że nie zapętla się na zawsze, jeśli na wejściu zostanie podana liczba niewymierna.
Główna funkcja owijania:
źródło
Perl 6 ,
4528 bajtówWypróbuj online!
Wyjaśnienie:
źródło
Regex (ECMAScript),
6462 bajtówWykorzystuje to wariant algorytmu mnożenia krótko opisany w akapicie mojego obfitego numeru wyrażenia regularnego . To jest spoiler . Więc nie czytaj dalej, jeśli nie chcesz, aby zepsuta Ci była jakaś zaawansowana magia wyrażeń regularnych . Jeśli chcesz spróbować samemu odkryć tę magię, zdecydowanie polecam zacząć od rozwiązania niektórych problemów z listy zalecanych problemów oznaczonych spoilerem w tym wcześniejszym poście i samodzielnego wymyślenia matematycznych spostrzeżeń.
Algorytm mnożenia jest tutaj zaimplementowany inaczej, ponieważ twierdzimy, że dwie znane wartości pomnożone razem są równe innej znanej wartości (jak również zrobiono w alternatywnej wersji wyrażenia regularnego w tym poście , aby sprawdzić, czy liczba jest idealnym kwadratem). W większości moich dotychczasowych odpowiedzi na wyrażenia regularne mnożenie jest realizowane jako obliczenie (a nie twierdzenie, mówiąc pojęciowo), gdzie celem jest znalezienie iloczynu dwóch znanych liczb. Obie metody działają w obu okolicznościach, ale pod względem golfowym są gorsze w wykonywaniu wzajemnej pracy.
Wypróbuj online!
źródło
Brachylog ,
1312 bajtówWprowadź numer kandydata jako argument wiersza polecenia. Wyjścia
true
lubfalse
. Wypróbuj online!Wyjaśnienie
Kod jest predykatem, którego dane wejściowe są nieograniczone i których wynikiem jest liczba, którą testujemy.
(Wskazówki są mile widziane. To
{+|-}
nadal jest niezręczne.)źródło
Brachylog , 9 bajtów
Odmienne podejście następnie DLosc „s odpowiedź
Pobiera N jako wynik, zwraca [P, P-14] lub [P + 14, P] z powrotem przez wejście (najpierw największa liczba)
wyjaśnienie
Wypróbuj online!
źródło
Pyth,
2220 bajtówWypróbuj online tutaj .
Edycja: Zapisane 3 bajty jako dane wejściowe zawsze będą dodatnie, więc nie trzeba odfiltrowywać wartości ujemnych z listy. Naprawiono także błąd dotyczący danych wejściowych
1
i2
kosztu 1 bajta. Poprzednia wersja:}Qsm*Ld>#0+Ld_B14fP_TU
źródło
05AB1E ,
161514 bajtówZaoszczędziłem 1 bajt, obliczając 14 z
7·
zamiastžvÍ
(nie mogę uwierzyć, że o tym nie pomyślałem).Zaoszczędzono 1 bajt dzięki Emignie
Wypróbuj online! lub Przetestuj wszystkie dane wejściowe
Wyjaśnienie
źródło
}˜så
naQ}Z
użycie danych niejawnych. Test-Suite musiałby zostać zmieniony się trochę coś jak to by zmusić go do pracy wtedy. Również bardziej oczywisty sposób pisaniažvÍ
lub7·
byłby14
;)J ,
2115 bajtówW oparciu o rozwiązanie Arnauld :
Wypróbuj online!
Poprzednia próba:
Wypróbuj online!
źródło
14 e.q:|@-]%q:
na 14 bajtówRetina 0.8.2 , 61 bajtów
Wypróbuj online! Wyjaśnienie:
Konwertuj na unary.
\1
przechwytuje większy z dwóch czynników.\2
przechwytuje stałą 14, oszczędzając bajt.\3
przechwytuje mniejszy z dwóch czynników, minus 1. Zapewnia to również, że oba czynniki wynoszą co najmniej 2.Sprawdź dwa czynniki, aby upewnić się, że co najmniej jeden z nich jest liczbą pierwszą. Pomysł użycia
\2?
został bezwstydnie skradziony z odpowiedzi @ Deadcode.Powtórz większy z dwóch czynników kilka razy równy jeden mniej niż mniejszy z dwóch czynników. Ponieważ już raz udało nam się uchwycić większy czynnik, to w końcu przechwytuje iloczyn dwóch czynników.
Upewnij się, że produkt jest równy podanej liczbie.
Bezpośrednie tłumaczenie do siatkówki 1, zastępując
$*
z*1
miałyby taką samą liczbę bajtów ale bajt można zapisać zastępując wszelkie1
S z_
S i wówczas*1
można zastąpić*
zamiast*_
. Poprzednia odpowiedź Retina 1 na 68 bajtów:Wypróbuj online! Wyjaśnienie:
Konwertuj na unary.
Znajdź wszystkie pary czynników.
Upewnij się, że jeden jest najlepszy.
Weź absolutną różnicę.
Sprawdź, czy są jakieś 14.
źródło
JavaScript (węzeł Babel) , 69 bajtów
Cholera, myślałem, że mam zamiar pokonać odpowiedź Arnaulds, ale nie .....: c
Wypróbuj online!
Chcę pozbyć się
x=>[...Array(x)].some(
części za pomocą rekurencji, aby z czasem mogła się ona skrócićWyjaśnienie
Wykorzystuje formułę
źródło
Japt , 10 bajtów
Taki sam jak moja odpowiedź JavaScript
Wypróbuj online!
źródło
Galaretka , 9 bajtów
Wypróbuj online!
źródło
APL (NARS) 16 znaków, 32 bajty
{π⍵} znalazłby faktoryzację swojego argumentu i przypuszczamy, że ostatnim elementem jego wyniku (lista dzielników n) jest maksymalny główny dzielnik n; Tutaj przypuszczamy, że jedną równoważną definicją liczby Rocco jest: n jest liczbą Rocco <=> podstawa współczynnika maksimum n: r jest taka, że jest prawdą 14 = ∣rn ÷ r [dla pseudokodu C jako 14 == abs (rn / r) ta definicja liczby Rocco wydaje się w końcu OK w zakresie 1..1000000]; zakres wartości ok wyniesie 1..maxInt; test:
źródło
C # (interaktywny kompilator Visual C #) , 99 bajtów
Wypróbuj online!
Enumerable.Range
uderza ponownie :) Używając zwariowanej flagi kompilatora, możesz trochę zredukować rzeczy, chociaż jestem fanem waniliowego rozwiązania.C # (interaktywny kompilator Visual C #) + /u:System.Linq.Enumerable, 77 bajtów
Wypróbuj online!
Poniżej znajduje się port rozwiązania Arnaulda, które wydawało się całkiem fajne. Jest obecnie najdłuższy, ale prawdopodobnie można go trochę pograć w golfa.
C # (interaktywny kompilator Visual C #) , 101 bajtów
Wypróbuj online!
źródło
APL (NARS) 30 znaków, 60 bajtów
Tutaj 0π to funkcja powiedz, jeśli jedna liczba jest liczbą pierwszą, sprawdź:
źródło
F #, 2 odpowiedzi (niekonkurencyjne)
Bardzo podobały mi się odpowiedzi @Arnauld, więc je przetłumaczyłem.
123 bajty , w oparciu o odpowiedź JavaScript
Wyjaśnienie:
125 bajtów , w oparciu o odpowiedź 05AB1E
Wyjaśnienie:
źródło
Python 2 , 58 bajtów
Dane wyjściowe według kodu wyjścia nie powiodły się (
1
) dla liczb Rocco.Wypróbuj online!
źródło