Primeiro e último números primos com dígitos primos do intervalo

12

Desafio

Para um determinado intervalo inteiro positivo, encontre o primeiro e o último número primo inteiramente composto por dígitos do número primo, incluindo excepcionalmente 0 (para os dígitos , um intervalo de 0-2 deve gerar 2-2). O intervalo é inclusivo. Se nenhum número for encontrado, a saída esperada será 0. Se houver apenas um número, a saída esperada será esse número duas vezes.

Exemplos

  • Para o intervalo de 1 a 100, o primeiro número primo é 2 e o último é 73 (7 e 3 são números primos).
  • Para o intervalo de 70 a 80, o primeiro número primo é 73 e o último também é 73 (como existe apenas um número correto no intervalo fornecido, retornamos duas vezes).
  • Para o intervalo de 190 a 200, não há resposta correta, então você retorna 0.
  • Para o intervalo de 2000 a 2100, o primeiro número primo é 2003 e o último é 2053 (omitimos o dígito 0, mas todos os outros dígitos são primos)

Isso é , então o código mais curto em bytes vence!

Todas as brechas padrão se aplicam.

Entrada

  • Você é livre para aceitar dois números inteiros como entrada, no entanto, pode ver o ajuste, a pilha, os argumentos da função, o argumento CLI, stdin.
  • Você deve receber apenas dois números inteiros.

Resultado

  • Você deve retornar o resultado (uma tupla, uma matriz, retorno múltiplo se o seu idioma suportar), deixá-lo na pilha ou imprimi-lo (nesse caso, eles devem estar separados de alguma forma).
  • A ordem das saídas é irrelevante.
  • Você tem permissão para colchetes à esquerda / à direita e novas linhas.
  • Você deve retornar dois números, se houver uma resposta, mesmo que sejam os mesmos.
  • Você deve retornar 0 se não houver resposta.
LamaDelRay
fonte
Só para ter certeza, se estou retornando uma lista de números inteiros quando houver respostas, posso retornar uma lista contendo apenas 0 quando não houver respostas? Eu não preciso voltar em 0vez de [0]?
Οurous

Respostas:

5

Perl 6, 105 94 90 86 bytes

{my @b=grep {is-prime all($_,|.comb>>.Int Xor 2)},$^a..$^b;say @b??"@b[0] @b[*-1]"!!0}
Ven
fonte
4

JavaScript (ES6), 83 bytes

Assume o intervalo [ab] na sintaxe de curry (a)(b). Retorna uma matriz de 2 elementos ou 0 .

n=>g=(m,a=0)=>n>m?a:g(m-1,(P=d=>m%--d?P(d):d>1|/[14689]/.test(m))(m)?a:[m,a[1]||m])

Casos de teste

Arnauld
fonte
4

Mathematica, 91 bytes

