Os números pares podem se tornar primos?


24

A sequência

Todo mundo sabe que o único número primo uniforme é 2. Ho-hum. Porém, existem certos números pares em nque, quando concatenados n-1, se tornam um número primo.

Para iniciantes, 1não está na lista, porque 10não é excelente. Da mesma forma com 2( 21) e 3( 32). No entanto, 4funciona porque 43é primo, por isso é o primeiro número na sequência a(1) = 4. O próximo número que funciona (nem 6( 65) nem 8( 87) funciona) é 10, porque 109é primo, é a(2) = 10. Então pulamos um monte mais até 22, porque 2221é primo, então a(3) = 22. E assim por diante.

Obviamente, todos os termos nesta sequência são pares, porque qualquer número ímpar nquando concatenado com n-1se torna par (como se 3transforma em 32), o que nunca será primo.

Esta é a sequência A054211 no OEIS.

O desafio

Dado um número de entrada nque se encaixa em algum lugar nessa sequência (ou seja, nconcatenado com n-1é primo), imprima sua posição nessa sequência. Você pode escolher indexado com 0 ou 1, mas indique qual em seu envio.

Regras

  • Pode-se presumir que a entrada e a saída se encaixam no tipo inteiro nativo do seu idioma.
  • A entrada e saída podem ser fornecidas em qualquer formato conveniente .
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Exemplos

Os exemplos abaixo são indexados em 1.

n = 4
1

n = 100
11

n = 420
51

11
Por que você tem que fazer isso ao contrário? não cQuents não tem esse modo :(
Stephen

4
@StepHen Apenas por uma mudança de ritmo; algo diferente do que o habitual.
AdmBorkBork 3/17/17

9
Eu sinto que isso seria muito melhor como um problema de decisão.
Wheat Wizard

4
Não apenas 2 é o único número primo divisível por 2, 3 também é o único número primo divisível por 3 e 5 é o único número primo divisível por 5. Em geral, um número primo né sempre o único número primo divisível por n. Não é especial - é assim que os números primos funcionam.
Esolanging Fruit

Respostas:


11

Geléia ,  8  7 bytes

ḊżṖVÆPS

Um link monádico que pega um membro de sequência e retorna seu índice na sequência.

Experimente online!

Quão?

ḊżṖ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 Não é para mim, talvez apenas tenha voltado?
Conor O'Brien

11
Corrigido a partir de 2 minutos atrás :)
Jonathan Allan

Lindo! Esse zip(head(), pop())truque é muito legal. :)
DJMcMayhem

Em que codificação são esses 7 bytes?
precisa saber é o seguinte

11
@kylefinn Jelly tem sua própria página de código, clique no link de bytes no cabeçalho para vê-lo.
Jonathan Allan

8

Haskell , 80 75 70 bytes

Economize 5 bytes graças a Laikoni

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

Experimente online!


11
Eu acho que você pode usar o teste principal mais curto, p x=all((>0).mod x)[2..x-1]que falha em 1, mas isso não deve importar nesse caso.
Laikoni 3/17/17

11
Também show x++show(x-1)pode ser reduzido para show=<<[x,x-1].
Laikoni 3/17/17

@Laikoni Obrigado pelas dicas! Eu pensei que isso showpoderia ser feito em um método mais curto, mas não pensei em um mapa de concat por algum motivo.
Wheat Wizard

6

Gelatina , 12, 10 , 8 bytes

;’VÆPµ€S

Experimente online!

1-2 bytes salvos graças a @ nmjmcman101 e 2 bytes salvos graças a @Dennis!

Explicação:

     µ€   # 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 

Você pode simplesmente soltar o R ​​e usar o intervalo implícito?
nmjcman101

@ nmjcman101 Eu totalmente não sabia que isso era uma coisa. Obrigado!
DJMcMayhem

5

05AB1E , 9 8 7 bytes

Código

ƒNN<«pO

Usa a codificação 05AB1E . Experimente online!

Explicação

ƒ          # 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)

Claro que isso tira proveito do fato de 05AB1E ignorar erros ... porque não acho que você possa verificar se '0-1'é primo.
Erik the Outgolfer

5

Casca , 13 11 10 bytes

1solução não indexada:

#ȯṗdS¤+d←ḣ

Experimente online!

Ungolfed / Explicação

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

Obrigado @Zgarb por -3bytes!


11
£İpé equivalente a . Além disso, você pode salvar um byte em #…ḣvez de £f…N.
Zgarb 3/17/17


