Números magnânimos

24

Dado um número inteiro positivo como entrada, determine se é um número magnânimo.

Um número magnânimo é um número tal que qualquer inserção de um +sinal entre dois dígitos na base 10 resulta na expressão de um número inteiro primo.

Por exemplo, 40427 é magnânimo porque

4+0427  = 431  is prime
40+427  = 467  is prime
404+27  = 431  is prime
4042+7  = 4049 is prime

Saída

Você deve gerar dois valores distintos, um quando a entrada for magnânima e outro quando a entrada não for.

Pontuação

O objetivo deste concurso será tornar o tamanho do código fonte escrito para resolver esta tarefa, fornecida em bytes, o menor possível.

Casos de teste

1       -> True
2       -> True
4       -> True
10      -> False
98      -> True
101     -> True
109     -> False
819     -> False
4063    -> True
40427   -> True
2000221 -> True

OEIS 253996

Assistente de Trigo
fonte
Estou confuso com a definição do desafio de como 1 e 2 são entradas válidas. Sem falar no fato de que, 1com um sinal de adição inserido entre dois caracteres (sem inserção), isso pode resultar apenas 1, o que por si só não é primo.
Magic Octopus Urn
4
@MagicOctopusUrn O sinal de mais deve ser inserido entre dois dígitos, portanto, já que 1e 2sem dois dígitos, o conjunto de expressões está vazio. Todos os membros do conjunto vazio são primos. Além disso, nenhum deles é, mas isso é além do ponto. É um pouco confuso, vou lhe dar isso, mas acho que faz mais sentido do que as alternativas.
Assistente de trigo

Respostas:

8

05AB1E , 10 bytes

Código

η¨¹.s¨R+pP

Usa a codificação 05AB1E . Experimente online! ou Verifique todos os casos de teste!

Explicação

η¨             # Take the prefixes of the input and remove the last element
  ¹.s¨         # Take the suffixes of the input and remove the last element
      R        # Reverse the array of suffixes
       +       # Vectorized addition
        p      # Check if each element is prime
         P     # Product of the array
Adnan
fonte
Como isso funciona 1 - 9? O produto de um conjunto vazio é 1? Por quê?
Magic Octopus Urn
@MagicOctopusUrn O produto vazio sempre é igual a 1. #
Adnan
@MagicOctopusUrn Tomando o produto é basicamente começando 1e multiplicando-o por cada item do conjunto, então ...
ETHproductions
11
Ah, matematicamente faz sentido. Acho que da mesma forma que sumon []é equivalente 0, o uso da propriedade induction ao implementar foi bastante inteligente.
Magic Octopus Urn
@ Jontro Sim, em UTF-8 , são 14 bytes. No entanto, 05AB1E usa a página de código 05AB1E , em que são 10 bytes.
Adnan
7

C (gcc) , 8384 85 83 84 86 75 111 bytes

Todas as otimizações foram desativadas e somente no GCC de 32 bits.

-1 byte graças a @ceilingcat

+ alguns bytes para 1maiúsculas e minúsculas.

+ alguns bytes para funções reutilizáveis.

i,j,r,s;f(a){for(i=10,r=1;a/i;i*=10)for(s=a%i+a/i,r*=s-1,j=2;j<s;)r*=s%j++>0;a=!r;}

Recebe a entrada como um número inteiro. Retorne 1 para casos falsos, 0 para casos verdadeiros.

Experimente online!

Veja minha outra resposta para o código do Mathematica (55 bytes).

Keyu Gan
fonte
Essas devem ser duas respostas separadas. Além disso, a solução Mathematica dá resultados incorretos para 1, 98, e 4063.
Ngenisis
6

Retina , 38 bytes

\B
$`$*_$'$*_
S`\d
G`^_$|^(__+)\1+$
^$

Experimente online!

Imprime 1para números magnânimos e 0outros.

Explicação

\B
$`$*_$'$*_

Começamos combinando cada posição entre dois dígitos (posições que não são limites de palavras) e inserindo o prefixo e o sufixo dessa correspondência em unário, usando _como dígito unário. Então, em vez de inserir +s, inserimos diretamente o resultado unário da soma.

