Calcola il numero, Divisors Edition


11

Ispirato da questa domanda su Math.

Lasciare la fattorizzazione prima di un numero, n , essere rappresentato come P (n) = 2 una x 3 b x 5 c x ... .
(Usando x come simbolo di moltiplicazione.)
Quindi il numero di divisori di n può essere rappresentato come D (n) = (a + 1) x (b + 1) x (c + 1) ... .
Quindi, possiamo facilmente dire che il numero di divisori di 2n è D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
il numero di divisori di 3n è D (3n ) = (a + 1) x (b + 2) x (c + 1) ... ,
e così via.

Sfida:

Scrivi un programma o una funzione che utilizza queste proprietà per calcolare n , dati alcuni input divisori.

Ingresso:

Un insieme di numeri interi, chiamiamoli w, x, y, z , con tutte le seguenti definizioni:

  • tutti gli ingressi sono maggiori di 1 - w, x, y, z > 1
  • x e z sono distinti -x<>z
  • x e z sono primi - P(x)=x, D(x)=2e P(z)=z,D(z)=2
  • w è il numero di divisori di xn -D(xn)=w
  • y è il numero di divisori di zn -D(zn)=y

Per il problema indicato nella domanda collegata, potrebbe essere un esempio di input (28, 2, 30, 3). Questo si traduce in D(2n)=28e D(3n)=30, con n=864.

Produzione:

Un singolo intero, n , che soddisfa le definizioni e le restrizioni di input sopra riportate. Se più numeri corrispondono alle definizioni, genera il più piccolo. Se tale numero intero non è possibile, emettere un valore false .

Esempi:

(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

Regole:

  • Si applicano le regole standard del code-golf e le restrizioni sulle scappatoie .
  • Si applicano le regole standard di input / output .
  • I numeri di input possono essere in qualsiasi ordine: specificare nella risposta quale ordine si sta utilizzando.
  • I numeri di input possono essere in qualsiasi formato adatto: spazio separato, un array, funzioni separate o argomenti della riga di comando, ecc. - a scelta.
  • Allo stesso modo, se l'output su STDOUT, lo spazio bianco circostante, la nuova riga finale, ecc. Sono tutti facoltativi.
  • L'analisi dell'input e la formattazione dell'output non sono le caratteristiche interessanti di questa sfida.
  • Nell'interesse di una sana complessità e traboccamenti di numeri interi, il numero di sfida n avrà restrizioni tali che 1 < n < 100000, ad esempio, non è necessario preoccuparsi di possibili risposte al di fuori di questo intervallo.

Relazionato


Quindi, se la soluzione più piccola è maggiore di 100.000, posso scegliere di restituire una soluzione o zero?
Dennis,

@Dennis Se accorcia il tuo codice, certo. O sarebbe accettabile.
AdmBorkBork,

Risposte:


3

Gelatina , 17 16 byte

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

Questa è una soluzione di forza bruta che prova tutti i possibili valori fino a 100.000. Provalo online!

Versione non competitiva

L'ultima versione di Jelly ha una correzione di bug che consente di ridurre il codice sopra a 15 byte .

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

Provalo online!

Come funziona

×€ȷ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.

Complimenti, vinci per impostazione predefinita! : D
AdmBorkBork,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.