Czy mam najlepszego bliźniaka?

23

Liczba całkowita jest liczbą pierwszą wtedy i tylko wtedy, gdy jest dodatnia i ma dokładnie 2 różne dzielniki: 1 i siebie. Podwójna liczba pierwsza składa się z dwóch elementów: pi p±2oba są pierwszymi.

Jako dane wejściowe otrzymasz dodatnią liczbę całkowitą. Twoim zadaniem jest zwrócenie wartości prawda / fałsz w zależności od tego, czy dana liczba całkowita należy do pary podwójnej, zgodnie ze standardowym regułami (wartości muszą być spójne).

Przypadki testowe

  • Prawda (Twin Primes): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (nie Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

To jest , więc wygrywa najkrótszy kod w bajtach!

Taylor Scott
źródło
czy 13 jest najlepszym bliźniakiem?
LiefdeWen
@LiefdeWen Tak, ponieważ należy do pary (11, 13)
daniero

Odpowiedzi:

18

Brachylog , 9 8 bajtów

ṗ∧4√;?+ṗ

Wypróbuj online!

Wyjaśnienie

ṗ           Input is prime
 ∧          And
  4√        A number whose square is 4 (i.e. -2 or 2)
    ;?+     That number + the Input…
       ṗ    …is prime
Fatalizować
źródło
2
Pokonanie galaretki i wiązanie 05AB1E, miło
Stephen
3
Sprytne użycie! +1
Erik the Outgolfer
11

Galaretka , 10 9 bajtów

%6+_2_ÆP⁺

Wypróbuj online!

tło

Z wyjątkiem (3, 5) wszystkie podwójne pary pierwsze mają postać (6k - 1, 6k + 1) .

Ponieważ (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 i
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6K - 1 , ponieważ wejście n> 3 , jest wystarczająca, aby sprawdzić, czy n i n + n% 6 - 3 są liczbą pierwszą.

Wzór ten stanie się pracę dla n = 3 , a także, jak 3 + 3% 6 - 3 = 3 jest pierwsza i 3 jest głównym pojedyncze.

Jak to działa

%6+_2_ÆP⁺  Main link. Argument: n

%6         Compute n%6.
  +        Add n to the result.
   _2      Subtract 2.
     _ÆP   Subtract 1 if n is prime, 0 if not.
           If n is not a prime, since (n + n%6 - 2) is always even, this can only
           yield a prime if (n + n%6 - 2 = 2), which happens only when n = 2.
        ⁺  Call ÆP again, testing the result for primality.
Dennis
źródło
7

Python 3 , 53 bajty

lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2

Wypróbuj online!

tło

Wszystkie liczby całkowite przyjmują jedną z następujących postaci, z liczbą całkowitą k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Od 6k - 2 , 6k i 6k + 2 są parzyste, a ponieważ 6k - 3 można podzielić przez 3 , wszystkie liczby pierwsze oprócz 2 i 3 muszą mieć postać 6k - 1 lub 6k + 1 . Ponieważ różnica pary podwójnej liczby pierwszej wynosi 2 , z wyjątkiem (3, 5) , wszystkie pary liczb pierwszych mają postać (6k - 1, 6k + 1) .

Niech n będzie mieć postać 6k ± 1 .

  • Jeśli n = 6k -1 , to n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Jeśli n = 6k + 1 , to n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Zatem jeśli n jest częścią podwójnej pary pierwszej, a n ≠ 3 , to jego bliźniak będzie wynosił n + n% 6-3 .

Jak to działa

Python nie ma wbudowanego testu pierwszeństwa. Chociaż istnieją krótkie sposoby na sprawdzenie pojedynczej liczby pod kątem pierwszeństwa, zrobienie tego dla dwóch liczb byłoby długotrwałe. Zamiast tego będziemy pracować z dzielnikami.

sum((n+n%6-3)*n%k<1for k in range(2,4*n))

zlicza liczbę całkowitą k w interwale [2, 4n) dzieli (n + n% 6 - 3) n równomiernie, tzn. zlicza liczbę dzielników (n + n% 6 - 3) n w przedziale [2 , 4n) . Twierdzimy, że liczba ta wynosi 2 wtedy i tylko wtedy, gdy n jest częścią podwójnej pary pierwszej.

  • Jeśli n = 3 (liczba podwójna), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 ma dwa dzielniki ( 3 i 9 ) w [2, 12) .

  • Jeśli n> 3 jest podwójną liczbą pierwszą, jak widać wcześniej, m: = n + n% 6 - 3 jest jej bliźniakiem. W tym przypadku mn ma dokładnie cztery dzielniki: 1, m, n, mn .

    Od n> 3 mamy m> 4 , więc 4n <mn i dokładnie dwa dzielniki ( m i n ) mieszczą się w przedziale [2, 4n) .

  • Jeśli n = 1 , to (n + n% 6 - 3) n = 1 + 1 - 3 = -1 nie ma dzielników w [2, 4) .

  • Jeśli n = 2 , to (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 ma jeden dzielnik (sam) w [2, 8) .

  • Jeśli n = 4 , to (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 ma cztery dzielniki ( 2 , 4 , 5 i 10 ) w [2, 16) .

  • Jeżeli n> 4 jest parzyste, 2 , n / 2 , a n wszystkie dzielą n, a zatem (n + n% 6-3) n . Mamy n / 2> 2 od n> 4 , więc są co najmniej trzy dzielniki w [2, 4n) .

  • Jeśli n = 9 , to (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 ma trzy dzielniki ( 3 , 9 i 21 ) w [2, 36) .

  • Jeśli n> 9 jest wielokrotnością 3 , to 3 , n / 3 , a n wszystkie dzielą n, a zatem (n + n% 6-3) n . Mamy n / 3> 3 od n> 9 , więc są co najmniej trzy dzielniki w [2, 4n) .

  • Wreszcie, jeśli n = 6k ± 1> 4 nie jest liczbą podwójną, n lub m: = n + n% 6-3 musi być złożone i dlatego należy przyjąć odpowiedni dzielnik d> 1 .

    Ponieważ albo n = m + 2 lub m = n + 2 i n, m> 4 , liczby całkowite d , m i nodrębnymi dzielnikami mn . Ponadto, m <n + 3 <4n od n> 1 , więc mn ma co najmniej trzy dzielniki w [2, 4n) .

Dennis
źródło
Łał. Taki krótki kod, a jednak tak wiele specjalnych przypadków, które musi poprawnie obsługiwać. Czy jest jakiś powód, dla którego mówisz Python 3? O ile mogę powiedzieć, działa również w Pythonie 2.
kasperd
Tak, to zadziała równie dobrze w Pythonie 2. The 3 jest częścią automatycznie generowanego postu SE z TIO.
Dennis
5

05AB1E , 10 9 bajtów

Zaoszczędzono 1 bajt dzięki Datboi

ÌIÍ‚pZIp*

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply
Emigna
źródło
1
Użyj ÌIÍ‚zamiast 40SÍ+-1 bajtu
Datboi
3

Mathematica, 33 bajty

(P=PrimeQ;P@#&&(P[#+2]||P[#-2]))&

Wypróbuj online!

J42161217
źródło
3

MATL , 11 bajtów

HOht_v+ZpAa

Dane wyjściowe to 0lub 1.

Wypróbuj online!

Wyjaśnienie

H    % Push 2
O    % Push 0
h    % Concatenate horizontally: gives [2 0]
t_   % Push a negated copy: [-2 0]
v    % Concatenate vertically: [2 0; -2 0]
+    % Add to implicit input
Zp   % Isprime
A    % All: true for columns that only contain nonzeros
a    % Any: true if there is at least a nonzero. Implicit display
Luis Mendo
źródło
3

Pyth , 14 12 11 bajtów

&P_QP-3+%Q6

Pakiet testowy.


Zapisano 3 bajty, korzystając ze wzoru w odpowiedzi @Dennis. Zapisano 1 bajt dzięki @Dennis.


Pyth , 14 bajtów * Wstępne rozwiązanie

&|P_ttQP_hhQP_

Pakiet testowy.

Pan Xcoder
źródło
2

Siatkówka , 45 44 bajtów

.*
$*
11(1+)
$1¶$&¶11$&
m`^(11+)\1+$

1<`1¶1

Zwraca 1, jeśli wejście jest podwójną liczbą pierwszą, w przeciwnym razie 0

Wypróbuj online!

Wyjaśnienie

.*              
$*

Konwertuj na Unary

11(1+)          
$1¶$&¶11$&

Umieść n-2, n oraz n + 2 na swoich liniach

m`^(11+)\1+$   

(Końcowy znak nowej linii) Usuń wszystkie kompozyty większe niż 1

1<`1¶1          

Sprawdź, czy są dwie kolejne liczby pierwsze (lub 1,3, ponieważ 3 jest liczbą pierwszą)

PunPun1000
źródło
2

Perl 6 , 24 bajtów

?(*+(0&(-2|2))).is-prime

Wypróbuj online!

*jest argumentem tej anonimowej funkcji. 0 & (-2 | 2)to skrzyżowanie składające się z liczb 0ORAZ albo z -2LUB 2. Dodanie *do tego skrzyżowania powoduje połączenie numeru *ORAZ jednej z liczb * - 2LUB * + 2. Wywołanie is-primemetody na tym skrzyżowaniu zwraca prawdziwą wartość, jeśli *jest liczbą pierwszą ORAZ albo * - 2OR * + 2jest liczbą pierwszą. Wreszcie, ?zawraca prawdziwe połączenie do wartości boolowskiej, spełniając warunek konsekwentnego zwracania wartości.

Sean
źródło
2

JavaScript, 91 bajtów , 81 bajtów dzięki Jaredowi Smithowi

p=n=>{for(i=2;i<n;)if(n%i++==0)return !!0;return n>1},t=n=>p(n)&&(p(n+2)||p(n-2))

Wyjaśnienie

pinformuje, czy podana liczba njest liczbą pierwszą, czy nie, a ttesty podaje liczbę ni n±2.

Przykład

Serge K.
źródło
Nie potrzebujesz varnawiasów wokół ndefinicji funkcji itp.
Jared Smith
Myślę, że możesz edytować swój fragment kodu, aby pokazać wartość nobok wartości t(n)zwiększonej przejrzystości (np. 7: true)
Taylor Scott
1
Dziękuję wam obojgu
Serge K.
1

J, 23 bajty

1&p:*.0<+/@(1 p:_2 2+])

Wypróbuj online!

w jaki sposób?

1&p:                               is the arg a prime?
    *.                             boolean and
                                   one of +2 or -2 also a prime
                     (1 p:_2 2+])  length 2 list of booleans indicating if -2 and +2 are primes
               @                   pipe the result into...
      0<+/                         is the sum of the elements greater than 0
                                   ie, at least one true
Jonasz
źródło
16 bajtów z3>0#.@p:0 2 _2&+
mil
@miles nice. bardzo sprytne wykorzystanie bazy 2 do przetwarzania wyników.
Jonasz
1

Rubinowy, 38 + 6 = 44 bajty

Wymaga opcji -rprime.

->n{n.prime?&[n-2,n+2].any?(&:prime?)}

Wypróbuj online!

daniero
źródło
1
Możesz zapisać bajt, używając &zamiast&&
Piccolo
1

JavaScript (ES6), 54 bajty

a=x=>f(x)&(f(x+2)|f(x-2));f=(n,x=n)=>n%--x?f(n,x):x==1

Austin
źródło
1

Excel VBA, 102 100 bajtów

Brak wbudowanych funkcji pierwszeństwa dla VBA :(

Kod

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane z komórki [A1]i wysyła 1(prawda) lub 0(fałsz) do okna natychmiastowego VBE

a=[A1]:?p(a)*(p(a-2)Or p(a+2))

Funkcja pomocnika

Function p(n)
p=n>2
For i=2To n-1
p=IIf(n Mod i,p,0)
Next
End Function

Alternatywnie, 122 bajty

Kod

Rozwiązanie oparte na funkcji sprawdzania pierwotności rekurencyjnej

a=[A1]:?-1=Not(p(a,a-1)Or(p(a-2,a-3)*p(a+2,a+1)))

Funkcja pomocnika

Function p(n,m)
If m>1Then p=p(n,m-1)+(n Mod m=0)Else p=n<=0
End Function
Taylor Scott
źródło
0

PHP, 85 bajtów 24 bajty dzięki Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}
jahly
źródło
Można to znacznie pograć w golfa, zmieniając nazwy obu funkcji na 1 znak każda (np. aI b)
Skidsdev
2
Czy PHP nie potrzebuje functionjuż tego słowa kluczowego?
Tytus
0

Python 2 , 75 bajtów

lambda x:p(x)*(p(x-2)|p(x+2))
p=lambda z:(z>1)*all(z%i for i in range(2,z))

Wypróbuj online!

Officialaimm
źródło
0

Japt , 13 bajtów

j ©[U+2U-2]dj

Zwraca truei falseokreśla, czy liczba jest częścią pierwszej pary bliźniaczej.

Wypróbuj online!

Wyjaśnienie

Implicit: U= liczba całkowita wejściowa

j ©

Sprawdź, czy dane wejściowe to prime ( j), AND ( ©) ...

[U+2U-2]dj

Korzystając z tablicy [U+2, U-2], sprawdź, czy jakieś elementy są prawdziwe ( d) zgodnie z funkcją pierwotności (j ).

Wynik niejawny wyniku boolowskiego z is input prime AND is any ±2 neighbor prime.

Justin Mariner
źródło
Hmm ... Wydaje mi się, że [U+2U-2]może być znacznie krótszy, ale nie wiem, jak ...
ETHproductions