Uygun Divisor birleşimi


20

Bir uygun bölen a, bölen bir numarası n değildir, n, kendisi. Örneğin, 12'nin uygun bölenleri 1, 2, 3, 4 ve 6'dır.

Size x , x ≥ 2, x ≤ 1000 tamsayısı verilecektir . Senin görevin tüm toplanmasından ibarettir en yüksek uygun bölenler arasındaki tam sayıların 2'ye göre x (dahili) (OEIS A280050 ).

Örnek (ile x = 6):

  • 2 ile 6 (dahil) arasındaki tüm tam sayıları bulun: 2,3,4,5,6.

  • Hepsinden doğru bölenleri alın ve her sayıdan en yüksek olanları seçin:

    • 2 -> 1
    • 3 -> 1
    • 4 -> 1, 2
    • 5 -> 1
    • 6 -> 1, 2, 3 .
  • En yüksek uygun bölenler Sum: 1 + 1 + 2 + 1 + 3 = 8.

  • Nihai sonuç 8'dir.

Test Durumları

Girdi | Çıktı
------- + ---------
       |
 2 | 1
 4 | 4
 6 | 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1000 | 165279

kurallar



5
Bir şeyi sanallaştırılacaksanız, iki saatten fazla orada bırakın.
Peter Taylor

@PeterTaylor Gönderiyi yalnızca geri bildirim almak için sandbox olarak kullandım, çünkü bu genellikle sanal alanda hiç göndermeyeceğim çok basit bir meydan okuma. BTW düzenleme için teşekkürler.
Bay Xcoder

Yanıtlar:


13

Oasis , 4 bayt

Kod:

nj+U

Çevrimiçi deneyin!

Açıklama:

Genişletilmiş versiyon:

nj+00

    0   = a(0)
   0    = a(1)

a(n) =

n       # Push n
 j      # Get the largest divisor under n
  +     # Add to a(n - 1)

5

Kabuk , 7 bayt

ṁȯΠtptḣ

Çevrimiçi deneyin!

açıklama

Husk'un bölenleri doğrudan hesaplamak için yerleşik (henüz) yoktur, bu yüzden bunun yerine asal çarpanlara ayırma kullanıyorum. Bir sayının en büyük uygun böleni, en küçük olanı dışındaki asal faktörlerinin ürünüdür. Bu işlevi 2 ile giriş arasında eşler ve sonuçları toplarım.

ṁȯΠtptḣ  Define a function:
      ḣ  Range from 1 to input.
     t   Remove the first element (range from 2).
ṁ        Map over the list and take sum:
 ȯ        The composition of
    p     prime factorization,
   t      tail (remove smallest prime) and
  Π       product.

5

Python 2 , 50 bayt

f=lambda n,k=2:n/k and(f(n,k+1),n/k+f(n-1))[n%k<1]

Bu yavaştır ve TIO'daki giriş 15 ile bile baş edemez .

Çevrimiçi deneyin!

Ancak, tüm test senaryolarını doğrulamak için not ( teşekkürler @ musicman523 ) kullanılabilir.

Çevrimiçi deneyin!

Alternatif sürüm, 52 bayt

2 bayt maliyetle, hesaplamayı f(n,k+1)veya hesaplamayı seçebiliriz n/k+f(n-1).

f=lambda n,k=2:n>1and(n%k and f(n,k+1)or n/k+f(n-1))

Bazı hilelerle, bu TIO'da bile tüm test vakaları için çalışır.

Çevrimiçi deneyin!


Yana fbir olan saf fonksiyon , sen daha büyük davaları yayınlanacak şekilde memoize edebilirsiniz TIO
musicman523

Doğru, bir dekoratör kullanamam beni attı. Teşekkürler!
Dennis

4

Jöle , 6 bayt

ÆḌ€Ṫ€S

Çevrimiçi deneyin!

Nasıl çalışır

ÆḌ€Ṫ€S
ÆḌ€    map proper divisor (1 would become empty array)
           implicitly turns argument into 1-indexed range
   Ṫ€  map last element
     S sum


4

JavaScript (ES6), 40 bayt

f=(n,i=2)=>n<2?0:n%i?f(n,i+1):n/i+f(n-1)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Bir sayı, en uygun bölücüsünün ürününe ve en küçük asal faktörüne eşittir.


