Czy liczby parzyste mogą stać się liczbami pierwszymi?


24

Sekwencja

Wszyscy wiedzą, że jedyną parzystą liczbą pierwszą jest 2. Ho-hum. Ale są pewne liczby parzyste n, które po połączeniu z n-1nimi stają się liczbą pierwszą.

Po pierwsze, 1nie ma go na liście, ponieważ 10nie jest liczbą pierwszą. Podobnie z 2( 21) i 3( 32). 4Działa jednak, ponieważ 43jest liczbą pierwszą, więc jest to pierwsza liczba w sekwencji a(1) = 4. Następną liczbą, która działa (ani 6( 65), ani 8( 87) działa) jest 10, ponieważ 109jest liczbą pierwszą, więc a(2) = 10. Potem pomijamy jeszcze kilka, dopóki 22, bo 2221jest pierwsza, więc a(3) = 22. I tak dalej.

Oczywiście wszystkie terminy w tej sekwencji są parzyste, ponieważ każda nieparzysta liczba npo połączeniu z nią n-1staje się parzysta (jak 3zamienia się 32), co nigdy nie będzie liczbą pierwszą.

Jest to sekwencja A054211 w OEIS.

Wyzwanie

Podany numer wejściowy, nktóry pasuje gdzieś do tej sekwencji (tj. Jest npołączony zn-1 liczbą pierwszą), wypisz swoją pozycję w tej sekwencji. Możesz wybrać indeksowanie 0 lub 1, ale proszę podać, które z nich w zgłoszeniu.

Zasady

  • Można założyć, że dane wejściowe i wyjściowe pasują do natywnego typu liczb całkowitych twojego języka.
  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

Poniższe przykłady są indeksowane 1.

n = 4
1

n = 100
11

n = 420
51

1
Dlaczego musisz to robić odwrotnie? cQuents nie ma tego trybu :(
Stephen

4
@StepHen Tylko dla zmiany tempa; coś innego niż zwykle.
AdmBorkBork

9
Myślę, że byłoby to znacznie lepsze jako problem decyzyjny.
Wheat Wizard

4
Nie tylko 2 jest jedyną liczbą pierwszą podzielną przez 2, 3 jest także jedyną liczbą pierwszą podzielną przez 3, a 5 jest jedyną liczbą pierwszą podzielną przez 5. Zasadniczo liczba pierwsza njest zawsze jedyną liczbą pierwszą podzielną przez n. To nie jest wyjątkowe - tak właśnie działają liczby pierwsze.
Esolanging Fruit

Odpowiedzi:


11

Galaretka ,  8  7 bajtów

ḊżṖVÆPS

Łącze monadyczne przyjmujące element sekwencji i zwracające jego indeks w sekwencji.

Wypróbuj online!

W jaki sposób?

ḊżṖVÆPS - Link: number, n
Ḋ       - dequeue (implicit range) = [ 2   , 3   , 4   ,... ,              n         ]
  Ṗ     - pop (implicit range)     = [   1 ,   2 ,   3 ,... ,                  n-1   ]
 ż      - zip                      = [[2,1],[3,2],[4,3],... ,             [n , n-1]  ]
   V    - evaluate as Jelly code   = [ 21  , 32  , 43  ,... ,         int("n"+"n-1") ]
    ÆP  - is prime? (vectorises)   = [  0  ,  0  ,  1  ,... , isPrime(int("n"+"n-1"))]
      S - sum

TIO mnie nie zawiodło, może po prostu wróciło?
Conor O'Brien

1
Naprawiono 2 minuty temu :)
Jonathan Allan

Piękny! Ta zip(head(), pop())sztuczka jest naprawdę fajna. :)
DJMcMayhem

W jakim kodowaniu jest to 7 bajtów?
kylefinn

1
@kylefinn Jelly ma własną stronę kodową, kliknij link bajtów w nagłówku, aby ją zobaczyć.
Jonathan Allan

8

Haskell , 80 75 70 bajtów

5 bajtów oszczędności dzięki Laikoni

p x=all((>0).mod x)[2..x-1]
g n=sum[1|x<-[4..n],p$read$show=<<[x,x-1]]