S`\d

Agora dividimos a string em torno de dígitos, para que cada soma entre em sua própria linha e nos livramos desses dígitos (haverá uma linha à esquerda e à esquerda também, mas isso não é importante).

G`^_$|^(__+)\1+$

Este é o regex padrão para corresponder a números não primos em unário. Usar um Gestágio de repetição aqui significa que simplesmente mantemos todas as linhas que contêm não-primos positivos (descartando as linhas vazias).

^$

Finalmente, verificamos se a string está vazia. Se a entrada foi magnânima, o estágio anterior descartará todas as linhas (porque eram todas primas), e isso nos dá 1. Caso contrário, se alguma linha não for primordial, ela permanecerá na sequência e o regex falhará, dando 0.

Martin Ender
fonte
4

Python 2 , 82 79 78 bytes

f=lambda n,d=10:n<d or d/n<all((n/d+n%d)%k*f(n,10*d)for k in range(2,n/d+n%d))

Isso é lento e só pode lidar com os casos de teste com memorização.

Experimente online!

Versão alternativa, 79 bytes

f=lambda n,d=10:n<d or f(n,10*d)>d/n<all((n/d+n%d)%k for k in range(2,n/d+n%d))

Acelerou ao custo de um byte.

Experimente online!

Dennis
fonte
3

Java 8, 175 171 94 88 bytes

n->{long d=10,r=0,i,t;for(;d<=n;d*=10,r|=t-i)for(t=n/d+n%d,i=1;t%++i%t>0;);return r==0;}

-77 graças a @PeterTaylor usando uma aritmética (em vez de String com .substring) e se livrando do método separado para verificar se o número inteiro é primo.
-6 bytes usando o método de verificação primária do @SaraJ , portanto, faça um voto positivo !

Experimente aqui.

Explicação:

n->{                  // Method with long as both parameter and return-type
  long d=10,r=0,i,t;  //  Some temp longs
  for(;d<=n           //  Loop as long as `d` is below or equal to input `n`
                      //  (inclusive instead of exclusive due to special case 10)
      ;               //    After every iteration:
       d*=10,         //     Multiple `d` by 10
       r|=t-i)        //     and Bitwise-OR `r` with `t-i`
    for(t=n/d+n%d,    //   Set `t` to `n` integer-divided by `d` plus `n` modulo-`d`
        i=1;          //   Set `i` to 1
        t%++i%t>0;);  //   Inner oop as long as `t` modulo `i+1` modulo `t` is not 0 yet
                      //   (after we've first increased `i` by 1 with `++i`)
                      //   (if `t` equals `i` afterwards, it means `t` is a prime)
  return r==0;}       //  Return if `r` is still 0
Kevin Cruijssen
fonte
11
Eu acho que existem pelo menos duas maneiras de encurtar isso: primeiro, substitua o loop ppor recursão; em segundo lugar, acumule os resultados de modo que a função principal exija apenas uma returninstrução, criando o valor sentinela de pbe -1e usando &para verificar se todos os valores retornados são -1.
Peter Taylor
11
Na verdade, o grande é: não use cordas.
Peter Taylor
n->{for(long d=10,m=1;d<n;d*=10)m|=p(n/d+n%d,2)-2;return m>0;}long p(long n,int i){return i<n?p(n%i<1?1:n,i+1):n;}
Peter Taylor
@PeterTaylor Obrigado pelas sugestões! Quanto à sua função sugerida no final, você tem certeza de que está correta? Atualmente, dou resultados incorretos , a menos que esteja fazendo algo errado.
Kevin Cruijssen 28/06
11
Ok, d<=npara lidar 10. O estouro de pilha não é um problema (a especificação não fornece um intervalo de entrada que deve ser tratado), mas pode ser corrigido e mais economias são obtidas ao se reverter para um loop e inlining .
Peter Taylor
2

Pitão , 14 bytes

.AmP_ssMcQ]dtU