If[(s=Select[Range@##,(p=PrimeQ)@#&&And@@((p@#||#<1)&/@IntegerDigits@#)&])!={},MinMax@s,0]&

Experimente online!

J42161217
fonte
3

Gelatina , 14 bytes

æRµDo2ÆPẠµÐf.ị

Experimente online!

Como funciona

æRµDo2ÆPẠµÐf.ị ~ Programa completo.

æR ~ Faixa principal inclusiva.
  Mantenha apenas aqueles que satisfazem uma condição.
   Do2ÆPẠ ~ A condição do filtro:
   D ~ Os dígitos decimais do número atual.
    o2 ~ Lógico ou com 2 (mapeia 0 a 2 e qualquer outro dígito para si mesmo).
      ÆP ~ É primo (em termos de elementos)?
        Check ~ Verifique se todos os dígitos satisfazem a condição.
            . Get ~ Obtenha o elemento no índice modular 0.5. Alguns detalhes:
                 ~ A geléia é indexada em 1, então 1 nos fornece o primeiro elemento, enquanto 0
                   nos dá o último elemento.
                 ~ Se o teto e o piso do número N não coincidirem, 
                   então Jelly retorna os itens nos índices piso (N) e teto (N).
                 ~ Se a lista estiver vazia, gera 0, portanto é muito conveniente.

Se tomar todo o intervalo seria permitido (embora eu ache que não deveria ser), então 12 bytes:

Do2,ÆPȦµÐf.ị

Experimente online!

Mr. Xcoder
fonte
13 bytes Embora não seja super similar. Devo apenas postar eu mesmo? Você pode tomá-lo se quiser, mas deixe-me saber se você vai manter sua solução.
dylnan
OP diz For a given positive integers range. Eu vou pedir para esclarecer #
1313 dylnan
@dylnan observe que sua versão é inválida ( 0é a exceção do desafio, porque deve ser tratada como um dígito principal por algum motivo). Enfim,
publiquei
Oh, eu pensei que a 0 é regra principal tinha sido mudado
dylnan
3

Braquilog , 16 bytes

⟦₂{ṗṗᵐ}ˢ⟨⌋≡⌉⟩|∧0

Experimente online!

O "retorno 0 completamente não sensorial" se não houver primo "nos faz perder 3 bytes ( |∧0) sem motivo (retornaria false.se não os adicionássemos)

Explicação

⟦₂                Range from the smallest element of the input to the biggest
  {   }ˢ          Select on that range:
   ṗ                Numbers that are primes
    ṗᵐ              And whose digits are primes
        ⟨   ⟩     Fork on this new list:
         ⌋          Minimum
           ⌉        maximum
          ≡         Do nothing and return [Minimum, Maximum]
             |∧0  If all of this fails (i.e. the list after selection is empty), return 0
Fatalizar
fonte
Inválido porque não lida com o dígito 0 como primário (conforme especificado no desafio). Assim, ele falha para[2000, 2100]
Sr. Xcoder
3

Pitão , 24 bytes

Usar minha abordagem inicial acaba sendo mais curto.

.x,eKfP#I_M-+TjT;0}EQhKZ

Experimente aqui!

(Eu estava apenas atualizando para 23, mas Steven me venceu )

?KfP#I_M-+TjT;0}FQhM_BK0

Experimente aqui!

Nativamente, hM_BKpode ser substituído por ,hKeK.

25 bytes

.x,eKf.AmP_|d2+TjT;}EQhKZ

Experimente aqui!

26 bytes

|>2.<f.AmP_|d2+TjT;*2}EQ1Z

Experimente aqui!

|>2.<fP#I_M|R2+TjT;*2}EQ1Z

Experimente aqui!


Como eles trabalham

.x,eKfP#I_M-+TjT;0}EQhKZ ~ Full program. Q, E = first, second inputs

.x                     Z ~ Try-catch block. If the code errors, output 0.
     f            }EQ    ~ Filter the range [E ... Q] for (uses a variable T):
            +TjT;          ~ Append T to the list of its digits.
           -     0         ~ Remove the zeros.
         _M                ~ Multiply each by -1 (for primality testing).
        I                  ~ Check if the result is invariant over...
      P#                   ~ Removing non-prime items.
    K                    ~ Assigned the filtered range to a variable K.
  ,e                     ~ Pair the last element of K with...
                     hK  ~ Its first element.

|>2.<f.AmP_|d2+TjT;*2}EQ1Z ~ Full program.

                   *2}EQ   ~ Inclusive range, repeated twice..
     f                     ~ Filter, using T as the current number.
                jT;        ~ Base-10 digits of T.
              +T           ~ Concatenated with T.
        mP_|d2             ~ Prime check after performing OR 2 (makes 0 be treated as prime)
      .A                   ~ Do all satisfy this condition?
   .<                   1  ~ Rotate by one place cyclically to the left.
 >2                        ~ Last two elements (ignored if there aren't enough)
|                        Z ~ Logical or with 0.
Mr. Xcoder
fonte
Este não retorna duas instâncias de [73] no caso de teste [70, 80].
Steven H.
Superou você de volta por 1, agora com 25 anos.
Steven H.
@StevenH. Outgolfed você de volta por 1, agora às 24.
Mr. Xcoder
A competição está ficando intensa ... aos 23!
Steven H.
2

Mathematica 85 Bytes

Eu sei que já existe uma resposta semelhante, mas a abordagem aqui é bem diferente.

MinMax@Cases[Range@##,x_/;PrimeQ@x&&DisjointQ@@IntegerDigits/@{x,14689}]/.{_,∞}->0&

Essa resposta de 83 caracteres será colada e executada no Mathematica. O site do TIO não sabe como interpretar ∞.

Kelly Lowder
fonte
2

Gelatina , 14 bytes

Do2ÆPẠ
æRÇÐf.ị

Experimente online!

æRÇÐf.ị            Main link
æR                 Prime range
   Ðf              Filter the range with...
  Ç                The helper link
      ị            At index (decimal, returns [xs[floor], xs[ceil]], otherwise 0)
     .             0.5

Do2ÆPẠ             Helper link
D                  For each decimal
 o2                Replace 0s with 2s, an actual prime prime (could be 3, 5, or 7).
   ÆP              Filter primes (1 if true, 0 if false)
     Ạ             Check if all are true

Agradecemos a Erik, o Outgolfer, pela ajuda na correção de um bug. Obrigado ao Sr. Xcoder pelo .ịtruque.

Ven
fonte
Será que ṙ-ḣ2trabalho para Ḣ,Ṫcorrigi-lo (pode ter que modificar um pouco mais)?
Zachary
@ Zacharý que fornece a saída na ordem errada, no entanto. E isso não parece funcionar: \
Ven
@ Mr.Xcoder A sala Jelly me levou à mesma solução. Obrigado!
Ven 13/12
.ịpode funcionar bem (tipo de roubada de Mr. Xcoder)
Zachary
Você está certo! Isso é bom.
Ven 14/12
1

Ruby , 87 bytes

->a,b{(z=(a..b).select{|x|(2...x).none?{|r|x%r<1}&&/[14689]/!~"%d"%x})[0]?(z.minmax):0}

Experimente online!

GB
fonte
1

Perl 6 ,  68 66 65 61  58 bytes

{($_=($^a..$^b).grep({.is-prime&&/^<[02357]>+$/})[0,*-1])[1]??$_!!0}

Tente

{($_=($^a..$^b).grep({.is-prime&&!/<[14689]>/})[0,*-1])[1]??$_!!0}

Tente

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/})[0,*-1])[1]??$_!!0}

