Większość z nas wie ...
że wszystkie liczby pierwsze p>3
mają formę
Ale ile jest liczb pierwszych Plus ( 6n+1
), a ile minusowych liczb pierwszych ( 6n-1
) w określonym zakresie?
Wyzwanie
Biorąc pod uwagę liczbę całkowitą k>5
, policz, ile primes<=k
jest PlusPrimes, a ile MinusPrimes .
Przykłady
bo k=100
mamy
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89]
12 MinusPrimes
i
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97]
11 PlusPrimes
bo k=149
mamy
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes
i
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes
Zasady
Twój kod musi generować 2 liczby całkowite : jedną dla MinusPrimes i jedną dla PlusPrimes w dowolnej kolejności (proszę określić, która jest która).
Oto kod-golf : wygrywa najkrótsza odpowiedź w bajtach!
Przypadki testowe
Wejście -> Wyjście [ MinusPrimes , PlusPrimes ]
6->[1,0]
7->[1,1]
86->[11,10]
986->[86,78]
5252->[351,344]
100000->[4806,4784]
4000000->[141696, 141448]
0%6
jest wielokrotnością liczby 6,1%6
nie można jej ustalić,2%6
jest wielokrotnością liczby 2,3%6
jest wielokrotnością liczby 3,4%6
jest wielokrotnością liczby 2 i5%6
nie można jej ustalić.Odpowiedzi:
05AB1E ,
109 bajtówZaoszczędzono 1 bajt dzięki Erikowi Outgolfer
Wyjścia jak
[PlusPrimes, MinusPrimes]
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
MATL , 10 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Python 2 , 77 bajtów
-2 bajty dzięki Neilowi
Wypróbuj online!
Poprzednie rozwiązanie,
838179 bajtów-1 bajt dzięki Mr. Xcoder
-2 bajty dzięki Halvard Hummel
Wypróbuj online!
Oba dane wyjściowe jako [MinusPrimes, PlusPrimes]
źródło
[]
s.Galaretka , 7 bajtów
Plus, a potem minus.
Wypróbuj online!
Jak to działa
źródło
Mathematica, 51 bajtów
Wypróbuj online!
@ngenisis grał w golfa, oszczędzając 4 bajty
Mathematica, 47 bajtów
źródło
Mod
może być także niepoprawny, a jeśli chcesz nazwać pierwszy arguments
, użyj po prostu argumentu o nazwie:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
Japt ,
151311 bajtówKolejność wyjściowa to
[+,-]
.Sprawdź to
ë
zwrócił moją uwagę na nieznaną mi wcześniej metodę tablic.Wyjaśnienie
Domniemane wprowadzenie liczby całkowitej
U
.Wygeneruj tablicę liczb całkowitych (
õ
) od 1 doU
i sprawdź, czy każda z nich jest liczbą pierwszą (j
), podając tablicę wartości logicznych.Podziel tablicę na podgrupy o długości 6.
Transponuj (
y
) i zsumuj kolumny.Uzyskaj co czwarty element tablicy i niejawnie je wyślij.
Oryginał,
19171615 bajtówSprawdź to
źródło
J , 23 bajty
Wypróbuj online!
źródło
Siatkówka ,
5351 bajtówWypróbuj online! Wyjaśnienie:
Konwertuj na unary.
Policz od 1 do
n
.Usuń liczby mniejsze niż 4.
Usuń liczby zespolone.
Weź resztę modulo 6.
Wydrukuj liczbę cyfr z resztą między 3 a 5.
Wydrukuj liczbę cyfr z resztą 1.
źródło
Rubin,
6160 bajtów(52 bajty + 8 dla
-rprimes
flagi)Zwraca tablicę postaci [plus liczby pierwsze, minus liczby pierwsze].
Zaoszczędzono 1 bajt dzięki GB!
Wypróbuj online.
źródło
count
w zakresie bez operatora ikony (zapisz 1 bajt).Perl 6 , 42 bajtów
Zaoszczędzono 1 bajt, usuwając niepotrzebne miejsce ...
Zaoszczędzono 2 bajty, reorganizując
map
połączenie - dzięki @Joshua.Zapisano 3 bajty, ponieważ
.round
jest równa.round: 1
.W rzeczywistości złożony wykładniczy jest fajny, ale z natury bardzo drogi. Zaoszczędziłem 10 bajtów po prostu porzucając ...
Wypróbuj online!
To była wersja ze złożonym wykładniczym. (Podoba mi się to zbyt mocno, aby je usunąć.) Nowa wersja działa dokładnie w ten sam sposób, tylko złożona wykładnicza jest zastępowana przez znacznie krótszy operator trójskładnikowy.
Wypróbuj online!
Wynik jest liczbą zespoloną
(PlusPrimes) + (MinusPrimes)i
. Mam nadzieję, że nie jest to zbyt sprzeczne z zasadami.Objaśnienie: Jest to funkcja, która pobiera jeden argument liczby całkowitej. Iterujemy po wszystkich liczbach całkowitych od 5 do argumentu (
(5..$_)
). Dla każdego z nich oceniamy.is-prime
(nazywa się$_
to argumentem odwzorowanego bloku), mnożymy go (jeśli jest numerowanyTrue == 1, False == 0
) przez złożony wykładniczy, który ma postaćexp(0) = 1
(dla$_%6 = 1
) lubexp(iπ/2) = i
(dla$_%6 = 5
), a na koniec zaokrągla do najbliższa liczba całkowita. Podsumowanie ich[+]
daje wynik.Wreszcie: jest naprawdę wydajny, więc nie jestem pewien, czy TIO nie przekroczy limitu czasu, zanim uzyskasz wyjście dla wyższych liczb (dla 1e5 zajmuje to 26 sekund na moim komputerze, a TIO jest nieco wolniejszy).
źródło
map
lubgrep
może czasem kosztować kilka postaci. Oszczędza to 2 znaki:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Właściwie 21 bajtów
Wypróbuj online!
Najpierw wyprowadza PlusPrimes, a następnie MinusPrimes
Wyjaśnienie:
źródło
Skumulowane , 37 bajtów
Wypróbuj online!
Raczej powoli, testy pierwszeństwa dla każdego K < N . Działa podobnie do mojej odpowiedzi J.
źródło
MATLAB 2017a, 29 bajtów
Objaśnienie:
primes(k)
zlicza wszystkie liczby pierwsze do k włącznie.mod(primes(k),6)'
przyjmuje moduł 6 wszystkich liczb pierwszych i transponuje go, aby suma przebiegała wzdłuż właściwego wymiaru.==[5,1]
ustawia wszystkie piątki (minusPrimes) na 1 w pierwszej kolumnie i wszystkie piątki (plusPrimes) na 1 w drugiej kolumnie.sum()
sumuje każdą kolumnę.To wychodzi
[minusPrime, plusPrime]
źródło
Japt ,
1816 bajtów-2 bajty dzięki @Oliver
Wypróbuj online!
Dane wyjściowe w formacie
[PlusPrimes, MinusPrimes]
.źródło
[5,1]
żeby policzyć i jesteś pierwszy.f
ILTER i ciąg; Użyłem funkcji mapowaniaõ
i tablicy. Poza tym wpadłem na[5,1]
pomysł z innej odpowiedzi.5â
aby uzyskać[1,5]
C #,
202179174 bajtów-23 Bajty dzięki Mr. Xcoder
-5 bajtów dzięki Cyoce
Funkcja, która zwraca tablicę o długości 2,
[MinusPrimes, PlusPrimes]
Wykonaj przez wywołaniea(n)
.Prawidłowo sformatowany kod w Try It Online: tutaj
źródło
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
Haskell ,
8169 bajtówWypróbuj online!
Pierwszym rozwiązaniem było:
Ale przeczytałem odpowiedź w0lf w Ruby ...
źródło
Pyth , 15 bajtów
Pakiet testowy.
Pyth , 16 bajtów
Pakiet testowy.
W jaki sposób?
Wyjaśnienie nr 1
Wyjaśnienie nr 2
Alternatywy:
źródło
Galaretka ,
12 1110 bajtówDzięki @cairdcoinheringaahing za kilka wskazówek na czacie. Dzięki @Dennis za zapisanie jednego bajtu na czacie.
Wypróbuj online!
Galaretka , 11 bajtów
Wypróbuj online!
Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa?
Wyjaśnienie nr 1
Wyjaśnienie nr 2
Wyjaśnienie nr 3
źródło
Java 8,
141140138106101100969481 bajtówZwraca całkowitą matrycą z dwóch wartości, w odwrotnej kolejności w stosunku do opisu prowokacji:
[plusPrime, minusPrime]
.Port @Xynos 'C # odpowiedź , ja grałem po
394042 bajtów.Ogromna pomoc @Nevay dla kolejnego ogromnego -55 bajtów.
Wyjaśnienie:
Wypróbuj tutaj. (Końcowy przypadek testowy
4000000
nieznacznie przekracza limit 60 sekund.)źródło
n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
(-1 dzięki twojemuj++,++j
)n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
([plusPrime, minusPrime]
).n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
JavaScript (ES6),
8382806866 bajtówOkazało się, że w pełni rekurencyjne rozwiązanie było znacznie krótsze niż mapowanie tablicy!
Kolejność wyjściowa to
[-,+]
. Występuje błąd z przepełnieniem około 3490.Spróbuj
źródło
CJam , 19 bajtów
Program, który pobiera dane wejściowe ze STDIN i wysyła dwie liczby oddzielone znakiem nowej linii przez STDOUT.
Wypróbuj online!
Wyjaśnienie
źródło
R + cyfry ,
66605840 bajtów-16 bajtów dzięki Jarko Dubbeldam! Następnie grałem w golfa o kolejne dwa bajty.
Drukuje
PlusPrimes MinusPrimes
na standardowe wyjście; czyta ze standardowego.table
zestawia w tabeli liczbę wystąpień wartości w wektorze wejściowym w porządku rosnącym wartości. Stąd, ponieważ istnieją tylko dwie wartości, mianowicie1
i5
(mod 6), jest to dokładnie ta funkcja, której potrzebujemy, wraz znumbers::Primes
, która zwraca wszystkie liczby pierwsze między4
i dane wejściowe.Wypróbuj online!
Podstawa R ,
9791898665 bajtówtutaj także garść bajtów zapisanych przez Jarko
Jest to prawie identyczne z powyższym, z tym wyjątkiem, że oblicza wszystkie liczby pierwsze w podstawie R, zamiast używać pakietu, i zwraca dane wyjściowe funkcji zamiast wypisywania. Na wyjściu widać, że zwraca tabelę z nazwami
1
i5
liczbami poniżej.Wypróbuj online!
źródło
all(x%%2:x^.5>0)
, wszystko niezerowe jest już prawdą, więcall(x%%2:x^.5)
też działa4
możemy się pozbyć,>4
ponieważ nie będziemy2
już tam jako liczby pierwsze, więc gra w golfa do 40 bajtów.Pari / GP , 41 bajtów
Wypróbuj online!
źródło
JavaScript (SpiderMonkey) ,
151,140, 131 bajtówWypróbuj online!
Dzięki kudłaty za pomoc w naprawie błędów i gra w golfa.
Wyjaśnienie:
źródło
17,15
za 149 (powinno być18,15
). Musisz zwiększyć rozmiar tablicy o 1: TIO . Nawiasem mówiąc, jest to po prostu „waniliowy” ES6, nic specyficznego dla SpiderMonkey. Możesz także użyć fragmentów stosu dla JS zamiast TIO. I masz dużo miejsca, które możesz usunąć.