Oblicz liczbę, edycja dzielników

11

Zainspirowany tym pytaniem dotyczącym matematyki.

Pozwól na czynniki pierwsze liczbę, n , są reprezentowane P (n) = 2 x 3 b X5 c X ... .
(Przy użyciu X jako symbol mnożenia).
Następnie ilość dzielników n może być przedstawiony jako D (n) = (a + 1) x (b + 1) x (C + 1) ... .
Możemy zatem łatwo powiedzieć, że liczba dzielników 2n wynosi D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
liczba dzielników 3n to D (3n ) = (a + 1) x (b + 2) x (C + 1), ... ,
i tak dalej.

Wyzwanie:

Napisz program lub funkcję, która używa tych właściwości do obliczania n , biorąc pod uwagę pewne dane wejściowe dzielnika.

Wejście:

Zestaw liczb całkowitych, nazwijmy je w, x, y, z , ze wszystkimi następującymi definicjami:

  • wszystkie dane wejściowe są większe niż 1 - w, x, y, z > 1
  • x i z różnią -x<>z
  • x i z są podstawowym - P(x)=x, D(x)=2i P(z)=z,D(z)=2
  • w jest liczbą dzielników xn -D(xn)=w
  • y jest liczbą dzielników zn -D(zn)=y

Przykładem może być problem podany w połączonym pytaniu (28, 2, 30, 3). To przekłada się na D(2n)=28i D(3n)=30, z n=864.

Wynik:

Pojedyncza liczba całkowita n , która spełnia powyższe definicje i ograniczenia wejściowe. Jeśli wiele liczb pasuje do definicji, wypisz najmniejszą. Jeśli taka liczba całkowita nie jest możliwa, wypisz wartość falsey .

Przykłady:

(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

Zasady:

  • Obowiązują standardowe zasady gry w golfa i ograniczenia luk .
  • Obowiązują standardowe zasady wejścia / wyjścia .
  • Numery wejściowe mogą być w dowolnej kolejności - w odpowiedzi określ, której kolejności używasz.
  • Liczby wejściowe mogą być w dowolnym odpowiednim formacie: rozdzielone spacjami, tablicą, oddzielnymi argumentami funkcji lub wiersza poleceń itp. - do wyboru.
  • Podobnie, jeśli dane wyjściowe do STDOUT, otaczające białe znaki, końcowe znaki nowej linii itp. Są opcjonalne.
  • Analiza wejściowa i formatowanie wyjściowe nie są interesującymi cechami tego wyzwania.
  • W trosce o rozsądną złożoność i przepełnienie liczb całkowitych liczba wyzwań n będzie miała takie ograniczenia, że 1 < n < 100000- tzn. Nie będziesz musiał się martwić o możliwe odpowiedzi poza tym zakresem.

Związane z

AdmBorkBork
źródło
Więc jeśli najmniejsze rozwiązanie jest większe niż 100 000, mogę zwrócić rozwiązanie albo zero?
Dennis
@Dennis Jeśli to skróci Twój kod, na pewno. Każdy byłby do przyjęcia.
AdmBorkBork

Odpowiedzi:

3

Galaretka , 17 16 bajtów

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

Jest to rozwiązanie brutalnej siły, które wypróbowuje wszystkie możliwe wartości do 100 000. Wypróbuj online!

Wersja niekonkurująca

Najnowsza wersja Jelly ma poprawkę błędu, która pozwala na obniżenie powyższego kodu do 15 bajtów .

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

Wypróbuj online!

Jak to działa

×€ȷ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
źródło
Gratulacje, domyślnie wygrywasz! : D
AdmBorkBork