Обчисліть кількість, розділення видання


11

Натхненний цим питанням над Math.

Нехай прості множники числа, п , можна уявити в вигляді Р (п) = 2 х 3 б х 5 гр х ... .
(Використовуючи й в якості символу множення.)
Тоді число дільників п можна представити в вигляді D (п) = (а + 1) х (Ь + 1) х (С + 1) ... .
Таким чином, можна легко сказати, що число дільників 2n дорівнює D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
число дільників 3n дорівнює D (3n ) = (а + 1) х (Ь + 2) х (з + 1) ... ,
і так далі.

Виклик:

Напишіть програму або функцію, яка використовує ці властивості для обчислення n з урахуванням певних входів дільника.

Вхід:

Набір цілих чисел, назвемо їх w, x, y, z зі всіма наступними визначеннями:

  • всі входи більше 1 - w, x, y, z > 1
  • x і z є різними -x<>z
  • x і z є простими - P(x)=x, D(x)=2і P(z)=z,D(z)=2
  • w - кількість дільників xn -D(xn)=w
  • y кількість дільників zn -D(zn)=y

Для проблеми, наведеної у пов'язаному питанні, прикладом може бути вхід (28, 2, 30, 3). Це означає D(2n)=28і D(3n)=30, з n=864.

Вихід:

Єдине ціле число, n , яке задовольняє наведеним вище визначенням та обмеженням введення. Якщо декілька чисел відповідають визначенням, виведіть найменше. Якщо таке ціле число неможливо, виведіть значення фальси .

Приклади:

(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

Правила:

  • Застосовуються стандартні правила коду-гольфу та обмеження лазівки .
  • Застосовуються стандартні правила введення / виводу .
  • Номери введення можуть бути в будь-якому порядку - будь ласка, вкажіть у своїй відповіді, яке замовлення ви використовуєте.
  • Номери введення можуть бути у будь-якому відповідному форматі: розділений пробілом, масив, окрема функція або аргументи командного рядка тощо - на ваш вибір.
  • Аналогічно, якщо вихід на STDOUT, навколишній пробіл, трейлінг нового рядка тощо, необов’язковий.
  • Синтаксичний аналіз та форматування вихідних даних не є цікавими особливостями цього завдання.
  • В інтересах розумної складності та цілих переливів номер виклику n матиме такі обмеження, що, 1 < n < 100000тобто, вам не потрібно турбуватися про можливі відповіді поза цим діапазоном.

Пов'язані


Отже, якщо найменше рішення більше 100 000, я можу вибрати повернути або рішення, або нуль?
Денніс

@Dennis Якщо ваш код коротший, обов'язково. Будь-яке було б прийнятним.
AdmBorkBork

Відповіді:


3

Желе , 17 16 байт

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

Це жорстоке рішення, яке пробує всі можливі значення до 100 000. Спробуйте в Інтернеті!

Неконкурентна версія

В останній версії Jelly виправлено помилку, яка дозволяє переграти вищезгаданий код до 15 байт .

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

Спробуйте в Інтернеті!

Як це працює

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

З повагою, ви перемагаєте за замовчуванням! : D
AdmBorkBork
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.