Experimente online! Será exibido Truese o número for magnânimo, Falsecaso contrário. Pega o número como uma sequência.

Explicações

.AmP_ssMcQ]dtU

              Q    # Implicit input Q
            tU     # Generate the range [1, 2, ..., len(Q)-1]
  m                # For each index d in the above range...
        cQ]d       # Split Q at index d
      sM           # Convert the two parts to integers
     s             # Sum
   P_              # Check it is a prime
.A                 # ...end for. Check all elements are True
Jim
fonte
2

Python 2 , 104 102 98 96 103 bytes

  • Graças ao @Wheat Wizard por 2 bytes: tornado icompletamente anônimo, pois é chamado apenas uma vez.
  • Graças ao @ Hyperperutrutrino por 4 bytes: maneira mais inteligente de obter os números do número principal em vez de cortar
  • @Hyperneutrino salvou outros 2 bytes: x-1apenas xpara o rarnge de verificação principal.
  • Corrigida falha no caso x=10, adicionando 7 bytes, graças ao @Dennis e ao @Wheat Wizard por detectá-lo: minha versão anterior estava considerando 1 como primo
lambda x:all((lambda x:x>1and all(x%j for j in range(2,x)))(x/10**j+x%10**j)for j in range(1,len(`x`)))

Experimente online!

officialaimm
fonte
11
98 bytes
HyperNeutrino 27/06
Legal, obrigado @HyperNeutrino
officialaimm
11
96 bytes : você não precisa do x-1no final do intervalo; a gama é exclusiva à direita.
HyperNeutrino
11
Isso falha para 10 (novo caso de teste).
Dennis
11
Isso falha para 10. Eu também acredito que 10 é o único número pelo qual isso falha.
Assistente de trigo
2

Japonês , 24 16 bytes

Foi uma colaboração entre @Shaggy, @ETHproduction e eu.

¬£[YîU UtY]xÃÅej

Experimente online!

Recebe a entrada como uma sequência.

Oliver
fonte
Gah! Quase idêntico à solução alternativa em que estava trabalhando! Aqui estão os 22 bytes que eu tinha até agora. EDIT: reduziu para 20 bytes combinando coisas de ambos.
Shaggy
@Shaggy engraçado o suficiente, eu estou trabalhando no meu editar agora ... É chocante semelhante à sua: ethproductions.github.io/japt/...
Oliver
Dica: xconverte automaticamente os itens na matriz de números ;-)
ETHproductions
Sim, é para onde eu também iria, @ETHproductions: 16 bytes .
Shaggy
Além disso, XîUé genial. Eu acho que U¯Xfunciona para o mesmo comprimento, mas ainda
ETHproductions
2

Pip , 25 24 bytes

$&0N_%,_=1M$+(a^@_)M1,#a

Experimente online!

Explicação

aé o primeiro argumento da linha de comandos. 1,#agera um intervalo contendo números 1até len(a)-1. Para isso, mapeamos uma função lambda:

$+(a^@_)
   a^@_   Split a at this index
$+(    )  Fold the resulting 2-element list on +

A seguir, mapeamos outra função lambda 0N_%,_=1, que testa primalidade. Eu peguei desta resposta ; você pode ler a explicação lá. Finalmente, dobramos a lista em AND lógico ( $&). O resultado é 1se todas as somas eram primárias, 0se nenhuma delas não era.

Exemplo, com entrada de 4063:

                    1,#a   [1; 2; 3]
           $+(a^@_)M       [67; 103; 409]
  0N_%,_=1M                [1; 1; 1]
$&                         1
DLosc
fonte
2

CJam , 22 bytes

r:L,({)_L<i\L>i+mp!},!

Experimente online!

Imprime inteiro positivo para verdade, zero para falsidade.

-1 graças a um truque inteligente de Peter Taylor .
-3 graças a outra dica de Peter Taylor.