4

Pitão , 12 bytes

smP_s+`d`tdS

Experimente online! ou Verifique todos os casos de teste.


Quão?

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 bytes

1 indexado.

ÇsiZÄÃèj

Tente

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


Gah! Por que tenho um ponto cego para Æe Ç?! Obrigado, @ Oliver; Vou atualizar quando voltar ao computador.
Shaggy

2o+X(com espaço à direita) funcionaria no lugar de [XXÉ], embora, se eu usar os balancetes automáticos, []sua solução seja um byte mais curto. (Na verdade, 2, desde que você poderia, então, fazer õ_ZÉ]¬nÃèj)
ETHproductions

@ETHproductions: Atualmente, a primeira coisa que faço ao trabalhar com uma matriz é verificar se o balanceamento automático foi adicionado []! : D
Salsicha

Por alguma razão, acho que o ponto-e-vírgula parou completamente de funcionar também, então tentarei consertar isso. Não pense que vou ter uma chance até amanhã à tarde.
ETHproductions

3

Röda , 73 bytes

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

Experimente online!

1 indexado. Ele usa o fluxo para fazer entrada e saída.

Explicação:

{
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

Pitão , 14 bytes

lfP_Tms+`d`tdS

Experimente online!

Explicação

              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

Você me venceu por alguns segundos, eu venci por alguns bytes: P
Sr. Xcoder 03/08/19

@ Mr.Xcoder Minha primeira versão era lfTmP_s+`d`tdS, é uma pena que eu não encontrar o seu truque por mim naquele tempo :)
Jim

2

Perl 6 , 45 bytes

{first :k,$_,grep {is-prime $_~.pred},1..∞}

Experimente online!

O grepproduz a sequência de números qualificados, então procuramos a chave ( :k) (ou seja, o índice) do firstnúmero na lista que é igual ao parâmetro de entrada $_.



2

C, 99 94 bytes

1 indexado. Dói-me escrever testes de primalidade que são tão desperdiçadores em termos computacionais, mas afinal, os bytes são bytes.

Se permitirmos coisas realmente frágeis, compilando na minha máquina sem otimizações com o GCC 7.1.1, os seguintes 94 bytes funcionam (obrigado @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;}

caso contrário, esses 99 bytes muito mais robustos fazem o trabalho

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

Programa completo, um pouco mais legível:

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

Dependendo do seu compilador, você pode ser capaz de salvar alguns bytes usando n=c;em vez de 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

Não posso dizer que quero usar coisas que até parecem variar com os níveis de otimização. Usando o GCC, sem otimização -O0 funciona, com outros sinalizadores de otimização não funciona. Curiosamente -O1 -O2 e -O3 retorna 0, com -Os retorna 1, com -Og retorna n-1.
14

Você sempre pode especificar em sua resposta como seu programa deve ser compilado.
Conor O'Brien

Eu acho que parece um pouco barato. Mas eu posso adicionar uma alternativa.
14

Eu entendo, mas eu não me sentiria à má sobre fazer isso-- é uma das dicas para golfe em C
Conor O'Brien

2

JavaScript (ES6),  49 48  47 bytes

1 indexado. Limitado pelo tamanho da pilha de chamadas do seu mecanismo.

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

Experimente online!


1

Mathematica, 77 bytes

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

0

QBIC , 25 bytes

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

Explicação

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

Isso usa algumas coisas matemáticas bastante complicadas, com um cast-to-string aplicado com uma boa medida. Fazer um hat de versão fazer apenas concatenação baseada em string é um byte mais longo:

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

0

PHP , 203 bytes

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

Experimente online!

Usa um índice baseado em 1 para saída. O link TIO possui a versão legível do código.


0

Ruby , 42 + 9 = 51 bytes

Usa as -rprime -nbandeiras. 1 indexado.

Funciona contando todos os números iguais ou inferiores à entrada que atende à condição (ou mais tecnicamente, todos os números que atendem à n-1condição). Como é garantido que a entrada está na sequência, não há risco de erro de uma entrada aleatória como 7essa "não se torna primordial".

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

Experimente online!




0

Java 8, 108 bytes

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

Indexado a 0

Explicação:

Experimente 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 bytes

1- Indexado

Äm▬á┌╕|°φ♦

Execute e depure-o Explicação

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

Arrumado , 33 bytes

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

Experimente online!

Explicação

A idéia básica é criar uma sequência dos números válidos e retornar uma função de índice com 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.