Niedawno przeczytałem powieść „Samotność liczb pierwszych”, w której główni bohaterowie są nieco porównani do podwójnych liczb pierwszych („ zawsze razem, ale nigdy nie dotykają ”).
Liczby bliźniacze jest liczbą pierwszą, która jest mniejsza albo dwa lub więcej niż dwa inne liczby pierwszej -do przykład podwójnego głównego pary (41, 43). Innymi słowy, liczba pierwsza bliźniacza jest liczbą pierwszą, która ma pierwszą dwójkę. Czasami termin podwójna liczba pierwsza jest używany dla pary podwójnych liczb pierwszych; alternatywną nazwą tego jest prime twin lub prime pair. Wikipedia
Chociaż nie podobała mi się ta przygnębiająca powieść, a odkąd ostatnio wpadłem w PPCG, to nasuwało mi się pytanie ...
Zadanie:
Biorąc pod uwagę dodatnią liczbę całkowitą N> 4, znajdź samotne liczby pierwsze ( izolowane liczby pierwsze AKA ) między najbliższymi parami liczb pierwszych bliźniaczych .
Proszę zauważyć, że w tym przypadku, z pojęciem samotnych liczb pierwszych , mam na myśli wszystkie liczby pierwsze, które nie są liczbami podwójnymi i pomiędzy parami liczb pierwszych . Dlatego N> 4, ponieważ dwie pierwsze pary liczb pierwszych to (3, 5) i (5, 7).
Przykład:
- N = 90.
- Znajdź dwie pierwsze pary podwójnych liczb pierwszych <N i> N. Są to: (71, 73) i (101, 103).
- Znajdź samotne liczby pierwsze w przedziale> 73 i <101.
- Są to: 79, 83, 89, 97.
Przypadki specjalne:
- Jeśli N znajduje się między dwiema liczbami podwójnymi liczb pierwszych, znajdź najbliższe pary liczb pierwszych> N + 1 i <N-1. Przykład: N = 72, znajdź najbliższe pary liczb pierwszych bliźniaczych> 73 i <71, a następnie wyklucz z listy 71 i 73, ponieważ nie są samotnymi liczbami pierwszymi . Tak więc dla N = 72 oczekiwany wynik to: 67,
71,73, 79, 83, 89, 97 - Jeśli N należy do dwóch liczb pierwszych bliźniaczych, na przykład N = 73, najbliższymi parami liczb pierwszych bliźniaczych są (71, 73) i (101, 103). Jeśli N = 71, najbliższymi parami bliźniaczych liczb pierwszych są (59, 61) i (71, 73).
Przypadki testowe:
N = 70 > Lonely primes are: 67
N = 71 > Lonely primes are: 67
N = 72 > Lonely primes are: 67, 79, 83, 89, 97 (not the twins 71 and 73)
N = 73 > Lonely primes are: 79, 83, 89, 97
N = 90 > Lonely primes are: 79, 83, 89, 97
N = 201 > Lonely primes are: 211, 223
N = 499 > Lonely primes are: 467, 479, 487, 491, 499, 503, 509
Zasady:
- Napisz pełny program lub funkcję, która pobierze liczbę N ze standardowego wejścia.
- Wypisuje listę samotnych liczb pierwszych w czytelnym formacie jako csv, lista, tablica itp.
- Najkrótszy kod wygrywa.
- Podaj (jeśli to możliwe) testowe skrzypce online.
Odpowiedzi:
Właściwie 47 bajtów
To rozwiązanie dotyczy przypadku, w którym
n
znajduje się między dwiema liczbami podwójnymi, sprawdzając, czy dolna granica jest większa z pary podwójnych liczb pierwszych (eliminując podwójną liczbę pierwszą po lewej stronie od bycia naszą dolną granicą) i czy górna granica jest mniejszy pary liczb pierwszych bliźniaczych (eliminując Prime bliźniaka na prawo od nas od bycia nasza górna granica). Aby zapobiec włączeniu bliźniaczych liczb pierwszych do naszego zakresu, gdy mamy dolną i górną granicę, musimy usunąć liczby pierwszep
tam, gdziep-2
ORp+2
jest liczbą pierwszą, stąd logiczne OR i negować w kodzie.Jest to trochę długi i prawdopodobnie można go jeszcze pograć w golfa. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Ungolfing
źródło
23
gdy24
podano dane wejściowe . Te liczby bliźniacze granice powinny być17 / 19
i29 / 31
, i23
jest to odosobniony w zakresie podstawowym19 .. 29
.p
mówi się, że25
jest liczbą pierwszą, nie został jeszcze naprawiony, lub Dennis nie ściągnął Właściwie od czasu naprawy błędu. Pozwól mi sprawdzić.PowerShell v2 +,
237149147231216181174169166 bajtówPobiera dane wejściowe
$n
. Definiuje nową funkcjęf
jako funkcję regularną wyrażenia regularnego (tutaj zwraca wartość logiczną, jeśli wejście jest liczbą pierwszą, czy nie).Następna część
$i
jest równa$n
, a następnie zapętla się w górę, aż znajdziemy dolną połowę górnej granicy podwójnej pary pierwszej. Np. Dla wprowadzania90
zatrzymuje się na$i=101
.Następnie zapętlamy od górnej granicy w dół. Wiem, wygląda na nieskończoną pętlę, ale ostatecznie się skończy.
Jeśli aktualna liczba jest liczbą pierwszą (
f(--$i)
), ale jej+/- 2
nie jest liczbą pierwszą, dodajemy$i
do rurociągu. Jeśli jednak+/- 2
jest liczbą pierwszą, sprawdzamy, czy jesteśmy niżsi niż$n-1
(tj. W celu uwzględnienia sytuacji, gdy znajduje się w podwójnej parze liczb pierwszych), w którym momencie myexit
. Po zakończeniu programu potok jest drukowany do ekranowania przez domniemanieWrite-Output
.NB - Ze względu na strukturę pętli drukuje liczby pierwsze w kolejności malejącej. OP wyjaśniła, że to w porządku.
Przykłady
Dane wyjściowe są tutaj oddzielone spacjami, ponieważ jest to domyślna metoda stringowania dla tablicy.
źródło
Haskell, 105 bajtów
Wypróbuj online
źródło
JavaScript,
186183168158 bajtówźródło
PHP, 207 bajtów
4754 bajtów dlais_prime
funkcji, której PHP nie ma. Pokonałbym Mathematica bez tego. :-REbiegać z
-r
. drukuje przecinek końcowy.awaria
Uwaga :
is_prime
Funkcja faktycznie wracatrue
do$n<2
; ale przynajmniej nie daje ostrzeżenia. Wstaw$n=
przed,$n>1
aby naprawić.źródło
Mathematica,
169157 bajtówźródło
Rakieta 228 bajtów
Wadą tej wersji jest to, że wyszukuje wszystkie liczby pierwsze do N, a nie tylko te wokół N.
Wersja bez golfa:
Testowanie:
Wydajność:
źródło
Rakieta 245 bajtów
Wersja bez golfa:
Wydajność:
źródło
Python 2.7: 160 bajtów
sugestie są mile widziane :)
źródło