Wypróbuj online!


1
Myślę, że możesz użyć krótszego testu pierwszego, p x=all((>0).mod x)[2..x-1]który kończy się niepowodzeniem dla 1, ale w tym przypadku nie powinno to mieć znaczenia.
Laikoni

1
Również show x++show(x-1)może być skrócony do show=<<[x,x-1].
Laikoni

@Laikoni Dzięki za wskazówki! Myślałem, że showmożna to zrobić krótszą metodą, ale z jakiegoś powodu nie wymyśliłem mapy konkat.
Wheat Wizard

6

Galaretka , 12, 10 , 8 bajtów

;’VÆPµ€S

Wypróbuj online!

1-2 bajty zapisane dzięki @ nmjmcman101, a 2 bajty zapisane dzięki @Dennis!

Wyjaśnienie:

     µ€   # For N in range(input()):
;         #   Concatenate N with...
 ’        #   N-1
  V       #   And convert that back into an integer
   ÆP     #   Is this number prime?
       S  # Sum that list 

Czy możesz po prostu upuścić R i użyć niejawnego zakresu?
nmjcman101

@ nmjcman101 Całkowicie nie wiedziałem, że to była rzecz. Dzięki!
DJMcMayhem

5

05AB1E , 9 8 7 bajtów

Kod

ƒNN<«pO

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie

ƒ          # For N in [0 .. input]..
 NN<«      #   Push n and n-1 concatenated
     p     #   Check for primality
      O    #   Sum the entire stack (which is the number of successes)

Oczywiście wykorzystuje to fakt, że 05AB1E ignoruje błędy ... ponieważ nie sądzę, że można sprawdzić, czy '0-1'jest liczbą pierwszą.
Erik the Outgolfer

5

Łuska , 13 11 10 bajtów

1-indexed rozwiązanie:

#ȯṗdS¤+d←ḣ

Wypróbuj online!

Niegolfowane / Wyjaśnienie

         ḣ -- in the range [1..N]
#          -- count the number where the following predicate is true
        ←  --   decrement number,
    S  d   --   create lists of digits of number and decremented 
     ¤+    --   concatenate,
   d       --   interpret it as number and
 ȯṗ        --   check if it's a prime number

Dzięki @Zgarb za -3bajty!


1
£İpjest równoważne z . Możesz także zapisać bajt za pomocą #…ḣzamiast £f…N.
Zgarb


4

Pyth , 12 bajtów

smP_s+`d`tdS

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe.


W jaki sposób?

smP_s+`d`tdSQ  -> Full Program. Takes input from Standard Input. Q means evaluated input
                  and is implicit at the end.

 m         SQ  -> Map over the Inclusive Range: [1...Q], with the current value d.
    s+`d`td    -> Concatenate: d, the current item and: td, the current item decremented. 
                  Convert to int.
  P_           -> Prime?
s              -> Sum, counts the occurrences of True.

4

Japt , 15 14 12 11 9 8 bajtów

1-indeksowany.

ÇsiZÄÃèj

Spróbuj

Ç            :Map each Z in the range [0,input)
 s           :  Convert to string
  i          :    Prepend
   ZÄ        :    Z+1
     Ã       :End map
      è      :Count
       j     :  Primes


Gah! Dlaczego mam taki ślepy punkt dla Æi Ç?! Dzięki, @Oliver; Zaktualizuję się, kiedy wrócę do komputera.
Kudłaty

2o+X(z końcową spacją) działałoby zamiast [XXÉ], ale jeśli kiedykolwiek przejdę do []nawiasów automatycznego równoważenia, twoje rozwiązanie będzie o bajt krótsze. (Właściwie 2, bo wtedy możesz to zrobić õ_ZÉ]¬nÃèj)
ETHprodukcje

@ETHproductions: W dzisiejszych czasach pierwszą rzeczą, którą robię podczas pracy z tablicą, jest sprawdzenie, czy dodano automatyczne równoważenie []! : D
Shaggy