Tente

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/}))??.[0,*-1]!!0}

Tente

{($_=grep {.is-prime*!/<[14689]>/},$^a..$^b)??.[0,*-1]!!0}

Tente

Expandido:

{  # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  (
    $_ =  # store the list in 「$_」 for later use

      grep {
          .is-prime

        *              # True * True == 1 (all others equal 0)

          !/<[14689]>/ # doesn't contain a non-prime other than 0
      },

      $^a .. $^b       # inclusive Range

  )            # is the list Truish (not empty)
  ?? .[0,*-1]  # if so output the first and last values (from 「$_」)
  !! 0         # otherwise return 0
}
Brad Gilbert b2gills
fonte
1

Java 8, 165 164 bytes

(a,b)->{for(;a<=b&!p(a);a++);for(;b>a&!p(b);b--);return a>b?"0":a+" "+b;}boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}

Explicação:

Experimente aqui.

(a,b)->{            // Method with two integer parameters and String return-type
                    //  (Input `a` is the lowest input, input `b` is the highest input)
  for(;a<=b         //  Increase `a` as long as it's smaller than or equal to `b`,
       &!p(a);a++); //   and it's not a prime, and not all of its digits are prime-digits
  for(;b>a          //  Decrease `b` as long as it's larger than `a`,
       &!p(b);b--); //   and it's not a prime, and not all of its digits are prime-digits
  return a>b?       //  If `a` is now larger than `b`:
    "0"             //   Return 0, because nothing is found
   :                //  Else:
    a+" "+b;}       //   Return the resulting `a` and `b`

boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}
                    // Separate method that returns whether the input integer is a prime,
                    //  and all of its digits are also primes (or 0)
Kevin Cruijssen
fonte
1

Limpo , 142 131 125 bytes

import StdEnv
@a b#l=[n\\n<-[a..b]|and[gcd p n<2&&or[c==k\\k<-:"02357"]\\p<-[1..n-1],c<-:toString n]]
|l>[]=[hd l,last l]=[0]

Ungolfed:

import StdEnv
fn start finish
    # primes
        = [ n
            \\
            n <- [start..finish]
            | and [ gcd p n == 1 && isMember c ['0','2','3','5','7'] 
                \\
                p <- [1..n-1],
                c <-: toString n
            ]
        ]
    | isEmpty primes
        = [0]
    = [hd primes, last primes]

Experimente online!

Furioso
fonte
1

Pitão, 28 25 23 bytes

.xhM_BfP#I_M #+TjT;}FQ0

Suíte de teste. Retorna [2003,2053] para o último caso de teste, já que 2053 é primo.

Steven H.
fonte
Haha, inválido. Retorna em [0, 0]vez de0
Sr. Xcoder
Ah, atire. Eu vou consertar isso.
Steven H.
@ Mr.Xcoder Fixed!
Steven H.
Deus do
céu
Pensei que você tivesse dito que estava indo para a cama ... Você é enganador: P
Steven H.