Plus liczby pierwsze i minus liczby pierwsze


35

Większość z nas wie ...

że wszystkie liczby pierwsze p>3mają formę wprowadź opis zdjęcia tutaj

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<=kjest PlusPrimes, a ile MinusPrimes .

Przykłady

bo k=100mamy
[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=149mamy
[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 : 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]

45
Nie wiedziałem! :(
Stewie Griffin

13
@StewieGriffin, łatwo jest intuicyjnie spojrzeć na sekwencję modułu: 0%6jest wielokrotnością liczby 6, 1%6nie można jej ustalić, 2%6jest wielokrotnością liczby 2, 3%6jest wielokrotnością liczby 3, 4%6jest wielokrotnością liczby 2 i 5%6nie można jej ustalić.
zzzzBov,

3
@zzzzBov, który byłby naprawdę pomocny, gdybym wiedział, dlaczego moduł ma sekwencję i co to znaczy dla liczb pierwszych ... Chciałbym, żeby liceum uczyło teorii liczb ...
Socratic Phoenix

@SocraticPhoenix, moduł oznacza „pozostałość po podziale”. 0, 6, 12 itd. Wszystkie dają 0 po podzieleniu przez 6; Wszystkie 1, 7, 13 dają 1. Ponieważ szukamy liczb, których nie można podzielić na czynniki, wiedza o tym, że liczba jest podzielna przez liczbę całkowitą większą niż 1, mówi nam, że liczba nie jest liczbą pierwszą.
zzzzBov

Odpowiedzi:


10

05AB1E , 10 9 bajtów

Zaoszczędzono 1 bajt dzięki Erikowi Outgolfer

Wyjścia jak [PlusPrimes, MinusPrimes]

LDpÏ6%5Ñ¢

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

L             # push range [1 ... input]
 DpÏ          # keep only primes
    6%        # mod each by 6
      5Ñ      # divisors of 5 [1, 5]
        ¢     # count


6

Python 2 , 77 bajtów

-2 bajty dzięki Neilowi

lambda x:[sum(all(n%j for j in range(2,n))for n in range(i,x,6))for i in 7,5]

Wypróbuj online!

Poprzednie rozwiązanie, 83 81 79 bajtów

-1 bajt dzięki Mr. Xcoder
-2 bajty dzięki Halvard Hummel

lambda x:map([all(n%i for i in range(2,n))*n%6for n in range(4,x)].count,[5,1])

Wypróbuj online!
Oba dane wyjściowe jako [MinusPrimes, PlusPrimes]





Zrobiłem zbyt wiele interpretacji tablic JavaScript - zapomniałem, że listy w Pythonie często nie potrzebują []s.
Neil

Więc dzielimy n przez wszystkie liczby od i do n-1, aby sprawdzić, czy jest liczbą pierwszą, a następnie generujemy wszystkie liczby całkowite (5,11, ...) i (7,13, ...) i testujemy, czy liczba, o której mowa, istnieje i policz je. Wydaje się skuteczny. ;)
Jak

5

Galaretka , 7 bajtów

s6ÆPSm4

Plus, a potem minus.

Wypróbuj online!

Jak to działa

s6ÆPSm4  Main link. Argument: n

s6       Split [1, ..., n] into chunks of length 6.
  ÆP     Test all integers for primality.
    S    Sum across columns.
         This counts the primes of the form 6k + c for c = 1, ..., 6.
     m4  Take every 4th element, leaving the counts for 6k + 1 and 6k + 5.

5

Mathematica, 51 bajtów

(s=#;Mod[Prime~Array~PrimePi@s,6]~Count~#&/@{5,1})&

Wypróbuj online!

@ngenisis grał w golfa, oszczędzając 4 bajty

Mathematica, 47 bajtów

sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}

Modmoże być także niepoprawny, a jeśli chcesz nazwać pierwszy argument s, użyj po prostu argumentu o nazwie:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
ngenisis

5

Japt , 15 13 11 bajtów

Kolejność wyjściowa to [+,-].

õj ò6 yx ë4

Sprawdź to

  • Czerpałem inspirację z Jelly's Jelly, ale po grze w golfa jest już bliżej bycia portem.
  • 2 bajty zaoszczędzone dzięki Oliverowi, który ëzwrócił moją uwagę na nieznaną mi wcześniej metodę tablic.

Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.

õj

Wygeneruj tablicę liczb całkowitych ( õ) od 1 do Ui sprawdź, czy każda z nich jest liczbą pierwszą ( j), podając tablicę wartości logicznych.

ò6

Podziel tablicę na podgrupy o długości 6.

yx

Transponuj ( y) i zsumuj kolumny.

ë4

Uzyskaj co czwarty element tablicy i niejawnie je wyślij.


Oryginał, 19 17 16 15 bajtów

õ fj
5â £è_%6¥X

Sprawdź to

  • 1 bajt dzięki inspirowanej sugestii Olivera, aby użyć dzielników 5 po tym, jak spoczęłem na laurach dzieląc 15 na tablicę.

3

J , 23 bajty

1#.5 1=/6|_1 p:@i.@p:>:

Wypróbuj online!

1#.5 1=/6|_1 p:@i.@p:>:   input: y
          _1       p:     number of primes
                     >:   less than y + 1
             p:@i.        prime range from 0 to that number
        6|                get residues modulo 6
   5 1=/                  table of values equal to 5 or 1
1#.                       sum of each (antibase 1)

3

Siatkówka , 53 51 bajtów

.+
$*
1
$`1¶
G`1111
A`^(11+)\1+$
1{6}

*M`111
\b1\b

Wypróbuj online! Wyjaśnienie:

.+
$*

Konwertuj na unary.

1
$`1¶

Policz od 1 do n.

G`1111

Usuń liczby mniejsze niż 4.

A`^(11+)\1+$

Usuń liczby zespolone.

1{6}

Weź resztę modulo 6.

*M`111

Wydrukuj liczbę cyfr z resztą między 3 a 5.

\b1\b

Wydrukuj liczbę cyfr z resztą 1.


3

Rubin, 61 60 bajtów

(52 bajty + 8 dla -rprimesflagi)

->n{[1,5].map{|x|(4..n).count{|i|i.prime?&&i%6==x}}}

Zwraca tablicę postaci [plus liczby pierwsze, minus liczby pierwsze].

Zaoszczędzono 1 bajt dzięki GB!

Wypróbuj online.


Zainspirowałem się twoją odpowiedzią i zaktualizowałem moją (w Haskell)!
jferard

@jferard Cieszę się, że to słyszę! :)
Cristian Lupascu,

