Há um tempo, observei a fatoração principal de 27000:
27000 = 2 3 × 3 3 × 5 3
Há duas coisas especiais sobre isso:
- primo consecutivo : os primos são consecutivos: 2 é o primeiro primo, 3 é o segundo primo, 5 é o terceiro primo.
- expoente constante : o expoente é o mesmo para cada primo (sempre 3)
Matematicamente expresso:
Um número inteiro x é um número de primos consecutivos / expoente constante, se existirem números inteiros estritamente positivos n , k , m de modo que x = p n m × p n +1 m × ... × p n + k m , em que p j é o j- ésimo primo
Sua tarefa é testar se um número inteiro positivo atende a essas condições.
Entrada:
Um número inteiro positivo> 1, de qualquer forma razoável.
Saída:
Um dos dois valores, pelo menos um dos quais deve ser constante, indicando se a entrada é um número de primo consecutivo / expoente constante.
Casos de borda:
- os primos são verdadeiros, pois a fatoração para o primo p é p 1
- outros números que podem ser escritos como p m onde p é primo também são verdadeiros.
Regras:
- Aplicam-se brechas padrão.
- Não se preocupe com o excesso de números inteiros, mas números de até 255 devem funcionar.
- O menor código em bytes vence.
Casos de teste:
Verdade:
2
3
4
5
6
7
8
9
11
13
15
27000
456533
Falsy:
10
12
14
72
10000000
Aqui está um script python gerando alguns casos de teste.
x = Pn^m
parte. Estou assumindo que você significou Pn é o primeiro-n-thRespostas:
05AB1E , 4 bytes
Experimente online!
Explicação
fonte
ÎÓKË
é tudo que consigo pensar além disso, legal ... Eu estava pensando,ß
mas faz o oposto do que eu pensava.Regex (ECMAScript),
276205201193189 bytesComparar as multiplicidades (expoentes) de diferentes fatores primos é um problema interessante para resolver com o regex ECMAScript - a falta de referências anteriores que persistem através das iterações de um loop torna um desafio contar qualquer coisa. Mesmo que seja possível contar a característica numérica em questão, muitas vezes uma abordagem mais indireta contribui para um melhor golfe.
Como em outras postagens de regex do ECMA, darei um aviso de spoiler: recomendo aprender como resolver problemas matemáticos unários no regex do ECMAScript. Foi uma jornada fascinante para mim, e não quero estragá-la para quem potencialmente queira experimentá-la, especialmente aqueles com interesse em teoria dos números. Consulte esta postagem anterior para obter uma lista de problemas recomendados consecutivamente identificados por spoilers para resolver um por um.
Portanto , não leia mais se não quiser que você estrague uma mágica avançada de expressões regulares unárias . Se você quiser tentar descobrir essa mágica, recomendo começar resolvendo alguns problemas no regex ECMAScript, conforme descrito no post acima.
A carga útil principal de um regex que eu desenvolvi anteriormente se mostrou muito aplicável a esse desafio. Esse é o regex que encontra os primos da maior multiplicidade . Minha primeira solução para isso foi muito longa e, mais tarde, joguei por etapas, primeiro reescrevendo-o para usar lookahead molecular e, em seguida, enviando-o de volta ao ECMAScript simples, usando uma técnica avançada para solucionar a falta de lookahead molecular e, posteriormente, diminuindo o tamanho da solução ECMAScript original.
A parte desse regex que se aplica a esse problema é a primeira etapa, que encontra Q, o menor fator de N que compartilha todos os fatores primos. Quando temos esse número, tudo o que precisamos fazer para mostrar que N é um "número de expoente constante" é dividir N por Q até que não possamos mais; se o resultado for 1, todos os números primos são de igual multiplicidade.
Depois de enviar uma resposta usando meu algoritmo desenvolvido anteriormente para encontrar Q, percebi que ele poderia ser calculado de uma maneira totalmente diferente: Encontre o maior fator livre de quadrados de N (usando o mesmo algoritmo que meu número regular de Carmichael ). Como se vê, isso não apresenta nenhuma dificuldade * em termos de contornar a falta de visores moleculares e de comprimento variável (não há necessidade de usar a técnica avançada usada anteriormente) e é 64 bytes mais curto! Além disso, elimina a complexidade de tratar N livre de quadrados e N principal como casos especiais diferentes, eliminando outros 7 bytes desta solução.
(Ainda existem outros problemas que exigem a técnica avançada usada anteriormente para reduzir o cálculo de Q, mas atualmente nenhum deles é representado pelos meus posts do PPCG.)
Coloquei o teste de multiplicidade antes do teste dos primos consecutivos, porque o último é muito mais lento; colocar testes que podem falhar mais rapidamente primeiro torna o regex mais rápido para entrada distribuída uniformemente. Também é melhor colocar o golfe em primeiro lugar, porque ele usa mais referências anteriores (que custariam mais se fossem de dois dígitos).
Consegui eliminar 4 bytes desse regex (193 → 189) usando um truque encontrado por Grimy que pode reduzir ainda mais a divisão no caso de garantir que o quociente seja maior ou igual ao divisor.
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
Experimente online!
* Ainda é mais limpo com a cabeça molecular, sem nenhum caso especial para N estar livre de quadrados. Isso elimina 6 bytes, produzindo uma solução de
195187183 bytes :^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
Aqui é portado para lookbehind de comprimento variável:
Regex (ECMAScript 2018),
198195194186182 bytes^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
Experimente online!
fonte
.*$\2
por\2^
^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
Geléia ,
1365 bytesExperimente online!
Ainda ultrapassado ... (obrigado Erik por -1 byte)
Explicação
fonte
œl
->t
. Não há razão para que zeros à direita estejam presentes na saída de ÆE.JavaScript (ES6), 87 bytes
Retorna 0 para truthy ou um número inteiro diferente de zero para falsy.
Experimente online!
Comentado
fonte
j||i
parai
. Agora produz muitos falsos positivos.CJam ,
3029 bytesExperimente online!
Minha primeira resposta após uma pausa de quase 2 (!) Anos, provavelmente pode ser mais praticada. Este é um bloco que recebe a entrada como um número inteiro (também pode ser mapeado para matrizes de números inteiros).
Explicação
fonte
Stax ,
56 bytesExecute e depure
Descompactado, não jogado e comentado, parece com isso.
Edit:
Isso não funcionaFunciona agora.512
. Vou pensar um pouco e, espero, uma correção mais tarde.fonte
Stax , 9 bytes
1 é verdade, 0 é falso
Execute e depure
Explicação
Provavelmente pode ser mais jogado, mas abrange os casos que estavam faltando na última solução.
fonte
MATL ,
12 1110 bytesExperimente no MATL Online!
Agradecimentos a Luis Mendo pela parte remover-zero-à-zero. Ele também apontou que a troca de valores de verdade é permitida, portanto, retorna 0 para números que satisfazem os requisitos de desafio e qualquer valor positivo caso contrário.
Grosso Modo, isso gera os expoentes da fatoração primária sequencial, remove os zeros iniciais e calcula o desvio padrão.
fonte
0iYFhdz
funciona para 7 bytes: acrescente um 0 aos expoentes da fatoração seqüencial, diferenças consecutivas, número de não-zeros. O resultado é1
sse satisfaz entrada a exigênciaJava 10,
223191178176168 bytesRetorna como verdade
1
e>=2
como falsey.Experimente online.
Explicação:
Alguns exemplos de entradas:
n=15
:1
para o primeiro 2 primo (porque 15 não é divisível por 2).1
para0
assim que estiver no início 3. Como 15 é divisível por 3,n
passa a 5 (15/3 1 ) e o Conjunto passa a ser[] → [1]
.n
torna-se 1 (5/5 1 ) e o Conjunto permanece o mesmo ([1] → [1]
).n=1
, paramos o loop externo. O Set ([1]
) contém apenas um item, o1
de ambos os primos adjacentes 3 e 5, portanto, retornamos true.n=14
:1
para0
para o primeiro prime 2 (porque 14 é divisível por 2).n
torna-se 7 (14/2 1 ) e o conjunto torna-se[] → [1]
.n
permanece o mesmo e o conjunto se torna[1] → [1,0]
.n
permanece o mesmo e o conjunto também é o mesmo ([1,0] → [1,0]
).n
torna-se 1 (7/7 1 ), e o Conjunto permanece o mesmo ([1,0] → [1,0]
).n=1
, paramos o loop externo. O conjunto ([1,0]
) contém dois itens, o1
dos primos não adjacentes 2 e 7 e o0
dos primos 3 e 5, portanto, retornamos false.n=72
:1
a0
pela primeira Prime 2, porque 72 é divisível por 2 (várias vezes).n
Torna-se então 9 (72/2 3 ) e o conjunto torna-se[] → [3]
.n
torna-se 1 (9/3 2 ) e o conjunto se torna[3] → [3,2]
.n=1
, paramos o loop externo. O conjunto ([3,2]
) contém dois itens, o3
do primo 2 e o2
do primo 3; portanto, retornamos false.fonte
<2
e retornar um int (especifique que você devolve 1 para verdade).1
é verdade e2
ou superior é falsey. Obrigado.J , 16 bytes
Muito obrigado a FrownyFrog por -8 bytes!
Experimente online!
Minha solução antiga:
J , 24 bytes
Experimente online!
Explicação:
_&q:
expoentes principais{.@I.}.]
remove os zeros à esquerda localizando o primeiro elemento diferente de zero:1=[:#@~.
testa se todos os números restantes são iguais:fonte
Casca , 11 bytes
Experimente online!
Emite 0 se não for um número consecutivo de primo / expoente constante.
fonte
MATL , 7 bytes
O resultado é
1
se a entrada satisfizer o requisito.Experimente online! Ou verifique todos os casos de teste
Explicação
fonte
Oitava , 67 bytes
Experimente online!
Eu acredito que esta é a única solução que usa um histograma.
Explicação:
Isso cria um histograma, onde a variável a ser contada é o fator da entrada e colocada nas posições
primes(x)
, que são todos os números primos menores que a entrada. Em seguida, encontramos a localização dos fatores primos, toma a diferença entre cada um dos índices e subtrai um. Se houver algum elemento que não seja zero (ou seja, a diferença dos índices dos números primos não é 1), isso resultará em um valor falso, caso contrário, ele retornará um valor verdadeiro.Em seguida, verificamos que todos os elementos diferentes de zero no histograma são iguais ao elemento máximo. Se houver valores diferentes, isso resultará em um valor falso, caso contrário, ele retornará um valor verdadeiro.
Se ambos os blocos são verdadeiros, nossa entrada é um número de expoente constante constante consecutivo!
fonte
APL (Dyalog Extended) , 28 bytes
Experimente online!
Quão:
fonte
Wolfram Language (Mathematica) , 65 bytes
Experimente online!
fonte
Pari / GP , 63 bytes
Experimente online!
fonte
J , 14 bytes
1 na saída indica expoente constante consecutivo.
Experimente online!
fonte
Limpo , 127 bytes
Experimente online!
Define a função
? :: Int -> Bool
usando$ :: Int -> [Int]
para fatorar e@ :: Int -> Bool
verificar a primalidade.fonte
APL (NARS) 41 caracteres, 82 bytes
{π⍵} é a fatoração de função do argumento ⍵ na lista de fatores primos (repita se um primo aparecer mais tempo);
{1π⍵} é a função next prime (observe que, neste caso, seu argumento não é um escalar, mas uma matriz de números inteiros). teste:
fonte