Продукт делителей

21

Вызов

Если задано положительное целое число, верните произведение его делителей, включая себя.

Это последовательность A007955 в OEIS .

Тестовые случаи

1: 1
2: 2
3: 3
4: 8
5: 5
6: 36
7: 7
8: 64
9: 27
10: 100
12: 1728
14: 196
24: 331776
25: 125
28: 21952
30: 810000

счет

Это , поэтому выигрывает самый короткий ответ на каждом языке!

musicman523
источник
2
Интересное примечание (хотя, вероятно, не очень полезное для этой задачи): произведение всех делителей n всегда равно n ^ ((число делителей n) / 2).
Wojowu

Ответы:

13

05AB1E , 2 байта

ÑP

Попробуйте онлайн!

объяснение

Ñ    # divisors
 P   # product
Emigna
источник
На первый взгляд, я бы сказал, что это решение относится к P, но что-то меня удерживает ..
Уриэль
7

Japt , 3 байта

â ×

Попробуйте онлайн!

объяснение

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Джастин Маринер
источник
Черт возьми, как ты меня ниндзя ?! : p Удалит мой, когда я доберусь до компьютера (когда бы это ни было).
Лохматый
@ Шэгги Я удивлен, так как я только что узнал об обоих âи ×при написании этого ответа
Джастин Маринер,
Я был замедлен мин. ограничение персонажа!
Лохматый
5

Python 3 , 42 41 байт

Сохранено 1 байт благодаря Leaky Nun!

f=lambda i,k=1:k>i or k**(i%k<1)*f(i,k+1)

Попробуйте онлайн!

musicman523
источник
1
(1,k)[i%k<1]эквивалентноk**(i%k<1)
Leaky Nun
Вау, это круто, спасибо!
musicman523
3

Алиса , 12 байт

/o
\i@/Bdt&*

Попробуйте онлайн!

объяснение

Это просто обычная структура для десятичного ввода-вывода:

/o
\i@/...

Тогда программа выглядит так:

B    Get all divisors of the input.
dt   Get the stack depth minus 1.
&*   Multiply the top two stack elements that many times, folding multiplication
     over the stack.
Мартин Эндер
источник
3

Нейм , 2 байта

𝐅𝐩

Попробуйте онлайн!

Okx
источник
3
Я прокручиваю ответы: простой моноширинный код, простой моноширинный код, простой ... жирный, код с засечками? :-P
ETHпродукция
@ETHproductions Хе-хе.
Okx
4
@ETHproductions На самом деле я написал этот ответ на iOS, что означает, что я не могу видеть символы.
Okx
Это ... довольно впечатляюще.
ETHproductions
2
@MamaFunRoll Теперь это имя, которое я не слышал долгое время ... ;-)
ETHproductions
2

Машинный код x86-64, 26 байт

31 C9 8D 71 01 89 F8 FF C1 99 F7 F9 85 D2 75 03 0F AF F1 39 F9 7C EE 89 F0 C3

Приведенный выше код определяет функцию, которая принимает один параметр (входное значение, положительное целое число) EDI(в соответствии с соглашением о вызовах System64 AMD64, используемым в Gnu / Unix) и возвращает один результат (произведение делителей) в EAX.

Внутренне он вычисляет произведение делителей, используя (крайне неэффективный) итерационный алгоритм, аналогичный представлению C в pizzapants184 . В основном, он использует счетчик для циклического перебора всех значений между 1 и входным значением, проверяя, является ли текущее значение счетчика делителем входного значения. Если это так, он умножает это на текущий итоговый продукт.

Неуправляемый язык ассемблера

; Parameter is passed in EDI (a positive integer)
ComputeProductOfDivisors:
   xor   ecx, ecx        ; ECX <= 0  (our counter)
   lea   esi, [rcx + 1]  ; ESI <= 1  (our running total)
