Primos delicados

Sep 21 2020

Inspirado em Encontre o maior primo frágil .

Removendo pelo menos 1 dígito de um inteiro positivo, podemos obter um inteiro não negativo diferente. Observe que isso é diferente da Removefunção na pergunta vinculada. Dizemos que um número primo é delicado se todos os inteiros gerados dessa forma não forem primos. Por exemplo, \$60649\$ gera os seguintes inteiros:

0, 4, 6, 9, 49, 60, 64, 66, 69, 604, 606, 609, 649, 664, 669, 6049, 6064, 6069, 6649

Nenhum desses inteiros são primos, portanto \$60649\$é um primo delicado. Observe que quaisquer zeros à esquerda são removidos e que o requisito é "não primo", então \$0\$e \$1\$ambos se qualificam, o que significa que, por exemplo, \$11\$ é um primo delicado.

Semelhante à regra de sequência padrão , você deve realizar uma das seguintes tarefas:

  • Dado um número inteiro positivo \$n\$, produz dois valores distintos e consistentes * , dependendo se \$n\$ é um primo delicado ou não
  • Dado um número inteiro positivo \$n\$, produza o \$n\$o delicado primeiro
  • Dado um número inteiro positivo \$n\$, produza o primeiro \$n\$ delicados primos
  • Produza infinitamente a lista de números primos delicados

* : Você pode optar por gerar dois conjuntos de valores, onde os valores no conjunto correspondem à definição de verdade e falsa do seu idioma. Por exemplo, uma resposta Python pode gerar uma lista vazia para falsey / truthy e uma lista não vazia caso contrário.

Você pode escolher quais das tarefas deseja fazer.

Você pode inserir e produzir de qualquer maneira padrão e, como se trata de um jogo de código , o código mais curto em bytes ganha

Para referência, os primeiros 20 primos delicados são:

2, 3, 5, 7, 11, 19, 41, 61, 89, 409, 449, 499, 881, 991, 6469, 6949, 9001, 9049, 9649, 9949

Mais alguns itens a serem observados:

821 - False (Removing the 8 and the 1 gives 2 which is prime)

Oferecerei uma recompensa de +100 por uma resposta que implemente uma das I / Os de sequência padrão, em vez do método do problema de decisão , que:

  • é mais curto do que uma implementação ingênua de problema de decisão (inclua essa versão como prova, se ainda não tiver sido postada)
  • ou que não depende de verificar se os valores são primos delicados ou não ao gerar valores (por exemplo, pode usar o fato de que apenas dígitos específicos podem ocorrer, ou outra coisa que não é simplesmente colocar um "loop sobre números, encontrando primos delicados" )

Isso é um tanto subjetivo quanto ao que conta como "verificar se há primos delicados", então usarei meu melhor julgamento quando se trata de conceder a recompensa.

Respostas

11 Adnan Sep 21 2020 at 07:11

05AB1E , 4 bytes

Código

Usa a codificação 05AB1E. Verifica se o número fornecido é um primo delicado ou não.

æpJΘ

Experimente online! ou Verifique todos os números entre 1 e 9949 .

Explicação

æ      # Get the powerset of the number.
 p     # Check for each element whether it is a prime.
  J    # Join these numbers into one big number.
   Θ   # Check whether this joined number is equal to 1.
9 Bubbler Sep 21 2020 at 08:12

APL (Dyalog Extended) , 16 14 bytes

</1⍭⍎⍕(⊢,,¨)\⍞

Experimente online!

-2 bytes ( ∊⍎¨¨ → ⍎⍕) graças a @ngn.

Programa completo que pega um único número de stdin e imprime 1 (verdadeiro) ou 0 (falso).

O truque aqui é como ele gera todas as subsequências não vazias:

  • (⊢,,¨)/ strfornece todas as subsequências das strquais incluem o último caractere.
  (⊢,,¨)/ '1234'
→ '1' (⊢,,¨) '2' (⊢,,¨) '3' (⊢,,¨) '4'
→ '1' (⊢,,¨) '2' (⊢,,¨) '4' '34'
→ '1' (⊢,,¨) '4' '34' '24' '234'
→ '4' '34' '24' '234' '14' '134' '124' '1234'
  • (⊢,,¨)\ straplica (⊢,,¨)/- se a cada prefixo de str, fornecendo todas as subsequências não vazias como uma lista de listas de strings.
  (⊢,,¨)\ '1234'
→ '1' ('2' '12') ('3' '23' '13' '123') ('4' '34' '24' '234' '14' '134' '124' '1234')

Explicação de todo o código:

