Calcular o número, edição de divisores

11

Inspirado por esta pergunta sobre matemática.

Deixe Fatorização privilegiada de um número, n , ser representada como P (n) = 2 a x 3 b x 5 c x ... .
(Usando x como o sinal de multiplicação.)
Em seguida, o número de divisores de n pode ser representada como se D (n) = (a + 1) x (b + 1) x (c + 1) ... .
Assim, podemos facilmente dizer que o número de divisores de 2n é D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
o número de divisores de 3n é D (3n ) = (a + 1) x (b + 2) x (c + 1) ... ,
e assim por diante.

Desafio:

Escreva um programa ou função que use essas propriedades para calcular n , considerando determinadas entradas do divisor.

Entrada:

Um conjunto de números inteiros, vamos chamá-los de w, x, y, z , com todas as seguintes definições:

  • todas as entradas são maiores que 1 - w, x, y, z > 1
  • x e z são distintos -x<>z
  • x e z são primos - P(x)=x, D(x)=2e P(z)=z,D(z)=2
  • w é o número de divisores de xn -D(xn)=w
  • y é o número de divisores de zn -D(zn)=y

Para o problema fornecido na pergunta vinculada, um exemplo de entrada poderia ser (28, 2, 30, 3). Isso se traduz em D(2n)=28e D(3n)=30, com n=864.

Resultado:

Um único inteiro, n , que satisfaz as definições e restrições de entrada acima. Se vários números se ajustarem às definições, produza o menor. Se esse número inteiro não for possível, imprima um valor de falsey .

Exemplos:

(w, x, y, z) => output

(28, 2, 30, 3) => 864
(4, 2, 4, 5) => 3
(12, 5, 12, 23) => 12
(14, 3, 20, 7) => 0 (or some other falsey value)
(45, 13, 60, 11) => 1872
(45, 29, 60, 53) => 4176

Regras:

  • Aplicam-se regras padrão de código de golfe e restrições de brechas .
  • Aplicam- se regras de entrada / saída padrão .
  • Os números de entrada podem estar em qualquer ordem - especifique na sua resposta qual ordem você está usando.
  • Os números de entrada podem estar em qualquer formato adequado: espaço separado, matriz, função separada ou argumentos de linha de comando, etc. - sua escolha.
  • Da mesma forma, se a saída para STDOUT, o espaço em branco circundante, a nova linha à direita etc. forem opcionais.
  • A análise de entrada e a formatação da saída não são os recursos interessantes desse desafio.
  • No interesse da complexidade sadia e do excesso de números inteiros, o número do desafio n terá restrições tais que 1 < n < 100000- ou seja, você não precisa se preocupar com possíveis respostas fora desse intervalo.

Relacionado

AdmBorkBork
fonte
Portanto, se a menor solução for maior que 100.000, posso optar por retornar uma solução ou zero?
Dennis
@ Dennis Se o código for mais curto, com certeza. Qualquer um seria aceitável.
AdmBorkBork

Respostas:

3

Geléia , 17 16 bytes

×€ȷ5R¤ÆDL€€Z=Ḅi3

Esta é uma solução de força bruta que tenta todos os valores possíveis até 100.000. Experimente online!

Versão não concorrente

A versão mais recente do Jelly possui uma correção de bug que permite reduzir o código acima para 15 bytes .

ȷ5R×€³ÆDL€€=Ḅi3

Experimente online!

Como funciona

×€ȷ5R¤ÆDL€€Z=Ḅi3  Main link. Left input: x,z. Right input: w,y

     ¤            Combine the two atoms to the left into a niladic chain.
  ȷ5              Yield 100,000 (1e5).
    R             Apply range. Yields [1, ..., 100,000].
x€                Multiply each r in the range by x and z.
                  This yields [[x, ..., 100,000x], [z, ..., 100,000z]].
      ÆD          Compute the divisors of each resulting integer.
        L€€       Apply length to each list of divisors.
                  This counts the divisors of each integer in the 2D array.
           Z      Zip; group the divisors of kx and kz in pairs.
            =     Compare each [divisors(kx), divisors(kz)] with [w, y].
                  This yields a pair of Booleans.
             Ḅ    Convert each Boolean pair from binary to integer.
              i3  Find the first index of 3. Yields 0 for not found.
Dennis
fonte
Parabéns, você ganha por padrão! : D
AdmBorkBork