Z jakiegoś powodu myślę, że średniki też całkowicie przestały działać, więc spróbuję to naprawić. Ale nie sądzę, że będę miał szansę do jutrzejszego popołudnia.
ETHproductions

3

Röda , 73 bajty

{seq 3,_|slide 2|parseInteger`$_2$_1`|{|i|[1]if seq 2,i-1|[i%_!=0]}_|sum}

Wypróbuj online!

1-indeksowany. Wykorzystuje strumień do wprowadzania i wyprowadzania danych.

Wyjaśnienie:

{
seq 3,_| /* Create a stream of numbers from 3 to input */
slide 2| /* Duplicate every number except the first and the last
            to create (n-1,n) pairs */
parseInteger`$_2$_1`| /* Concatenate n and n-1 and convert to integer */
{|i| /* For every i in the stream: */
    [1]if seq 2,i-1|[i%_!=0] /* Push 1 if i is a prime
                                (not divisible by smaller numbers) */
}_|
sum /* Return the sum of numbers in the stream */
}

2

Pyth , 14 bajtów

lfP_Tms+`d`tdS

Wypróbuj online!

Wyjaśnienie

              Q    # Implicit input
             S     # 1-indexed range
     m             # For d in range [1, Q]...
      s+`d`td      # Concatenate d and d - 1
 fP_T              # Filter on primes
l                  # Return the length of the list

Pokonałeś mnie o kilka sekund, pokonałem cię o kilka bajtów: P
Mr. Xcoder

@ Mr.Xcoder Moja pierwsza wersja była lfTmP_s+`d`tdS, niefortunnie, że nie znalazłem twojej sztuczki w tym czasie sam
Jim


2

C 99 bajtów

1 indeksowany. Boli mnie pisanie testów pierwotności, które są tak marnotrawstwem obliczeniowym, ale bajty to w końcu bajty.

Jeśli pozwolimy na kilka naprawdę kruchych rzeczy, kompilowanie na moim komputerze bez optymalizacji z GCC 7.1.1 działa następujące 94 bajty (dzięki @Conor O'Brien )

i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}n=c;}

w przeciwnym razie te znacznie bardziej niezawodne 99 bajtów wykona zadanie

i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}return c;}

Pełny program, nieco bardziej czytelny:

i,c,m,k;
f(n){
    c=i=1;
    for(;++i<n;c+=m==k){
        for(k=m=1;m*=10,m<i;);
        for(m=i*m+i-1;++k<m&&m%k;);
    }
    return c;
}

int main(int argc, char *argv[])
{
    printf("%d\n", f(atoi(argv[1])));
    return 0;
}

W zależności od kompilatora możesz zapisać niektóre bajty, używając n=c;zamiast return c;:i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}n=c;}
Conor O'Brien

Nie mogę powiedzieć, że chcę używać rzeczy, które nawet wydają się różnić w zależności od poziomów optymalizacji. Używanie GCC bez optymalizacji -O0 działa, z innymi flagami optymalizacji nie. Co ciekawe -O1 -O2 i -O3 zwraca 0, z -Os zwraca 1, z -Og zwraca n-1.
algmyr

W odpowiedzi zawsze możesz określić, w jaki sposób program powinien zostać skompilowany.
Conor O'Brien

Chyba trochę taniej. Ale mogę dodać alternatywę.
algmyr

Rozumiem, ale nie czułbym się przy tym źle - to jedna z porad dotyczących gry w golfa w C
Conor O'Brien

2

JavaScript (ES6),  49 48  47 bajtów

1-indeksowany. Ograniczone wielkością stosu wywołań twojego silnika.

f=n=>n&&f(n-2)+(p=n=>n%--x?p(n):x<2)(x=n+[--n])

Wypróbuj online!


1

Mathematica, 77 bajtów

