Bölenlerin Ürünü


21

Meydan okuma

Olumlu bir tamsayı verildiğinde, kendisi de dahil olmak üzere bölenlerin ürününü iade edin.

Bu, OEIS'deki A007955 dizisidir .

Test Kılıfları

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

puanlama

Bu , yani her dilde en kısa cevap kazanıyor!


2
İlginç not (muhtemelen bu meydan okuma için faydalı olmasa da): n'nin tüm bölenlerinin ürünü her zaman n ^ 'dir ((n'in bölenlerinin sayısı) / 2).
Wojowu

Yanıtlar:



7

Japt , 3 bayt

â ×

Çevrimiçi deneyin!

açıklama

â ×  // implicit integer input

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

Kahretsin, beni nasıl ninja yaptın ?! : p Bir bilgisayara geldiğimde mayını silecek (ne zaman olabilir).
Shaggy,

Sadece ikisi hakkında öğrendiğinden beri @Shaggy Ben şaşırdım âve ×bu cevabı yazarken
Justin Mariner

Min tarafından yavaşlatıldım. karakter sınırı!
Shaggy






3

Alice , 12 bayt

/o
\i@/Bdt&*

Çevrimiçi deneyin!

açıklama

Bu yalnızca ondalık giriş / çıkış için düzenli bir çerçevedir:

/o
\i@/...

O zaman program:

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

Neim , 2 bayt

𝐅𝐩

Çevrimiçi deneyin!


3
Bana cevapları kaydırma: düz monospaced kodu, düz monospaced kodu, düz ... kalın, serif kodu? :-P
ETHproductions

@ETHproductions Hehe.
Okx,

4
@ETHproductions Aslında bu cevabı iOS'ta kodladım, bu da karakterleri gerçekten göremediğim anlamına geliyor.
Okx,

Bu ... oldukça etkileyici.
ETHproductions

2
@MamaFunRoll Şimdi bu uzun, çok uzun zamandır duymadığım bir isim ... ;-)
ETHproductions 09:17 'de


2

x86-64 Makine Kodu, 26 bayt

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

Yukarıdaki kod EDI, System V AMD64 çağrı kuralını izleyerek tek bir parametre (giriş değeri, pozitif bir tamsayı) alan bir işlevi tanımlar. Gnu / Unix'te kullanılan ve içinde tek bir sonuç (bölenlerin ürünü)EAX .

Dahili olarak, pizzapants184'ün C sunumuna benzer şekilde (son derece verimsiz) bir yinelemeli algoritma kullanarak bölenlerin ürününü hesaplar . Temel olarak, tüm döngü boyunca bir sayaç kullanır 1 ile giriş değeri arasındaki değerler arasında ve mevcut sayaç değerinin girişin bölen olup olmadığını kontrol eder. Eğer öyleyse, bunu çalışan toplam ürünle çarpar.

Ungolfed assembly dili anımsatıcıları:

; 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

Aslında IDIVtalimat temettü için kodlanmış işlenen kullanır tarzımı biraz kramp, ama bu bir hayır yerleşik ins edilen dile ama temel aritmetik ve koşullu dallar için oldukça iyi olduğunu düşünüyorum!


2

TI-Basic (TI-84 Plus CE), 24 bayt

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

Tam program: kullanıcıdan giriş yapmasını ister; çıkışı verir Ans, bir özel değişken (temelde) hesaplanan son değerin değerini saklar söyledi.

Açıklama:

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
Aslında bayt sayısını eklemediniz.
Outgolfer Erik

@EriktheOutgolfer Hata! Sabit.
pizzapants184

2

C (gcc), 52 48 bayt

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

Cody Gray sayesinde -4 bayt

Bir tamsayı alan ve bölenlerinin ürününü döndüren bir işlev.

Çevrimiçi deneyin!

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

(1) geriye doğru sayarak, (2) p*=ifadenin etrafındaki parantezleri kaldırarak ve (3) forvirgül bırakmak için döngünün gövdesine bir ifade koyarak 4 bayttan tasarruf edebilirsiniz . Ayrıca ekstra değişkenler eklemek yerine global değişkenleri kullanmayı seviyorum. Bu, baytlara mal olmadan tanımsız davranışlardan kaçınır. Son versiyon:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray,

Beş bayt return p;ile değiştirebilir p=p;ve kaydedebilirsiniz.
Jonathan Frech

Başka bir bayttan tasarruf etmek için, p,a;f(x)ile değiştirebilirsiniz f(x,p,a).
Jonathan Frech

Global değişkenler yerine yerel kullanırsanız, tümden kurtulabilir return p;ve beşten değil, dokuz bayttan tasarruf edebilirsiniz. ( TIO )
Jonathan Frech

2

JavaScript (ES7), 32 bayt

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

Müziğin Python çözümü hakkında Leaky'nin ipucunu ödünç alarak birkaç bayt kurtardı .


Dene

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>


Alternatif (ES6), 32 bayt

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

1
Neden sadece ES6 uyumlu değil (n%i?1:i)? (Bu olsa da, herhangi bir bayt kurtarmaz.)
Arnauld,

@Arnauld: çünkü yarısı 6 telefon sabahları için sabahları çok erken! : DI, Leaky'nin ipucunu tespit ettiğimde üçlünün tersine döndü!
Shaggy,

2

TI-Basic, 24 14 13 bayt

Lirtosiast sayesinde 1 bayt kaydedildi

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

1
İhtiyacın var int(mı?
lirtosiast

1

QBIC , 22 bayt

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

açıklama

[:|           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

Mathematica, 17 bayt

silinmiş cevapları göremeyenler için (DavidC'in cevabı), bu @MartinEnder yardımı ile Mathematica'daki koddur.

1##&@@Divisors@#&

1

Shakespeare Programlama Dili , 353 bayt

.
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]

Ungolfed versiyonu:

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]

Bu SPL derleyicisini kullanıyorumProgramı çalıştırmak için .

Çalıştır:

$ 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 bayt

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

xBir sayı olalım . Her ikisi de yve eğer zbölenler xolacaktır y * z = x. Bu nedenle y = x / z,. Diyelim bir sayı söylemek dnedeniyle bölenler olacak bu gözlem için, 6 divisiors vardır a, b, c, d / a, d / b, d / b. Eğer tüm bu sayıları çarparsak (bulmacanın noktası), elde ederiz d * d * d = d ^ 3. Genel olarak, ebir dizi fbölen için, söz konusu bölenlerin ürünüe ^ (f / 2) , ki bu .

Çevrimiçi deneyin!


1

BEN , 4 bayt

hex:

1A 3A 54 27

Açıklama:

1A - Input as an integer
3A - Factors
54 - Product
27 - Output (with newline)







0

Fortran 95, 88 bayt

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

Çevrimiçi deneyin!

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

0

Aksiyom, 23 bayt

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

Bu, alephalpha çözümü aksiyomunun bir çevirisidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.