Berechnen Sie die Anzahl, Divisors Edition

11

Inspiriert von dieser Frage zu Math.

Lassen Sie die prime Faktorisierung einer Zahl, n , dargestellt werden als P (n) 2 = a x 3 b x 5 C x ... .
(Verwenden von x als Multiplikationssymbol.)
Dann kann die Anzahl der Teiler von n als D (n) = (a + 1) x (b + 1) x (c + 1) ... dargestellt werden .
Somit kann man leicht sagen , dass die Anzahl von Divisoren von 2N ist D (2n) = (a + 2) x (b + 1) x (C + 1) , ... ,
die Anzahl von Divisoren von 3N ist D (3n =) (a + 1) x (b + 2) x (C + 1) , ... ,
und so weiter.

Herausforderung:

Schreiben Sie ein Programm oder eine Funktion, die diese Eigenschaften verwendet, um n bei bestimmten Divisoreingaben zu berechnen .

Eingang:

Eine Reihe von ganzen Zahlen, nennen wir sie w, x, y, z mit allen folgenden Definitionen:

  • Alle Eingänge sind größer als 1 - w, x, y, z > 1
  • x und z sind verschieden -x<>z
  • x und z sind prime - P(x)=x, D(x)=2und P(z)=z,D(z)=2
  • w ist die Anzahl der Teiler von xn -D(xn)=w
  • y ist die Anzahl der Teiler von zn -D(zn)=y

Für das in der verknüpften Frage angegebene Problem könnte ein Eingabebeispiel sein (28, 2, 30, 3). Dies übersetzt zu D(2n)=28und D(3n)=30mit n=864.

Ausgabe:

Eine einzelne Ganzzahl n , die die obigen Definitionen und Eingabebeschränkungen erfüllt. Wenn mehrere Zahlen zu den Definitionen passen, geben Sie die kleinste aus. Wenn keine solche Ganzzahl möglich ist, geben Sie einen Falsey- Wert aus.

Beispiele:

(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

Regeln:

  • Es gelten die Standardregeln für Code-Golf und Lücken .
  • Es gelten die Standard-Eingabe- / Ausgaberegeln .
  • Die eingegebenen Nummern können in beliebiger Reihenfolge angegeben werden. Bitte geben Sie in Ihrer Antwort an, welche Reihenfolge Sie verwenden.
  • Eingabenummern können in jedem geeigneten Format vorliegen: durch Leerzeichen getrennt, ein Array, separate Funktionen oder Befehlszeilenargumente usw. - Sie haben die Wahl.
  • In ähnlicher Weise sind bei der Ausgabe an STDOUT das umgebende Leerzeichen, nachfolgende Zeilenumbrüche usw. optional.
  • Eingabeanalyse und Ausgabeformatierung sind nicht die interessanten Merkmale dieser Herausforderung.
  • Im Interesse einer vernünftigen Komplexität und ganzzahliger Überläufe unterliegt die Herausforderungsnummer n Einschränkungen, sodass 1 < n < 100000Sie sich keine Gedanken über mögliche Antworten außerhalb dieses Bereichs machen müssen.

verbunden

AdmBorkBork
quelle
Wenn also die kleinste Lösung größer als 100.000 ist, kann ich entweder eine Lösung oder Null zurückgeben?
Dennis
@ Tennis Wenn es Ihren Code kürzer macht, sicher. Beides wäre akzeptabel.
AdmBorkBork

Antworten:

3

Gelee , 17 16 Bytes

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

Dies ist eine Brute-Force-Lösung, die alle möglichen Werte bis zu 100.000 ausprobiert. Probieren Sie es online aus!

Nicht konkurrierende Version

Die neueste Version von Jelly verfügt über eine Fehlerbehebung, mit der der obige Code auf 15 Byte reduziert werden kann .

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

Probieren Sie es online aus!

Wie es funktioniert

×€ȷ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
quelle
Herzlichen Glückwunsch, Sie gewinnen standardmäßig! : D
AdmBorkBork