.CheckCounter:
   mov   eax, edi        ; put input value (parameter) in EAX
   inc   ecx             ; increment counter
   cdq                   ; sign-extend EAX to EDX:EAX
   idiv  ecx             ; divide EDX:EAX by ECX
   test  edx, edx        ; check the remainder to see if divided evenly
   jnz   .SkipThisOne    ; if remainder!=0, skip the next instruction
   imul  esi, ecx        ; if remainder==0, multiply running total by counter
.SkipThisOne:
   cmp   ecx, edi        ; are we done yet? compare counter to input value
   jl    .CheckCounter   ; if counter hasn't yet reached input value, keep looping

   mov   eax, esi        ; put our running total in EAX so it gets returned
   ret

Тот факт, что IDIVинструкция использует жестко запрограммированные операнды для дивидендов, немного ограничивает мой стиль, но я думаю, что это довольно хорошо для языка, который не имеет встроенных модулей, но имеет базовые арифметические и условные ветви!

Коди Грей
источник
2

TI-Basic (TI-84 Plus CE), 24 байта

Prompt X
1
For(A,1,X
If not(remainder(X,A
AAns
End

Полная программа: запрашивает ввод у пользователя; возвращает выходные данные Ans, специальная переменная, которая (в основном) хранит значение последнего вычисленного значения.

Объяснение:

Prompt X             # 3 bytes, Prompt user for input, store in X
1                    # 2 bytes, store 1 in Ans for use later
For(A,1,X            # 7 bytes, for each value of A from 1 to X
If not(remainder(X,A # 8 bytes, If X is divisible by A...
AAns                 # 3 bytes, ...store (A * Ans) in Ans
End                  # 1 byte, end For( loop
pizzapants184
источник
2
Вы на самом деле не включили байтовый счет.
Эрик Outgolfer
@EriktheOutgolfer Ой! Исправлена.
pizzapants184
2

C (gcc), 52 48 байтов

p,a;f(x){for(p=1,a=x;a;a--)p*=x%a?1:a;return p;}

-4 байта благодаря Коди Грей

Функция, которая принимает целое число и возвращает произведение его делителей.

Попробуйте онлайн!

Ungolfed:

int proddiv(int input) {
    int total = 1, loopvar;
    for(loopvar = input; loopvar > 0; --loopvar) {
    // for loopvar from input down to 1...
        total *= (input % loopvar) ? 1 : loopvar;
        // ...If the loopvar is a divisor of the input, multiply the total by loopvar;
    }
    return total;
}
pizzapants184
источник
Вы можете сохранить 4 байта, (1) считая в обратном порядке, (2) удаляя круглые скобки вокруг p*=выражения и (3) помещая оператор в тело forцикла, чтобы пропустить запятую. Мне также нравится использовать глобальные переменные, а не добавлять дополнительные параметры. Это позволяет избежать неопределенного поведения без затрат на байты. Окончательная версия:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Коди Грей,
Вы можете заменить return p;с p=p;и сохранить пять байтов.
Джонатан Фрех
Чтобы сохранить еще один байт, вы можете заменить p,a;f(x)на f(x,p,a).
Джонатан Фрех
Если вы используете локальные вместо глобальных переменных, вы можете даже избавиться от целых return p;и сохранить не пять, а девять байтов. ( TIO )
Джонатан Фрех
2

JavaScript (ES7), 32 байта

n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1

Сэкономили пару байтов, позаимствовав совет Лики о решении Python для музыканта .


Попытайся

o.innerText=(f=
n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1
)(i.value=1)();oninput=_=>o.innerText=f(+i.value)()
<input id=i type=number><pre id=o>


Альтернатива (ES6), 32 байта

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
мохнатый
источник
1
Почему не только ES6-совместимый (n%i?1:i)? (Однако это не спасло бы ни одного байта.)
Арно
@Arnauld: потому что половина 6 явно слишком рано утром для телефонного гольфа! : D У меня была троичная перевернутая, когда я заметил наконечник Лики!
Лохматый
2

TI-Basic, 24 14 13 байтов

Сохранено 1 байт благодаря lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
Oki
источник
1
Вам нужен int(?
lirtosiast
1

QBIC , 22 байта

[:|~b/a=b'\`a|q=q*a}?q

объяснение

[:|           FOR a  = 1; a <= input (b); a++
 b/a=b'\`a    'a' is a proper divisor if integer division == float division
~         |   IF that's true
q=q*a         THEN multiply running total q (starts as 1) by that divsor
}             NEXT
?q            Print q
steenbergh
источник
1

Mathematica, 17 байт

для тех, кто не может просмотреть удаленные ответы (ответ DavidC), это код в Mathematica с помощью @MartinEnder

1##&@@Divisors@#&
J42161217
источник
1

Язык программирования Шекспира , 353 байта

.
Ajax,.
Puck,.
Page,.
Act I:.
Scene I:.
[Enter Ajax and Puck]
Ajax:
You cat
Puck:
Listen to thy heart
[Exit Ajax]
[Enter Page]
Scene II:.
Puck:
You sum you cat
Page:
Is Ajax nicer I?If so, is remainder of the quotient Ajax I nicer zero?If not, you product you I.Is Ajax nicer I?If so, let us return to scene II
Scene III:.
Page:
Open thy heart
[Exeunt]

Безголовая версия:

The Tragedy of the Product of a Moor's Factors in Venice.

Othello, a numerical man.
Desdemona, a product of his imagination.
Brabantio, a senator, possibly in charge of one Othello's factories.

Act I: In which tragedy occurs.

Scene I: Wherein Othello and Desdemona have an enlightened discussion.

[Enter Othello and Desdemona]

Othello:
  Thou art an angel!

Desdemona:
  Listen to thy heart.

[Exit Othello]
[Enter Brabantio]

Scene II: Wherein Brabantio expresses his internal monologue to Desdemona.

Desdemona:
  Thou art the sum of thyself and the wind!

Brabantio:
  Is Othello jollier than me?
  If so, is the remainder of the quotient of Othello and I better than nothing?
  If not, thou art the product of thyself and me.
  IS Othello jollier than me?
  If so, let us return to scene II!

Scene III: An Epilogue.

Brabantio:
  Open thy heart!

[Exeunt]

Я использую этот компилятор SPL для запуска программы.

Бежать с:

$ python splc.py product-of-divisors.spl > product-of-divisors.c
$ gcc product-of-divisors.c -o pod.exe
$ echo 30 | ./pod
810000
медь
источник
1

Python 3, 45 байт

lambda _:_**(sum(_%-~i<1for i in range(_))/2)

Позвольте xбыть числом. Оба yи zбудут делителями xесли y * z = x. Поэтому y = x / z. Давайте предположим, что число dимеет 6 divisiors, из - за этого наблюдения делители будет a, b, c, d / a, d / b, d / b. Если мы умножим все эти числа (точка загадки), мы получим d * d * d = d ^ 3. В общем случае для eцелого ряда fделителей произведение этих делителей будет e ^ (f / 2), чем и занимается лямбда.

Попробуйте онлайн!

Марио Исхак
источник
1

МОЙ , 4 байта

Hex:

1A 3A 54 27

Объяснение:

1A - Input as an integer
3A - Factors
54 - Product
27 - Output (with newline)
Zachary
источник
0

Фортран 95, 88 байт

function l(k)
n=0
l=1
do while(n<k)
n=n+1
if(MODULO(k,n)==0)then
l=l*n
end if
end do
end

Попробуйте онлайн!

Ungolfed:

integer function l(k)
    implicit none
    integer :: n, k

    n=0
    l=1
    do while (n<k)
        n=n+1
        if (MODULO(k,n) == 0) then
            l=l*n
        end if
    end do

end function l
Steadybox
источник
0

Аксиома, 23 байта

h(x)==x^(#divisors x/2)

Это перевод в аксиоме решения алефальфа

RosLuP
источник