</1⍭⍎⍕(⊢,,¨)\⍞
             ⍞  ⍝ Take n from stdin as a string
      (    )\   ⍝ For each prefix, reduce from right by
         ,¨     ⍝   prepend the previous char to each string
       ⊢,       ⍝   and append to the previous list of strings
    ⍎⍕          ⍝ Convert nested strings to a single string,
                ⍝ and then eval it to get a simple integer vector
  1⍭  ⍝ Test each number for primality
</    ⍝ Test if the only truth is the last one
7 xash Sep 21 2020 at 03:39

Brachylog , 7 6 bytes

ṗ⊇ᵘṗˢȮ

Experimente online!

ṗ⊇ᵘṗˢȮ the implicit input
ṗ      is a prime
 ⊇ᵘ    and from every unique subset
   ṗˢ  select the primes
     Ȯ and this should be a list with one element (the prime input itself)
6 JonathanAllan Sep 21 2020 at 06:56

Jelly , 7 bytes

DŒPḌẒḄ’

Um Link monádico que aceita um inteiro positivo que retorna zero (falsey) se for um primo delicado, ou um inteiro diferente de zero (verdadeiro) se não for.

Experimente online! Ou veja os primeiros vinte .

Como?

DŒPḌẒḄ’ - Link: n         e.g. 824                      409
D       - decimal digits       [8,2,4]                  [4,0,9]
 ŒP     - power-set            [[],[8]...,[8,2,4]]      [[],[4],...,[4,0,9]]
   Ḍ    - undecimal            [0,8,2,4,82,84,24,824]   [0,4,0,9,40,49,9,409]
    Ẓ   - is prime?            [0,0,1,0,0,0,0,0]        [0,0,0,0,0,0,0,1]
     Ḅ  - from binary          32                       1
      ’ - decrement            31                       0
5 Shaggy Sep 21 2020 at 04:39

Japt , 7 bytes

¥à f_°j

Experimente ou teste[0,1000)

¥à f_°j     :Implicit input of integer string
¥           :Is equal to
 à          :Combinations
   f        :Filter
    _       :By passing each through a function
     °      :Postfix increment, to cast to an integer
      j     :Is prime?
4 xash Sep 21 2020 at 04:01

J , 25 23 bytes

-2 graças a Jonah!

Retorna uma lista contendo 1 sendo verdadeiro ou 0 caso contrário.

