Рассчитать число, делитель издание

11

Вдохновленный этим вопросом по математике.

Пусть простые множители числа, п , можно представить в виде Р (п) = 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
  • х и z простые - P(x)=x, D(x)=2и P(z)=z,D(z)=2
  • w - число делителей xn -D(xn)=w
  • у - число делителей zn -D(zn)=y

Для проблемы, приведенной в связанном вопросе, может быть входной пример (28, 2, 30, 3). Это переводится как D(2n)=28и D(3n)=30, с n=864.

Выход:

Одно целое число n , удовлетворяющее приведенным выше определениям и входным ограничениям. Если несколько чисел соответствуют определениям, выведите наименьшее. Если такое целое число невозможно, выведите значение Falsey .

Примеры:

(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есть вам не нужно беспокоиться о возможных ответах за пределами этого диапазона.

связанные с

AdmBorkBork
источник
Итак, если наименьшее решение больше 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