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
AdmBorkBork
fonte
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
Jonathan Allan
fonte
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!

Assistente de Trigo
fonte
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 
DJMcMayhem
fonte
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)
Adnan
fonte
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!

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

Python 2 , 87 bytes

-2 bytes graças a @officialaimm . 1 indexado.

lambda n:sum(all(z%v for v in range(2,z))for i in range(4,n+1)for z in[int(`i`+`i-1`)])

Suíte de teste.

Mr. Xcoder
fonte
Estou jogando isso o mais rápido possível. Sugestões são bem vindas.
Mr. Xcoder
87 bytes
officialaimm
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.
Mr. Xcoder
fonte
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
Shaggy
fonte
11
11 bytes
Oliver
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 */
}
fergusq
fonte
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
Jim
fonte
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 $_.

Sean
fonte
30 bytes
Jo King
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;
}
algmyr
fonte
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!

Arnauld
fonte
1

Mathematica, 77 bytes

Position[Select[Range@#,PrimeQ@FromDigits[Join@@IntegerDigits/@{#,#-1}]&],#]&
J42161217
fonte
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
steenbergh
fonte
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.

Mic1780
fonte
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!

Value Ink
fonte
0

Ruby , 62 bytes

->g{(1..g).count{|r|(2...x=eval([r,r-1]*'')).none?{|w|x%w<1}}}

Experimente online!

Indexado 1

GB
fonte
0

Python 2 , 85 bytes

Indexado 1

lambda n:sum(all(z%v for v in range(2,z))for i in range(3,n)for z in[int(`i+1`+`i`)])

Teste

Melhoria na resposta do Sr. Xcoder

Halvard Hummel
fonte
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
Kevin Cruijssen
fonte
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)
Multi
fonte
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
Conor O'Brien
fonte