Dado um número inteiro N > 1
, produza todos os outros números cujas decomposições primárias tenham os mesmos dígitos que a decomposição primária deN
.
Por exemplo, se N = 117
, então a saída deve ser [279, 939, 993, 3313, 3331]
, porque
117 = 3 × 3 × 13
portanto, os dígitos disponíveis são 1
, 3
, 3
e 3
e temos
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Esses são os únicos outros números possíveis, porque outra combinação desses dígitos gera números inteiros não primos, o que não pode ser o resultado da fatoração primária.
Se N
é qualquer um 117
, 279
, 939
, 993
, 3313
ou 3331
, então a saída conterá os cinco outros números: são factores primários amigos.
Você não pode usar zeros à esquerda para obter números primos, por exemplo N = 107
, pois , seu único amigo é 701
( 017
não é considerado).
Entradas e Saídas
Os amigos de entrada e saída devem ser recebidos e retornados na base decimal.
N
sempre será estritamente maior que1
.A saída pode ser formatada com bastante liberdade, desde que contenha apenas os elementos sintáticos de amigos e separadores / lista.
A ordem da saída não é importante.
Você pode inserir a entrada
STDIN
como argumento de função ou algo semelhante.Você pode imprimir a saída
STDOUT
, retorná-la de uma função ou algo semelhante.
Casos de teste
Seu programa deve resolver qualquer um dos casos de teste abaixo em menos de um minuto .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
Ç€=$
seria um pouco mais rápido queÇ€=Ç
, dada a restrição de tempo.PowerShell v3 +, 450 bytes
Finalmente!
O PowerShell não possui nenhum recurso interno para verificação, fatoração ou permutações de primalidade, portanto, isso é feito manualmente. Eu trabalhei com um monte de truques de otimização para tentar reduzir a complexidade de tempo para algo que vai caber nas restrições de desafio, e eu estou feliz em dizer que eu finalmente conseguiu -
Explicação
Há muita coisa acontecendo aqui, então vou tentar explicar.
A primeira linha leva entrada
$n
e define umfunction
,f
. Essa função usa a divisão de teste acumulativo para criar uma lista dos fatores principais. É bastante rápido para entradas pequenas, mas obviamente atola se a entrada é grande. Felizmente, todos os casos de teste são pequenos, portanto isso é suficiente.A próxima linha recebe os
f
atores$n
,-split
é-los em cada dígito ignorando qualquer resultado vazias (isto é necessário devido à forma como PowerShell faz correspondência regex e como ele se move o ponteiro através da entrada e é meio chato para fins de golfe), entãosort
é os resultados em ordem ascendente. Armazenamos essa matriz de dígitos$x
e a usamos como entrada de um|?{...}
filtro para extrair apenas aqueles que são primos. Esses dígitos primos são armazenados$y
para uso posterior.Nós então dividimos
$x
em dois componentes. O primeiro dígito (ou seja, o menor) é armazenado$a
, enquanto o restante é passado$b
. Se$x
tiver apenas um dígito,$b
será vazio / nulo. Precisamos, então, relançar$a
como uma matriz, para usar o operador de vírgula rapidamente.Em seguida, precisamos construir todas as permutações possíveis dos dígitos. Isso é necessário, para que nossos testes de divisão posteriormente ignorem vários números e tornem as coisas mais rápidas em geral.
Enquanto houver um elemento
$b
, separamos o primeiro dígito$z
e deixamos o restante$b
. Então, precisamos acumular no$a
resultado de algumas fatias e cubos de cordas. Tomamos$a+$y
como concatenação de array e, para cada elemento, construímos uma nova string$c
, em seguida passamos por$c
's.length
e inserimos$z
em todas as posições, incluindo$z$c
anexos e anexos$c$z
,select
incluindo apenas os-u
elementos específicos. Isso é novamente concatenado$a
e armazenado novamente em array$a
. Sim, isso acabar tendo coisas patetas acontecer, como você pode obter3333
para a entrada117
, que na verdade não é uma permutação, mas é muito mais curto do que tentar filtrá-las explicitamente, garante que obtemos todas as permutações e é apenas um pouco mais lento.Portanto, agora
$a
tem uma matriz de todas as permutações possíveis (e algumas) dos dígitos do fator. Precisamos redefinir$x
para ser nosso limite superior de possíveis resultados|sort
inserindo os dígitos em-des
ordem pendente e-join
juntando-os novamente. Obviamente, nenhum valor de saída pode ser maior que esse número.Montamos nossa matriz auxiliar
$l
como uma matriz de valores que vimos anteriormente. Em seguida, extraímos todos os valores$a
(ou seja, aquelas permutações) que são primos e inserimos um loop que é o maior tempo gasto em todo o programa ...A cada iteração, passamos
0
para o limite superior$x
, incrementando o elemento atual$j
. Desde que o$i
valor que estamos considerando não seja um múltiplo de um valor anterior (essa é a0-notin($l|%{$i%$_})
seção), é um candidato potencial à saída. Se tomarmos osf
atores$i
,sort
eles, e eles-eq
ual$x
, em seguida, adicione o valor para o pipeline. No final do loop, adicionamos nosso elemento atual$j
em nossa$l
matriz para uso da próxima vez, pois já consideramos todos esses valores.Finalmente, aderimos
|?{$_-ne$n}
para extrair aqueles que não são o elemento de entrada. Eles são todos deixados no pipeline e a produção está implícita.Exemplos
fonte
CJam ,
2623 bytesExperimente online
Explicação
Concatenar dois números sempre dá um resultado maior do que multiplicá-los. Portanto, o maior número que precisamos considerar é o maior número que podemos formar a partir dos dígitos da fatoração primária da entrada, que são apenas todos os dígitos classificados em ordem decrescente. Para os números indicados, esse limite superior é facilmente pequeno o suficiente para que possamos verificar exaustivamente todos os números no intervalo, para saber se é um fator primordial:
fonte
05AB1E , 17 bytes
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
Pyth, 17
Conjunto de teste .
Usa a mesma observação do post de Martin .
Expansão:
fonte
JavaScript (ES6),
163158 bytesEditar : Foi esclarecido que um primo como 23 deve retornar [6], em vez de um conjunto de resultados vazio. Economizou 5 bytes removendo uma regra agora inútil que, de propósito, impedia que isso acontecesse.
O último caso de teste é comentado para que esse trecho seja executado com rapidez suficiente, embora também seja concluído em menos de um minuto.
fonte
PHP 486 bytes
provavelmente poderia ser mais curto com um algoritmo que não é assim pelo livro.
(mas eu gosto da contagem atual de bytes)
demolir
fonte
Na verdade, 27 bytes
Isso usa o mesmo algoritmo usado por Martin , Adnan , FryAmTheEggman e Dennis . Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
PowerShell, 147 bytes (versão CodeGolf)
Nota: O script resolve os últimos casos de teste em menos de 3 minutos no meu notebook local. Veja a solução "performance" abaixo.
Script de teste com menos golfe:
Saída:
PowerShell, 215 bytes (versão "Desempenho")
Nota: acredito que os requisitos de desempenho estão em conflito com o princípio GodeGolf. Mas como havia uma regra
Your program should solve any of the test cases below in less than a minute
, fiz duas alterações para satisfazer a regra:-split'(.)'-ne''
em vez disso, o código curto|% t*y
;Cada alteração reduz o tempo da avaliação pela metade. Por favor, não pense que eu usei todos os recursos para melhorar o desempenho. Apenas esses foram suficientes para satisfazer a regra.
Script de teste com menos golfe:
Saída:
fonte
Japonês, 18 bytes
Tente
fonte