n>352en azından kadar desteklemeniz gerekiyorsa yığın taşmaları (en azından bu snippet'te tarayıcı / makine bağımlılığım olup olmadığını bilmiyorum) n=1000.
officialaimm

@officialaimm n=1000Örn node --stack_size=8000.
Neil

4

05AB1E , 9 8 bayt

-1 Byte , Pyky cevabındaki Leaky Nun'in ana faktör hilesi

L¦vyÒ¦PO

Çevrimiçi deneyin!

açıklama

L¦vyÒ¦PO
L¦       # Range [2 .. input]
  vy     # For each...
    Ò¦    # All prime factors except the first one
      P   # Product
       O  # Sum with previous results
         # Implicit print

Alternatif 8 Bayt çözümü (TIO üzerinde çalışmaz)

L¦vyѨθO    

ve ofc alternatif 9 Bayt çözümü (TIO üzerinde çalışır)

L¦vyѨ®èO    

4

Retina , 31 24 bayt

Martin Ender sayesinde 7 bayt.

.+
$*
M!&`(1+)(?=\1+$)
1

Çevrimiçi deneyin!

Nasıl çalışır

Regex /^(1+)\1+$/yakalar belirli sayıda büyük düzgün bölen tekli temsil. Kodunda, \1+bir ileri yönlü sözdizimi açıktır.




4

Python 2 (PyPy) , 73 71 70 bayt

n=input();r=[0]*n;d=1
while n:n-=1;r[d+d::d]=n/d*[d];d+=1
print sum(r)

En kısa Python cevabı değil, ama bu sadece test senaryoları boyunca esiyor. TIO, ter dökmeden 30.000.000'e kadar girişi işler ; masaüstü bilgisayarım dakikada 300.000.000 işlem yapıyor .

2 baytlık bir maliyetle , bu durum n>d~% 10 hızlanma için kullanılabilir.

r=[0]*n3 bayt tasarruf eden fikir için @xnor'a teşekkürler !

Çevrimiçi deneyin!


Komik, sadece aynı kodu yazdım .
xnor

l=[0]*nkurtulmanıza izin vermeli -2. execbiraz hız öldürür, ama bir whiledöngü bile benim yaklaşımımdan daha kısa olurdu.
Dennis

Bu benim yaklaşımımdan çok daha hızlı görünüyor. Cevabımı düzenler miyim?
Dennis

Lütfen, devam et.
xnor

1
@ Mr.Xcoder PyPy'de değil, ama evet, elekler bu tür bir problem için iyi.
Dennis

4

Haskell, 48 46 43 bayt

f 2=1
f n=until((<1).mod n)pred(n-1)+f(n-1)

Çevrimiçi deneyin!

Düzenleme: @rogaos iki bayt kaydetti. Teşekkürler!

Düzenleme II: ... ve @xnor başka 3 bayt.


-2 bayt:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos: Teşekkürler! Açık özyinelemeyi kendim denedim, ancak kaldırmadım sum, bu yüzden daha kısa olmadığını düşündüm.
nimi

1
untilbiraz daha kaydeder:until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japon , 8 + 2 = 10 8 6 bayt

òâ1 xo

Dene

  • ETHproductions sayesinde 1 bayt tasarruf edildi.

açıklama

    :Implicit input of integer U.
ò   :Generate an array of integers from 1 to U, inclusive
â   :Get the divisors of each number,
1   :  excluding itself.
x   :Sum the main array
o   :by popping the last element from each sub-array.
    :Implicit output of result

Bu-x gönderiye göre iki bayt olarak sayıldığını unutmayın . Ancak, bir bayt kaydedebileceğini düşünüyorum ( bir argüman verildiğinde orijinal sayıyı hariç tutar)ò2_â1 oâ
ETHproductions

Teşekkürler, @ETHproductions; Her ikisini de özlemiştim. Acaba bu bayrakları 1 bayt olarak saydığımız tüm çözümlere geriye dönük olarak uygulanıyor mu? Zaten bir bayrak kullanmayan alternatif bir çözüm üzerinde çalışıyordum; âbu argümanı işaret etmek beni aradığım tasarrufu sağladı.
Shaggy

Daha önce gerçekten bir fikir birliği izlemediğimiz için bunu kabul ederdim. BTW, beraber oynama olmuştu õ Åönce ve birkaç 8 ve 9-byters bulundu: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. Ve birleştirerek õve ÅDahi ile xohile Ben 7 baytlık çözüm :-) bulundu
ETHproductions

3

MATL, 12 bayt

q:Q"@Z\l_)vs

MATL Online'da deneyin

açıklama

        % Implicitly grab input (N)
q       % Subtract one
:       % Create an array [1...(N-1)]
Q       % Add one to create [2...N]
"       % For each element
  @Z\   % Compute the divisors of this element (including itself)
  l_)   % Grab the next to last element (the largest that isn't itself)
  v     % Vertically concatenate the entire stack so far
  s     % Sum the result



3

Cubix , 27 39 bayt

?%\(W!:.U0IU(;u;p+qu.@Op\;;

Çevrimiçi deneyin!

Cubified

      ? % \
      ( W !
      : . U
0 I U ( ; u ; p + q u .
@ O p \ ; ; . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

İzle

  • 0IUBir akü ve başlangıç ​​tamsayı ile yığını ayarlayın. Dış döngüye U dönüşü
  • :(? yığının mevcut üst kısmını çoğalt, azalt ve test et
  • \pO@ küpün etrafında sıfır döngü bir aynaya, yığın, çıktı ve durdurma altını tut
  • %\! eğer pozitif, mod, relect ve test.
    • u;.W doğruysa, u-dönüşü, mod sonucunu kaldır ve şerit tekrar iç döngüye dönüşür
    • U;p+qu;;\(eğer falsey, u-dönüşü, mod sonucunu kaldır, akümülatörü üste getir, mevcut tamsayı (üst) bölen itmeyi aşağıya ve u-dönüşüne ekle. Sadece akümülatör ve akım tamsayısı elde etmek için yığını temizleyin, tamsayıyı azaltın ve dış döngüye tekrar girin.



2

Python 3 , 78 75 73 71 bayt

Bayt sayısında Leaky rahibesinin python cevabına bile yakın değil.

f=lambda z:sum(max(i for i in range(1,y)if 1>y%i)for y in range(2,z+1))

Çevrimiçi deneyin!


1
Cevabımın ilk revizyonuna yaklaşıyorsunuz ... düzenleme geçmişimi kontrol edebilirsiniz.
Sızdıran Rahibe

Oh, haha ​​... Yemin ederim çalmadım ... :)
officialaimm

2

Python 3 , 69 63 59 bayt

Dennis sayesinde 4 bayt.

f=lambda n:n-1and max(j for j in range(1,n)if n%j<1)+f(n-1)

Çevrimiçi deneyin!

Bunun 1000 için çalışması için özyineleme sınırını 2000 olarak ayarladım.


+1 Brownie puanlarım var! "70 bayttan kısa" derken bahsettiğim çözüm bu ...
Bay Xcoder

Ayrıca, bu Python 2'de de çalışıyor
Bay Xcoder

2

Kömür , 37 bayt

A⁰βF…·²N«A⟦⟧δF⮌…¹ι«¿¬﹪ικ⊞δκ»A⁺β⌈δβ»Iβ

Çevrimiçi deneyin!

Bağlantı ayrıntılı sürümdür. Kömürde ASCII ile ilgili olmayan bir soruyu nasıl çözebileceğimi anlamak neredeyse bütün günümü aldı, ama sonunda anladım ve benimle gurur duyuyorum. :-D

Evet, bunun çok golf oynayabileceğinden eminim. Ben sadece C # cevabımı tercüme ettim ve eminim ki Kömürde işler farklı şekilde yapılabilir. En azından 1000davayı birkaç saniye içinde çözüyor ...



2

Python 2 (PyPy) , 145 bayt

Kod-golf müsabakalarını en hızlı kodlu müsabakalara dönüştürmek eğlenceli olduğu için , TIO'da n = 5.000.000.000'i 30 saniyede çözen bir O ( n ) algoritması . ( Dennis'in eleği O ( n log n ).)

import sympy
n=input()
def g(i,p,k,s):
 while p*max(p,k)<=n:l=k*p;i+=1;p=sympy.sieve[i];s-=g(i,p,l,n/l*(n/l*k+k-2)/2)
 return s
print~g(1,2,1,-n)

Çevrimiçi deneyin!

Nasıl çalışır

Setin boyutunu sayarız

S = {( a , b ) | 2 ≤ an , 2 ≤ b ≤ en büyük-doğru-bölen ( a )},

Birlik olarak yeniden yazarak, tüm ilkeler üzerine p ≤ √n,

S p = {( pd , b ) | 2 ≤ dn / p , 2 ≤ bd },

ve içerme-hariç tutma ilkesini kullanarak :

| S | = ∑ (−1) m - 1 | S p 1 ∩ ⋯ ∩ S p m | üzerinden m ≥ 1 ve asal p 1 <⋯ < p m ≤ √N,

nerede

S p 1 ∩ ⋯ ∩ S p m = {( p 1p me , b ) | 1 ≤ en / ( p 1p m ), 2 ≤ bp 1 p m - 1 e },
| S p 1 ∩ ⋯ ∩ S p m | = ⌊ n / ( p 1p m ) ⌋⋅ ( p 1p m - 1 ⋅ ( ⌊ n / ( p 1p m ) ⌋ + 1) - 2) / 2.

Toplam, Cn sıfır olmayan terimlere sahiptir; burada C , muhtemelen 6⋅ (1 - ln 2) / π 2 ≈ 0.186544 olan bir sabitle birleşir. Nihai sonuç o zaman | S | + n - 1.


Oooh, bu hızlı ...
Bay Xcoder

2

NewStack , 5 bayt

Neyse ki, aslında bir yerleşik var.

Nᵢ;qΣ

Arıza:

Nᵢ       Add the first (user's input) natural numbers to the stack.
  ;      Perform the highest factor operator on whole stack.
   q     Pop bottom of stack.
    Σ    Sum stack.

Gerçek İngilizce:

8 girdisi için bir örnek verelim.

Nᵢ: 1'den 8'e kadar doğal sayıların listesini yapın: 1, 2, 3, 4, 5, 6, 7, 8

;: En büyük faktörleri hesaplayın: 1, 1, 1, 2, 1, 3, 1, 4

q. İlk elemanı kaldırın:1, 1, 2, 1, 3, 1, 4

ΣVe toplamı alın: 1+1+2+1+3+1+4=13


1+1+2+1+3+1+4= 13hayır 8. Bunun dışında: büyük cevap yani +1.
Kevin Cruijssen

@KevinCruijssen Hata! Bunu yakaladığınız için teşekkürler!
Graviton

2

Java 8, 78 74 72 bayt

n->{int r=0,j;for(;n>1;n--)for(j=n;j-->1;)if(n%j<1){r+=j;j=0;}return r;}

Bağlantı noktası @CarlosAlejo'nun C # cevabı.

Burada deneyin.

Eski yanıt (78 bayt):

n->{int r=0,i=1,j,k;for(;++i<=n;r+=k)for(j=1,k=1;++j<i;k=i%j<1?j:k);return r;}

Burada deneyin.

Açıklama (eski cevabın):

n->{                    // Method with integer parameter and integer return-type
  int r=0,              //  Result-integers
      i=1,j,k;          //  Some temp integers
  for(;++i<=n;          //  Loop (1) from 2 to `n` (inclusive)
      r+=k)             //    And add `k` to the result after every iteration
    for(j=1,k=1;++j<i;  //   Inner loop (2) from `2` to `i` (exclusive)
      k=i%j<1?j:k       //    If `i` is dividable by `j`, replace `k` with `j`
    );                  //   End of inner loop (2)
                        //  End of loop (2) (implicit / single-line body)
  return r;             //  Return result-integer
}                       // End of method



1

Yığılmış , 31 bayt

[2\|>[divisors:pop\MAX]map sum]

Çevrimiçi deneyin!(60 saniye çevrimiçi zaman sınırını aşan 1000 dışındaki tüm test senaryoları.)

açıklama

[2\|>[divisors:pop\MAX]map sum]
 2\|>                               range from 2 to the input inclusive
     [                ]map          map this function over the range
      divisors                      get the divisors of the number (including the number)
              :pop\                 pop a number off the array and swap it with the array
                   MAX              gets the maximum value from the array
                           sum      sum's all the max's

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.