1</@p:(#~2#:@i.@^#)&.":

Experimente online!

Como funciona

1</@p:(#~2#:@i.@^#)&.":
                   &.": convert the number to a string
      (  2      ^#)      2 ^ length
          #:@i.@         enumerated and to base 2
       #~                select from the string based on the bit mask
                   &.": convert from strings to numbers
1   p:                  primes -> 1, non-primes -> 0
                         so in the delicate prime case, we have
                         (2^L) - 1 zeros and one 1 for the input itself
 </@                    reduce from left to right with less-than
                         (so last position is 1, everything else 0)
4 Mukundan314 Sep 21 2020 at 02:43

Pyth , 14 8 bytes

qjfP_sTy

Experimente online!

Explicação

qjfP_sTy
  f       # filter
       y  # all subsets of input
   P_sT   # with a primality test
 j        # join result of filter on newlines
q         # check if it equals input
3 Neil Sep 21 2020 at 03:50

Retina 0.8.2 , 53 bytes

^
;
+%`;(.)
$1;$'¶$`; .+ $*
%A`^.?$|^(..+)\1+$
^1+¶+$

Experimente online! O link inclui casos de teste. Explicação:

^
;
+%`;(.)
$1;$'¶$`;

Gere todas as subseqüências da entrada.

.+
$*

Converta então para unário.

%A`^.?$|^(..+)\1+$

Exclua aqueles que não são primos, mas não exclua as novas linhas. (Uma substituição de várias linhas também funciona, mas é mais difícil de formatar uma explicação.)

^1+¶+$

Verifique se a entrada original era primo, mas nenhuma das subsequências adequadas era.

3 user Sep 21 2020 at 04:21

Scala , 173 170 bytes

n=>(s"$n".indices.toSet.subsets.filter{x=>1<x.size&x.size<s"$n".size}.map(_.toSeq.sorted.map(""+n).mkString.toInt).toSet+n).filter{x=>x>1&2.to(x/2).forall(x%_>0)}==Set(n)

Experimente online!

3 DominicvanEssen Sep 21 2020 at 19:57

R , 163 154 bytes

function(x,n=nchar(x),s=sum)(a=apply(!expand.grid(rep(list(0:1),n)),1,function(v)(y=s((x%/%10^(n:1-1)%%10)[v]*10^(s(v):1-1)))&s(!y%%1:y)==2))[1]&!s(a[-1])

Experimente online!

Verifica se há primos entre os números formados, removendo todas as combinações de dígitos de x. A primeira combinação é a remoção de nenhum dígito: deve ser VERDADEIRO e todos os outros testes principais devem ser FALSO.

Comentado:

is_delicate_prime=
function(x,                     # x = number to test
 n=nchar(x),                    # n = number of digits of x
 s=sum)                         # s = alias to sum() function
(a=                             # a = matrix of all prime-tests:
 apply(                         #     apply the function v to each of...
  !expand.grid(rep(list(0:1),n)),   # all combinations of n of TRUE/FALSE...
  1,                            #     row-by-row...
  function(v)                   #     defining the output of v as:
   (y=s((x%/%10^(n:1-1)%%10)    #       the digits of x...
    [v]                         #       (considering only the elements chosen by v)... 
       *10^(s(v):1-1)))         #       multiplied by 10^((v-1)..0)...
   &s(!y%%1:y)==2))             #       tested for primality AND non-zero
[1]                             # Finally, output TRUE if a[1] is TRUE...
   &!s(a[-1])                   # and the sum of all other elements of a are FALSE
2 att Sep 21 2020 at 07:10

Linguagem Wolfram (Mathematica) , 54 bytes

Select[FromDigits/@Subsets@@RealDigits@#,PrimeQ]=={#}&

Experimente online!

2 Arnauld Sep 21 2020 at 16:55

JavaScript (ES6),  98  95 bytes

Espera ncomo uma string. Retorna um valor booleano.

n=>[...n].reduce((a,x)=>[...a,...a.map(y=>(g=k=>y%--k?g(k):(p+=q=y>1&k<2,y))(y+=x))],[p=0])|q/p

Experimente online!

Como?

Calculamos o conjunto de poderes dos dígitos de nde tal forma que a ordem é preservada e nela mesma é computada por último. O resultado é verdadeiro se o único primo entre os inteiros resultantes for o último.

2 Noodle9 Sep 21 2020 at 15:38

Python 2 , 139 \$\cdots\$ 145 142 bytes

Adicionados 36 bytes para corrigir um bug gentilmente apontado por pxeger .
Economizei 5 bytes graças ao pxeger !!!

lambda n,R=range:all((g<2or any(g%i<1for i in R(2,g)))-(`g`==n)for g in{int(''.join(n[j]for j in R(len(n))if i>>j&1))for i in R(1,2**len(n))})

Experimente online!

Insere um número inteiro como string e retorna Truese for um primo delicado ou Falsenão.

2 pxeger Sep 21 2020 at 19:27

Python 3.8 (pré-lançamento) , 146 144 bytes

-2 bytes removendo parênteses redundantes

Eu também estava trabalhando em uma resposta muito semelhante pouco antes do Noodle9 postar a sua, e combinei as ideias dela para obter esta ( voto positivo ! ) Aquele agora está bem diferente porque eles inicialmente tinham um quebrado, então pensei em postar o meu.

lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})

Experimente online!

Explicação:

lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})

lambda s        :                                                                                                                                       function
        ,R=range                                                                                                                                        alias `range` built-in to `R`
                                                                                   {            s[j]for j in R(l)if i>>j&1  for i in R(1,2**l)}         compute the power-set (excluding the empty set)
                                                                                    int(''.join(                          ))                            convert each list of digits to an integer
                             all(                                          for g in                                                            )        check the integers for primality
                                                    all(g%k for k in R(2,g))                                                                            check for factors in the number
                                              (g>1)&                                                                                                    makes sure 0 and 1 aren't treated as prime
                                 (g!=int(s))^                                                                                                           ensure the number itself is prime
                 (l:=len(s))*                                                                                                                           store the length in `l`

1 Noodle9 Sep 21 2020 at 21:12

SageMath , 139 bytes

def f(n):s=str(n);l=len(s);return p(n)*all(~-p(g)for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l-1)})
R=range;p=is_prime

Experimente online!

Porto da minha resposta Python.

1 Stef Sep 22 2020 at 17:33

Python 3 , 181 bytes

Usando itertools e uma receita de golfe para powerset.

lambda s,R=range:all(p(int(''.join(t)),R)for t in sum(([*combinations(s,k)]for k in R(1,len(s))),[]))>p(int(s),R)
from itertools import*
p=lambda n,R:any(n%i<1for i in R(2,n))or 2>n

Experimente online!

Espera a entrada como uma string.

A função pretorna Truese sua entrada não for primo e Falsese for primo; a função principal retorna (forall t, p(t)) > p(s)onde tobtém todos os "subvalores" de s. A única maneira de os booleanos satisfazerem essa desigualdade é True > False, o que significa que todos tsão não-primos e snão são não-primos.

Isenção de responsabilidade: já havia duas respostas python quando postei esta.