Możesz używać countw zakresie bez operatora ikony (zapisz 1 bajt).
GB

3

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 ...

{[+] map {.is-prime*($_%6-1??i!!1)},5..$_}

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.

{[+] map {.is-prime*exp(π*($_%6-1)i/8).round},5..$_}

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 numerowany True == 1, False == 0) przez złożony wykładniczy, który ma postać exp(0) = 1(dla $_%6 = 1) lub exp(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).


w porządku. dobra robota!

Myślę, że masz na myśli w wydajny? Dobra metoda!
Jonathan Allan

To była prymitywna próba ironii :—).
Ramillies,

Podczas gry w golfa stosowanie metod maplub grepmoże czasem kosztować kilka postaci. Oszczędza to 2 znaki:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Joshua

Zapomniałem to zrobić tutaj, dziękuję za zwrócenie mojej uwagi!
Ramillies,

2

Właściwie 21 bajtów

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜

Wypróbuj online!

Najpierw wyprowadza PlusPrimes, a następnie MinusPrimes

Wyjaśnienie:

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜
u5x                    range(5, n+1)
   `p░                 primes in range
      ⌠6@%1=;`╖*ƒ⌡M    for each prime:
       6@%               mod 6
          1=             equal to 1
            ;`╖*ƒ        execute ╖ if p%6==1 (add 1 to register 0, consuming p)
                   l   length of resulting list (MinusPrimes)
                    ╜  push value in register 0 (PlusPrimes)


2

MATLAB 2017a, 29 bajtów

sum(mod(primes(k),6)'==[5,1])

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]


2

Japt , 18 16 bajtów

-2 bajty dzięki @Oliver

õ_j ©Z%6
5â £è¥X

Wypróbuj online!

Dane wyjściowe w formacie [PlusPrimes, MinusPrimes].


Hmm ... Właśnie wróciłem do biurka, grałem w golfa do 17 bajtów, a potem zobaczyłem, że to opublikowałeś ... nie wiem, czy powinienem to opublikować, czy nie, ponieważ sedno obu naszych rozwiązań jest mapowane [5,1]żeby policzyć i jesteś pierwszy.
Shaggy

@Shaggy IMO twoje rozwiązanie ma wystarczająco dużo różnic, aby pozostać osobnym postem. Użyłeś fILTER i ciąg; Użyłem funkcji mapowania õi tablicy. Poza tym wpadłem na [5,1]pomysł z innej odpowiedzi.
Justin Mariner

Zastanowię się nad tym; rozwiązania w różnych językach przy użyciu podobnych metod (nawet jeśli jedno „pożyczyłem” je od drugiego) jest w porządku, ale 2 rozwiązania w tym samym języku nie pasują do mnie dobrze. Na razie edytowałem w swoim poście jako alternatywę.
Kudłaty

Postanowiłem z tym pobiec, a potem ogoliłem kolejny bajt.
Shaggy

Możesz użyć, aby uzyskać[1,5]
Oliver

2

C #, 202 179 174 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łanie a(n).

int[]a(int n){int[]r={0,0};for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}

Prawidłowo sformatowany kod w Try It Online: tutaj


Czy możesz dodać link tio?
Pan Xcoder

Przepraszamy za 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;}
grę

193 bajtów: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;}
Pan Xcoder

Lmao, że to kochasz, prawda?)
MysticVagabond

1
dziękuję za wszelką pomoc, ponieważ wysłałeś osobną odpowiedź i podałeś, że to mój golf, po prostu
opuścę

2

Haskell , 81 69 bajtów

f n=(\r->sum[1|i<-[2..n],all((>0).rem i)[2..i-1],rem i 6==r])<$>[5,1]

Wypróbuj online!

Pierwszym rozwiązaniem było:

r!l=sum[1|i<-l,rem i 6==r]
f n|l<-[i|i<-[2..n],all((>0).rem i)[2..i-1]]=(5!l,1!l)

Ale przeczytałem odpowiedź w0lf w Ruby ...


1

Pyth , 15 bajtów

/K%R6fP_TSQ5/K1

Pakiet testowy.

Pyth , 16 bajtów

m/%R6fP_TSQd,1 5

Pakiet testowy.


W jaki sposób?

Wyjaśnienie nr 1

/ K% R6fP_TSQ5 / K1 - Pełny program.

     fP_TSQ - Filtruj liczby pierwsze w zakresie [1 ... wejście].
  % R6 - Mod 6 na każdym.
 K - Przypisz je do zmiennej K.
/ 5 - Policz wystąpienia 5 w K.
            / K1 - Policz wystąpienia 1 w K.
                - Wyjmij wynik niejawnie.

Wyjaśnienie nr 2

m /% R6fP_TSQd, 1 5 - Pełny program.

     fP_TSQ - Filtruj liczby pierwsze w zakresie [1 ... wejście]
  % R6 - Mod 6 na każdym.
            , 1 5 - Naciśnij listę [1, 5]
m / d - Policz, ile ich jest.  
                 - Wyjmij wynik niejawnie. 

Alternatywy:

/ K% R6fP_TSQ5 / KhZ (16 bajtów)
K% R6fP_TSQ / K5 / K1 (16 bajtów)
m /% R6fP_TSQdj15T (16 bajtów)
m /% R6fP_TSQd [1 5 (16 bajtów)   
m /% R6fP_TSQdsM`15 (17 bajtów)
m /% R6.MP_ZSQd, 1 5 (17 bajtów)
m /% R6.MP_ZSQdj15T (17 bajtów)
m /% R6.MP_ZSQd [1 5 (17 bajtów)

2
Gratulacje na 10k !!
Luis Mendo

@LuisMendo Wielkie dzięki :-)
Pan Xcoder

