Продукт розділювачів


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

Оцінка балів

Це , тому найкоротша відповідь на кожній мові виграє!


2
Цікава примітка (хоча, мабуть, не така корисна для цього виклику): добуток усіх дільників n завжди n ^ ((кількість дільників n) / 2).
Wojowu

Відповіді:



7

Japt , 3 байти

â ×

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

Пояснення

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array

Чорт, як ти мене ніндзя ?! : p Видалять мою, коли я потрапляю до комп'ютера (коли б це не було).
Shaggy

@Shaggy Я здивований, тому що я тільки що дізнався про обох âі ×при написанні цієї відповіді
Джастін Mariner

Мене сповільнили хвилини. обмеження символів!
Shaggy






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

3
Мені прокручуються відповіді: звичайний односхилий код, звичайний односхилий код, звичайний ... жирний, серіф-код? :-P
ETHproductions

@ETHproductions Hehe.
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 (дотримуючись конвенції виклику System V 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

2
Ви фактично не включали рахунок.
Ерік Аутгольфер

@EriktheOutgolfer Whoops! Виправлено.
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 байти завдяки Коді Грей

Функція, яка приймає ціле число і повертає добуток її дільників.

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

Безголівки:

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;
}

Ви можете зберегти 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

Зберегли пару байтів, запозичивши підказку Leaky на рішенні музиканта 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 явно занадто рано вранці для телефонного гольфу! : У DI було перевернуто потрійне, коли я помітив наконечник Лекі!
Shaggy

2

TI-Basic, 24 14 13 байт

Збережено 1 байт завдяки lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans

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



1

Математика, 17 байт

для тих, хто не може переглянути видалені відповіді (відповідь DavidC), це код у Mathematica за допомогою @MartinEnder

1##&@@Divisors@#&

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)







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

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

Безголівки:

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

0

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

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

Це переклад в аксіомі розчину алефальфи

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