Erik, o Outgolfer
fonte
0&!é mais curto que1+:*
Peter Taylor
@PeterTaylor Ooh que é inteligente ... você abusou do fato de que !retorna um conjunto-intersecção boolean e usados com o valor Falsas 0de modo que você pode fazer 0&!no 3 em vez de 1&!!...
Erik o Outgolfer
Você pode salvar mais 3 bytes atribuindo a entrada a uma variável, o que simplifica as manipulações da pilha e usando o ,operador de filtro em vez de f.
Peter Taylor
PS: Não vejo nenhum abuso !ao converter para um booleano: isso era padrão no GolfScript e padrão no CJam. E 1&!!seria incorreto: 0&!é o teste óbvio porque o requisito é todo, não existe.
Peter Taylor
@PeterTaylor Não foi isso que eu quis dizer ...: P
Erik the Outgolfer
2

Japonês , 23 bytes

Recebe a entrada como uma sequência.

Dang it; derrotado no soco em uma alternativa muito mais curta na qual eu estava trabalhando.

£i+Ýe@OxXr"%+0+"'+)j

Teste-o

Shaggy
fonte
@ETHproductions, não, você estava certo; a versão original estava errada; apenas verificando primos magnânimos . ¬£i+YÄÃe@OxX j
Shaggy
Eu sabia que não tinha enlouquecido; P
ETHproductions
11
Falha 4063(deve ser verdadeiro, é falso). O truque aqui é que JS acha que um líder 0significa que você quer octal ...
ETHproductions
Hmmm ... OK, acho que tenho uma alternativa - levará alguns minutos para testá-lo e jogar golfe.
Shaggy
Eu acho que isso falhará agora em alguns casos, que contém dois 0s seguidos por outros dois dígitos ... ( 40043, por exemplo) Basta adicionar um +após o 0para corrigir isso.
ETHproductions
2

Mathematica, 75 bytes