1

Galaretka ,  12 11  10 bajtów

Dzięki @cairdcoinheringaahing za kilka wskazówek na czacie. Dzięki @Dennis za zapisanie jednego bajtu na czacie.

ÆR%6ċЀ1,5

Wypróbuj online!

Galaretka , 11 bajtów

ÆR%6µ1,5=þS

Wypróbuj online!

Galaretka , 11 bajtów

ÆR%6µċ5,ċ1$

Wypróbuj online!


Jak to działa?

Wyjaśnienie nr 1

ÆR%6ċЀ1,5   As usual, full program.

ÆR           Get all the primes in the range [2...input].
  %6         Modulo each by 6.
       1,5   The two-element list [1, 5].
    ċЀ      Count the occurrences of each of ^ in the prime range.

Wyjaśnienie nr 2

ÆR%6µ1,5=þS   As usual, full program.

ÆR            Get all the primes in the range [2...input].
  %6          Modulo each by 6.
    µ         Chain separator.
     1,5      The two-element list [1, 5].
        =     Equals?   
         þ    Outer product.     
          S   Sum.

Wyjaśnienie nr 3

ÆR%6µċ5,ċ1$   As usual, full program.

ÆR            All the primes in the range [2...input].
  %6          Modulo each by 6.
    µ     $   Some helpers for the chains.
       ,      Two element list.
     ċ5       The number of 5s.
        ċ1    The number of 1s.

1

Java 8, 141 140 138 106 101 100 96 94 81 bajtów

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;}

Zwraca 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 39 40 42 bajtów.
Ogromna pomoc @Nevay dla kolejnego ogromnego -55 bajtów.

Wyjaśnienie:

Wypróbuj tutaj. (Końcowy przypadek testowy 4000000nieznacznie przekracza limit 60 sekund.)

