A tarefa é calcular a soma divisória de um número, dada sua fatoração primária.
Entrada
Duas matrizes (ou algo equivalente) de comprimento n , uma contendo o fator primo e a outra contendo o expoente correspondente.
Resultado
A soma de todos os divisores (incluindo o próprio número).
Exemplo
O número 240 tem 2, 3 e 5 como fatores primos, com 4, 1 e 1 como os respectivos expoentes. A saída esperada seria então 744.
Input: [2,3,5] [4,1,1]
Output: 744
Pontuação
O menor código em bytes vence!
Se a complexidade do tempo de execução da sua solução for O (soma dos expoentes) em vez de O (produto dos expoentes), sua pontuação poderá ser multiplicada por 0,8.
Havia uma pergunta semelhante postada aqui, mas não era um desafio. Eu acho que o problema é interessante o suficiente para ser jogado.
O vencedor será escolhido neste fim de semana
Respostas:
Pitão, 13 bytes * 0,8 = 10,4
Demonstração.
Essa resposta funciona de maneira um pouco diferente das anteriores. Para calcular a soma dos fatores das potências primárias do número, em vez de usar uma fórmula aritmética, os fatores são explicitamente construídos e somados.
Por exemplo, no par [nobre, expoente]
[2, 4]
, mapeamos2 ^ x
mais0, 1, 2, 3, 4
, dando[1, 2, 4, 8, 16]
, que é então resumido a 31.Os resultados são então multiplicados e impressos.
Se a exponenciação for implementada corretamente, ou se houver um cache intermediário de resultados, será
O(sum of exponents)
.fonte
O(n)
se pudermos assumir que a base é uma constante.CJam, 15 bytes * 0,8 = 12
Experimente online . A ordem de entrada é a lista de expoentes primeiro e depois a lista de números primos (-3 bytes graças a @Dennis) .
Para cada par expoente primo
(p, e)
encontreentão encontre o produto de tudo isso. Por exemplo, para 240 isso seria
Dependendo de como a exponenciação é implementada, isso pode ser melhor que
O(sum of exponents)
.fonte
APL,
1813 bytes * 0,8 = 10,4Isso cria um trem de funções diádico que pega a matriz de fatores à esquerda e os expoentes à direita.
Experimente online . Observe que esta é a mesma abordagem que a resposta CJam incrivelmente inteligente do Sp3000 .
Economizou 5 bytes graças a Dennis!
fonte
TI-BASIC, 17 bytes * 0,8 = 13,6
Também usa o método do Sp3000, embora eu o tenha encontrado de forma independente. Leva uma lista da entrada e uma da tela inicial.
Utilizar prod (duas vezes é menor porque nos permite usar os parênteses abertos gratuitamente. Observe que esta resposta não suporta matrizes vazias, porque não existem matrizes vazias no TI-BASIC.
fonte
Haskell, 38 * 0,8 = 30,4
Uso:
A função anônima leva
(p,e)
à soma do divisor para a soma dep^e
séries geométricas. Fechando as duas listas com isso, a união e a retirada do produto dão o resultado.Não consegui encontrar nada mais curto que a expressão aritmética
Talvez haja uma maneira de se livrar do
(\p e->_)
.A definição da função infix fornece o mesmo comprimento (38):
fonte
C ++,
1118077 bytes * 0,8 = 61,6Isso calcula (p ^ (e + 1) -1) / (p-1) e multiplica recursivamente todos os fatores. Descobri isso sozinho há um ano.
Obrigado por ajudar, esqueci totalmente o uso booleano do estilo c ++.
fonte
n==0
simplifica para!n
- ou você poderia reverter os resultados e usar apenasn
Matlab, 53
Exemplo:
fonte
s
e testo todos os divisores possíveis de1
atés
. Por isso é (pelo menos) O (s), que é provavelmente entre O (soma de expoentes) e O (produto de expoentes)Python 2.156
Entrada
Resultado
Explicação
Este programa recebe uma lista de 2 listas: fatores e expoentes.
Em seguida, é criada uma lista de todas as combinações possíveis da lista de expoentes.
e zip com os fatores:
Calcule os fatores para a potência dos expoentes:
e multiplique cada lista (isso nos dá todos os divisores):
Por fim, some todas as listas e imprima:
fonte
Python 3,
134120117Entrada: duas matrizes separadas por vírgula, separadas por vírgula.
Exemplo:
Com NumPy pode ser reduzido para 100 bytes:
fonte
operator
para usarmul
uma vez, você pode usarfloat.__mul__
para salvar vários bytes.Gelatina, não concorrente
Essa resposta não é competitiva, pois o desafio antecede a criação do Jelly.
5 bytes (sem bônus)
Experimente online!
Como funciona
7 bytes (5,6 bytes após bônus)
Como funciona
Experimente online!
fonte
APL, 12 bytes * 0,8 = 9,6
Isso lê duas listas do teclado, primeiro os expoentes, ou seja:
Explicação:
⎕
: lê uma lista do teclado (os expoentes)⍳¨
: para cada número na lista, gere uma lista[1..n]
.⎕*
: leia outra lista do teclado (os números primos) e aumente cada número primo para cada um dos expoentes nas listas correspondentes+/¨
: soma cada lista1+
: adicione um a cada resultado, para compensar a faltax^0
em cada uma das listas×/
: pegue o produto dos resultadosfonte
Raquete (esquema), 65 * 0,8 = 52 bytes
A mesma aritmética que todos os outros
Explicação:
fonte
Python 2, 80 bytes * 0,8 = 64
Isso pressupõe que a entrada seja recebida uma após a outra. Segue a mesma fórmula descrita na resposta CJam do Sp3000.
Se isso não for permitido, usarei isso como uma solução, que obtém uma pontuação de 84 bytes * 0,8 = 67,2. A entrada deve ser separada por vírgula, ie
[2,3,5],[4,1,1]
.Psst. Ei! Esta é uma solução possível no Symbolic, algo em que estou trabalhando:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
fonte
Mathematica, 40 bytes
Sem usar nenhum dos inbuilts que lidam com divisores, para diferenciar da outra solução mathematica no encadeamento.
Entrada é (usando o exemplo)
[{2, 3, 5}, {4, 1, 1}]
fonte
Perl 5, 96 bytes
Obviamente, isso não é vencedor, mas eu decidi escrever por diversão.
É uma sub-rotina:
Veja-o em ação assim:
Como funciona:
($b,$e)=@_
lê a matriz de entrada refs$b
(bases) e$e
(expoentes).$s=1
inicializa o produto.map$s*=$b->[$_]**$e->[$_],0..@$b-1
multiplica$s
por sucessivos poderes de expoente base. Agora$s
é o número composto.$_=1x$s
conjuntos$_
iguais a uma sequência de unidades,$s
longa.$i
é inicializado em 0.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
tenta, para cada número$j
entre 1 e$s
, terminar$_
como$j
caracteres repetidos várias vezes. Se puder,$j
divide$s
e/^(.{$j})*$/
é 1 (caso contrário, é 0) e$i
é aumentado por$j
. Assim, adicionamos ao$i
número de partições em uma partição de tamanho igual a$_
. Como Omar E. Pol aponta ,$i
é o número que estamos procurando.$i
no final retorna$i
.fonte
J, 14 bytes * 0,8 = 11,2
Uso
fonte