And@@Table[PrimeQ@ToExpression@StringInsert[#,"+",n],{n,2,StringLength@#}]&

Functionque espera a String. PrimeQ@ToExpression@StringInsert[#,"+",n]retorna se a inserção de um +após o ndígito th fornece um número primo. Table[...,{n,2,StringLength@#}]fornece a lista desses valores como nintervalos do 2comprimento da sequência. Em seguida, extraímos Andcada um dos elementos dessa lista. Convenientemente, se StringLength@#<2, então Table[...]é a lista vazia, para a qualAnd@@{}==True

ngenisis
fonte
2

Mathematica, 55 50. 45 49. 50. 54 62 bytes

Parece que devo publicá-lo separadamente.

+6 bytes para o tamanho do código medido novamente.

+5 bytes graças a ngenisis.

And@@(qPrimeQ[#~Mod~q+⌊#/q⌋])@Rest@PowerRange@#&

Pega a entrada como um número inteiro e retorna regular Truee False. O meio é o unicode 0xF4A1, abreviação de Function[,]. O tamanho do código é medido no tamanho do arquivo (UTF-8 sem BOM), comente se não estiver correto.

PowerRange[x]retorna 1, 10, 100 ... não é maior que x, que é introduzido no Mathematica 10.

Keyu Gan
fonte
2

Inglês simples 4.204 341 315 251 241 240 bytes

(Re) incorporou o teste de primalidade à biblioteca da Plain English, movendo 3.863 bytes para a biblioteca da Plain English. Excluídos 26 bytes de espaço em branco. Economizou 64 bytes abreviando variáveis ​​locais. Economizou 10 bytes abreviando a interface. Por sugestão do RosLuP , economize 1 byte alterando como m é inicializado e incrementado.

To decide if a n number is g:
Put 1 in a m number.
Loop.
Multiply the m by 10.
If the m is greater than the n, say yes.
Divide the n by the m giving a q quotient and a r remainder.
Add the q to the r.
If the r is not prime, say no.
Repeat.

Versão não destruída do código final:

To decide if a number is magnanimous:
  Put 1 in another number.
  Loop.
    Multiply the other number by 10.
    If the other number is greater than the number, say yes.
    Divide the number by the other number giving a quotient and a remainder.
    Add the quotient to the remainder.
    If the remainder is not prime, say no.
  Repeat.

Notas: O IDE do inglês simples está disponível em github.com/Folds/english . O IDE é executado no Windows. Ele é compilado no código x86 de 32 bits.

O fork dinâmico do inglês simples da Ordem Osmosian já tinha testes de primalidade na versão 4700, mas usava um algoritmo muito ineficiente (de janeiro a junho de 2017). As versões 4001-4011 do fork dinâmico do site GitHub omitiram o teste de primalidade. A versão 4013 do fork dinâmico do site GitHub inclui teste de primalidade. O código para executar o teste de primalidade foi desenvolvido como parte de revisões anteriores desta resposta.

Jaspe
fonte
1

Perl 6 , 58 bytes

{?(10,10* *...^*>$_).map({$_ div$^a+$_%$^a}).all.is-prime}

Experimente online!

10, 10 * * ...^ * > $_é a sequência geométrica de múltiplos de dez, tirada até uma antes do elemento que excede o parâmetro de entrada $_. Depois, verificamos que, para cada potência de dez, a soma do parâmetro de entrada obtido div e mod é a potência principal.

Sean
fonte
1

Haskell, 114 110 bytes

p x=[x]==[i|i<-[2..x],x`mod`i<1]
i!x|i<1=0<1|0<1=p(uncurry(+)$divMod x$10^i)&&(i-1)!x
f x=(length(show x)-1)!x

Ungolfed com explicação:

-- Check if x is a prime number
p x = [x] == [i | i<-[2..x], x`mod`i < 1]
-- Checks all pairs of numbers a '+' can be put in between
i ! x | i<1 = 0<1                                -- Single-digit numbers are always truthy
      | 0<1 = p (uncurry (+) $ divMod x $ 10^i)  -- Does x split at i digits from right sum up to a prime?
           && (i-1) ! x                          -- If so, check next pair
-- Start (!) with the number of digits in x minus one
f x = (length (show x)-1) ! x
siracusa
fonte
Se você usar p x=[x]==[i|i<-[2..x],x`mod`i<1]como cheque principal, poderá salvar 2 bytes.
Wheat Wizard
Você também pode usar em divMod x$10^ivez dex`divMod`(10^i)
Assistente de Trigo
@ WheatWizard: Eu sabia que o teste principal ainda poderia ser melhorado de alguma forma. ;) Obrigado!
precisa
1

Axioma, 88 bytes

f(n:PI):Boolean==(i:=10;repeat(q:=n quo i;q=0 or ~prime?(q+n rem i)=>break;i:=i*10);q=0)

teste e resultados

(10) -> [[i,f(i)]  for i in [1,2,4,10,98,101,109,819,4063,40427,2000221,999999999999999999999999999999999999999999999]]
   (10)
   [[1,true], [2,true], [4,true], [10,false], [98,true], [101,true],
    [109,false], [819,false], [4063,true], [40427,true], [2000221,true],
    [999999999999999999999999999999999999999999999 ,false]]
RosLuP
fonte
1

Braquilog , 11 bytes

{~cĊℕᵐ+}ᶠṗᵐ

Experimente online!

{      }ᶠ      Find every
      +        sum of
   Ċ           two
    ℕᵐ         whole numbers
 ~c            which concatenate to the input,
          ᵐ    and assert that all of them
         ṗ     are prime.
String não relacionada
fonte
1

Perl 6 , 35 bytes

{m:ex/^(.+)(.+)$/.all.sum.is-prime}

Experimente online!

Explicação:

{                                 }     # Anonymous code block that
 m:ex/^        $/                         # Match all
       (.+)(.+)                           # Splits of the input number
                 .all                     # Are all of them
                     .sum                   # When summed
                         .is-prime          # Prime?
Brincadeira
fonte
0

Empilhados , 51 bytes

[tostr:#'1-~>splitat tr['+',' '#`#~prime]map 1,all]

Experimente online!

Esta é uma função. Ele funciona convertendo seu argumento em uma string ( tostr), duplicando-o e obtendo seu comprimento ( :#'), subtraindo 1 ( 1-), variando de 1 a esse número ( ~>). A pilha se parece com isso, para entrada 40427:

('40427' (1 2 3 4))

Executamos vetorizados splitat, resultando na seguinte matriz para estar no topo da pilha:

(('4' '40' '404' '4042') ('0427' '427' '27' '7'))

Transpondo isso tr, obtemos:

(('4' '0427') ('40' '427') ('404' '27') ('4042' '7'))

Em seguida, mapeamos a função ['+',' '## ~ prime] (withmap`). Esta função faz:

['+',' '#`#~prime]
 '+',                concatenate a plus sign (string)    `('4' '0427' '+')
     ' '#`           join by spaces                      `'4 0427 +'`
          #~         evaluate                            `431`
            prime    check primality                     `1`

Depois, depois do mapa, concatenamos 1. Isso ocorre desde que allretorna undefpara uma lista vazia.

Conor O'Brien
fonte
0

JavaScript (ES6), 70 bytes

P=(n,x=2)=>n%x?P(n,x+1):n==x
f=(n,i=10)=>i>n||P((n/i|0)+n%i)&f(n,i*10)

Falha no último caso no meu navegador devido a um erro "muita recursão" durante o cálculo P(200023). Espero que isso não o invalide.

ETHproductions
fonte
0

QBIC , 38 bytes

_L;|[a-1|q=q*µ!_sA,b|!+!_sA,b+1,a|!}?q

Explicação

_L |     Create a variable a and set it to the length of
  ;      the input string (A$)
[a-1|    FOR b = 1 to a-1
q=q*     multiply q by
 µ       -1 if prime, 0 if not, of
  !        a cast of 
   _s       a substring of
     A,       A$
     b        from index 1 to index b (only one index is given, so that is assumed to be the req. length from 1)
      |!   to number
 +         plus
 !         a cast of
  _s         a substring of
    A,         A$
    b+1        from index b+1
    ,a         for the length of a (does not error if it exceeds the end of the string)
      |!   to number
 }       NEXT 
 ?q      PRINT q, which is eitrher -1 or 1 for all-prime sums, or 0 otherwise
steenbergh
fonte
0

CJam (21 bytes)

r:R,({RiA@)#md+mp!},!

Demonstração online , conjunto de testes on-line

Dissecação

r:R       e# Take a token of input and assign it to R
,(        e# Take the length of R minus one
{         e# Filter i = 0 to (length of R minus two)
  Ri      e#   Push R as an integer value
  A@)#    e#   Push 10 to the power of (i + 1)
  md      e#   divmod
  +mp!    e#   Add, primality test, negate result
},        e# The result of the filter is a list of splits which give a non-prime
!         e# Negate result, giving 0 for false and 1 for true
Peter Taylor
fonte
0

Pitão, 15 14 bytes

.AmP_svcz]dtUz

Suíte de teste

Salvou um byte usando a mais nova alteração de Pyth.

isaacg
fonte
0

APL (NARS), caracteres 35, bytes 70

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}

teste:

  f←{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
  f¨1 2 4 10 98 101 109 819 4063 40427 2000221
1 1 1 0 1 1 0 0 1 1 1 

Esta seria a tradução em APL do Axiom post algo aqui ...

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
 0≥k←¯1+≢⍕⍵:1⋄  assign to k the length as array of argument return 1 if that is <=0
 ∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k
              m←10*⍳k  m is the array pow(10,1..k)
           ⌊⍵÷m       the array of quotient of argumet with m
          +           sum 
     (m∣⍵)            with array of remander
   0π                 build the binary array of "are prime each"
 ∧/                   and that array
RosLuP
fonte
0

PHP, 100 bytes

for(;++$k<strlen($a=$argn);$x+=$i==1)for($i=$n=substr($a,$k)+$b.=$a[$k-1];--$i&&$n%$i;);echo$x+2>$k;

imprime 1se a entrada for magnânima, se não houver saída vazia. Execute como pipe -nRou experimente online .

Titus
fonte