n->{                   // Method with integer parameter and integer-array return-type
  int r[]={0,0},       //  Return integer-array, starting at [0,0]
      c;               //  Temp integer
  for(;n-->4;          //  Loop (1) as long as the input is larger than 4
                       //  and decrease `n` by 1 before every iteration
      r[n%6/4]+=c)     //    After every iteration, increase the plus or minus prime by `c`
                       //    (where `c` is either 0 or 1)
    for(c=n;           //   Reset `c` to `n`
        c>1;           //   And inner loop (2) as long as `c` is larger than 1
      c=               //    Change `c` to:
        c-1&~n%c>>-1;  //     inverting the bits of `n`,                    [~n]
                       //     modulo-`c` that result,                       [%c]
                       //     then bit-shift right that by -1,              [>>-1]
                       //     and then bitwise-AND that result with `c-1`   [c-1&]
    );                 //   End of inner loop (2)
                       //  End of loop (1) (implicit / single-line body)
  return r;            //  Return result integer-array
}                      // End of method

1
106 bajtów: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;}
Nevay

1
101 bajtów: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;}
Nevay

1
96 bajtów: 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 twojemu j++,++j)
Nevay

1
94 bajty: 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]).
Nevay

1
81 bajtów: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;}
Nevay

1

JavaScript (ES6), 83 82 80 68 66 bajtów

Okazał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.

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

Spróbuj

o.innerText=(

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

)(i.value=6);oninput=_=>o.innerText=i.value>5?f(+i.value):[0,0]
<input id=i min=6 type=number><pre id=o>


0

CJam , 19 bajtów

ri){mp},6f%_5e=p1e=

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

ri){mp},6f%_5e=p1e=

ri                        Read integer k
  )                       Add 1
       ,                  Filter the (implicit) array [0 1 ... k] ...
   {mp}                   ... on the function "is prime"
         f                Map over the resulting array...
          %               ... the function "modulus" ...
        6                 ... with extra parameter 6
           _              Duplicate the resulting array
             e=           Count occurrences ...
            5             ... of number 5
               p          Print with newline
                 e=       Count occurrences ...
                1         ... of number 1. Implicitly display

0

R + cyfry , 66 60 58 40 bajtów

-16 bajtów dzięki Jarko Dubbeldam! Następnie grałem w golfa o kolejne dwa bajty.

cat(table(numbers::Primes(4,scan())%%6))

Drukuje PlusPrimes MinusPrimesna standardowe wyjście; czyta ze standardowego.

tablezestawia 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, mianowicie 1i 5(mod 6), jest to dokładnie ta funkcja, której potrzebujemy, wraz z numbers::Primes, która zwraca wszystkie liczby pierwsze między 4i dane wejściowe.

Wypróbuj online!

Podstawa R , 97 91 89 86 65 bajtów

tutaj także garść bajtów zapisanych przez Jarko

function(n)table((5:n)[sapply(5:n,function(x)all(x%%2:x^.5))]%%6)

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 1i 5liczbami poniżej.

Wypróbuj online!



(Dennis dodano numery Tio tak, że teraz działa :))
JAD


all(x%%2:x^.5>0), wszystko niezerowe jest już prawdą, więc all(x%%2:x^.5)też działa
JAD

@JarkoDubbeldam bardzo miło! Okazuje się, ponieważ wszystkie wartości są większe, niż 4możemy się pozbyć, >4ponieważ nie będziemy 2już tam jako liczby pierwsze, więc gra w golfa do 40 bajtów.
Giuseppe,


0

JavaScript (SpiderMonkey) , 151 , 140 , 131 bajtów

n=>[...Array(n+1).keys()].splice(5).filter(a=>!/^1?$|^(11+?)\1+$/.test("1".repeat(a))).reduce((r,a)=>(a%6<2?r[1]++:r[0]++,r),[0,0])

Wypróbuj online!

Dzięki kudłaty za pomoc w naprawie błędów i gra w golfa.

Wyjaśnienie:

n=>                                                   // Create a lambda, taking n
    [...Array(n+1).keys()]                            // Create a list from 0 to n+1
        .splice(5)                                    // remove first five elements
        .filter(a=>                                   // filter the list to get primes
             !/^1?$|^(11+?)\1+$/.test("1".repeat(a))) // using the famous regex here: https://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex 
        .reduce((r,a)=>                               // reduce the list
           (a%6<2?r[1]++:r[0]++,r),                   // by counting plus primes
           [0,0])                                     // and minus primes

1
Powraca 17,15za 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ąć.
Shaggy

1
Kolejne kilka szybkich oszczędności dla Ciebie, aby sprowadzić Cię do 131 bajtów .
Shaggy

@Shaggy Nie zdawałem sobie sprawy, że możesz użyć redukcji w ten sposób.
Pureferret
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.