Position[Select[Range@#,PrimeQ@FromDigits[Join@@IntegerDigits/@{#,#-1}]&],#]&

0

QBIC , 25 bajtów

[:|p=p-µa*z^_l!a$|+a-1}?p

Wyjaśnienie

[:|     FOR a = 1 to <n>
p=p-    Decrement p (the counter) by
µ       -1 if the following is prime, or 0 if not
        For the concatenating, we multiply 'a' by 10^LENGTH(a), then add a-1$┘p
        Example 8, len(8) = 1, 8*10^1 = 80, add 8-1=7, isPrime(87) = 0
a*z^_l!a$|+a-1
}       Close the FOR loop - this also terminates the prime-test
?p      Print p, the 0-based index in the sequence.

Wykorzystuje to dość zaangażowaną matematykę z rzuciem odlewanym na sznurek dla dobrej miary. Tworzenie wersji kapelusza polega wyłącznie na łączeniu łańcuchowym o jeden bajt dłużej:

[:|A=!a$+!a-1$┘p=p-µ!A!}?p

0

PHP , 203 bajty

<?php $n=($a=$argv[1]).($a-1);$p=[2];$r=0;for($b=2;$b<=$n;$b++){$x=0;if(!in_array($b,$p)){foreach($p as $v)if(!($x=$b%$v))break;if($x)$p[]=$b;}}for($b=1;$b<=$a;$b++)if(in_array($b.($b-1),$p))$r++;die $r;

Wypróbuj online!

Wykorzystuje indeks wyjściowy 1. Łącze TIO ma czytelną wersję kodu.


0

Rubin , 42 + 9 = 51 bajtów

Wykorzystuje -rprime -n flag. 1-indeksowany.

Działa poprzez zliczanie wszystkich liczb równych lub poniżej danych wejściowych, które spełniają warunek (lub bardziej technicznie, wszystkie liczby, które spełniają n-1warunek). Ponieważ wejście jest gwarantowane w sekwencji, nie ma ryzyka błędu z przypadkowego wejścia takiego jak to, 7że „nie stanie się liczbą pierwszą”.

p (?3..$_).count{|i|eval(i.next+i).prime?}

Wypróbuj online!




0

Java 8, 108 bajtów

n->{for(long r=0,q=1,z,i;;){for(z=new Long(q+""+~-q++),i=2;i<z;z=z%i++<1?0:z);if(z>1)r++;if(q==n)return r;}}

0-indeksowane

Wyjaśnienie:

Wypróbuj online.

n->{                             // Method with integer parameter and long return-type
  for(long r=0,                  //  Result-long, starting at 0
      q=1,                       //  Loop integer, starting at 1
      z,i;                       //  Temp integers
      ;){                        //  Loop indefinitely
    for(z=new Long(q+""+~-q++),  //   Set z to `q` concatted with `q-1`
        i=2;i<z;z=z%i++<1?0:z);  //   Determine if `z` is a prime,
      if(z>1)                    //   and if it indeed is:
        r++;                     //    Increase the result-long by 1
      if(q==n)                   //   If `q` is now equal to the input integer
        return r;}}              //    Return the result

0

Stax , 10 bajtów

1- Zindeksowane

Äm▬á┌╕|°φ♦

Uruchom i debuguj. Objaśnienie

Rxr\{$e|pm|+         #Full program, unpacked, implicit input  (Example (4))
R                    #Create [1 to input] range  (ex [1,2,3,4] )             
 x                   #Copy value from x register (ex (4) )
  r                  #Create [0 to input-1] range (ex [0,1,2,3)
   \                 #Create array pair using the range arrays (ex [[1,0],[2,1],[3,2],[4,3]])
    {    m           #Map block
     $e|p            #To string, eval string (toNum), isPrime (ex [1,0] => "10" => 10 => 0)
          |+         #Sum the array to calculate number of truths (ex [0,0,0,1] => 1)

0

Tidy , 33 bajty

index({n:prime(n.n-1|int)}from N)

Wypróbuj online!

Wyjaśnienie

Podstawową ideą jest utworzenie sekwencji prawidłowych liczb, a następnie zwrócenie funkcji indeksu curry.

index({n:prime(n.n-1|int)}from N)
      {n:                }from       select all numbers `n` from...
                               N     the set of natural numbers, such that:
               n.n-1                     `n` concatenated with `n-1`
                    |int                 ...converted to an integer
         prime(         )                ...is prime
index(                          )    function that returns index of input in that sequence
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.