Üstünlüğü Belirleme


21

Bir superabundant sayı bir tamsayı , n bir, yeni üst ile oran için bağlı olduğu setleri bölen toplama fonksiyonu σ. Başka bir deyişle, n tüm pozitif tamsayılar için superabundant ancak ve ancak, bir x az olan n :

σ(n)n>σ(x)x

Değerlerin birkaçı için:

n   σ(n)   σ(n)/n   superabundant
1   1      1.0000   yes
2   3      1.5000   yes
3   4      1.3333   no
4   7      1.7500   yes
5   6      1.2000   no
6   12     2.0000   yes
7   8      1.1429   no
8   15     1.8750   no
9   13     1.4444   no

Bunların daha uzun bir listesi (test durumları için) OEIS A004394'te bulunabilir .

Son derece önerilen bir negatif test durumu (tercümanınız bunu başa çıkabiliyorsa) 360360'tır, çünkü son üst düzey sayıyla bağdaştırılır.

Meydan okuma

Programınız tek bir pozitif tamsayı almalı ve bu tamsayının çok fazla olup olmadığını gösteren bir gerçeği ya da yanlış değeri vermelidir.

Bu olduğu için, bayt cinsinden en kısa cevap kazanır.

Yanıtlar:


7

Jöle , 7 bayt

Æs÷$ÞṪ=

Çevrimiçi deneyin!

Jöle , 8 bayt

Æs÷$ÐṀ⁼W

Çevrimiçi deneyin!

Test odası!

açıklama

÷s ÷ $ ÐṀ⁼W ~ Tam program (monadik).

    Link ~ Elemanları maksimum bağlantı değerinde tutun (otomatik olarak sıralanır).
~s ~ Bölen toplamı.
  $ ~ Geçerli öğeye göre bölün.
      ⁼W ~ Giriş tekil sarılı olarak eşitliği kontrol edin.
         ~ (360360 gibi tam sayılar için)

Bence Æs÷$ÐṀ=7 byte yapabilirsin. ÐṀRangalı olduğunun farkında değildim, bilmek faydalı.
dylnan

@dylnan Hayır yapamam. Çevrimiçi olarak test edilemese de, başarısız olur 360360. Aslında, bu benim ilk versiyonumdu
Bay Xcoder 19:17

Neden başarısız oldu 360360?
dylnan

@dylnan 360360ise ilk o önce oluşan bir sonuç kravat ilk sayı olduğu için, bu (Sanırım) için başarısız olur numarası. (ve sonucumuz olacaktır [0, 1])
Bay Xcoder

@ Mr.Xcoder Anladım, teşekkürler
dylnan

5

Haskell , 73 bayt

Bay Xcoder sayesinde -1 bayt. Laikoni sayesinde -7 bayt.

r=read.show
s n=sum[r i|i<-[1..n],n`mod`i<1]/r n
f n=all((s n>=).s)[1..n]

Çevrimiçi deneyin!

Haskell'in tip sistemi pek golf sahası değil ...



4

Octave , 41 bayt

@(n)([~,p]=max((x=1:n)*~mod(x,x')./x))==n

Çevrimiçi deneyin!

açıklama

@(n)                                       % Define anonymous function of n
                x=1:n                      % Range from 1 to n. Call that x
                        mod(x,x')          % n×n matrix of all pair-wise moduli
                       ~                   % Logical negate. True means it's a divisor
               (     )*                    % Matrix-multiply x times the above matrix
                                           % (gives the dot product of vector x times
                                           % each column of the matrix)
                                 ./x       % Divide each column by each entry in x
     [~,p]=max(                     )      % Index of first occurrence of maximum
    (                                )==n  % Does it equal n?

3

J , 35 bayt

Bay Xcoder'a sorunu bulduğu ve çözdüğü için teşekkürler!

[:([:*/{:>}:)@(%~>:@#.~/.~&.q:)1+i.

Çevrimiçi deneyin!


1
Bu başarısız olur 360360(daha fazla ayrıntı için mücadeleye bakın: Son derece süratli bir sayı ile bağlandığı için şiddetle tavsiye edilen bir olumsuz test davası 360360'dır ).
Bay Xcoder

1
+3 bayt için düzeltildi. Çevrimiçi deneyin . Golf oynamak Çok kullanmayı seviyorum #.~(dürüst olmak gerekirse, tüm bölen toplam işlevi gerçekten çok güzel). Yanlış olan şey şu ki, yapma düşüncesi {:=>./zekice olsa da , sorunun “daha ​​büyük” kısmını tatmin etmiyor.
cole,

1
İşte şu anda aynı uzunlukta olan sigma işlevi yerine geldi ne: (1#.{:(]*0=|~)])\ . Bununla ilgili bir sorun var, belki bazı düşünceleriniz var?
cole,

1
@cole Bölenler fonksiyonunun toplamı için verilen krediler bu yazıda Roger Hui'ye gider . Ayrıca başka bir sigma işlevi yazmaya başladım ancak 9 bayta ulaştıktan sonra durdum ve bunun asal çarpanlara ayırma işleminden daha kısa olmayacağına karar verdim. Sorunu çözdüğünüz için teşekkürler!
Galen Ivanov

@cole Karşılaştığım bölenlerin toplamı için en kısa fiil şudur: (1#.]*0=|~)1+i.Bu bir kanca ve gerçi kolayca yerine oturmuyor :) :)
Galen Ivanov

3

Julia 0.6 , 52 bayt

n->indmax(sum(x for x=1:m if m%x<1)//m for m=1:n)==n

Çevrimiçi deneyin!

Bu çözüm eşitlik durumunda doğruluğu sağlamak için rasyonel sayılar kullanır. (Test 360360 neredeyse 10 dakika sürdü.)

Kayan nokta kullanılarak, 2 bayt sol bölme ile kaydedilebilir:

n->indmax(m\sum(x for x=1:m if m%x<1)for m=1:n)==n

3

Pyth , 14 bayt

( FryAmTheEggman 1 bayt kaydetti)

qh.Mcs*M{yPZZS

Burada dene! veya daha fazla test vakası görün.

Sadece benim zorunlu Pyth teslimi olan, muhtemelen golf oynamaktadır.

Nasıl?

qh.Mcs * M {yPZZS ~ Tam program. Q = giriş.

             S ~ [1, Q] aralığındaki tamsayılar.
  .M ~ Maksimum fonksiyon değerine sahip elemanları alın.
    cs * M {yPZZ ~ Anahtar işlevi: Z değişkenini kullanır.
         yPZ ~ Z nin asal çarpanlarının gücü.
        {~ Tekilleştirildi.
      * M ~ Her birinin ürünü.
     s ~ Ve toplandı.
    c Z ~ Z ile bölünür.
 h ~ İlk eleman.
q ~ Girişle eşitliği kontrol edin. Doğru veya Yanlış çıktılar.

3

05AB1E , 10 bayt

LÑOā/ZQ¨_P

Çevrimiçi deneyin! veya Test paketi olarak

açıklama

L            # push range [1 ... input]
 Ñ           # divisors of each
  O          # sum of each
   ā/        # divide each by its 1-based index
     Z       # get max
      Q      # compare to each
       ¨     # remove the last element
        _    # logical negation
         P   # product

Ben düşünüyorum bu başarısız (Emin olmayan rağmen) 360360(Daha fazla ayrıntı için meydan bkz: ., Son superabundant numarası ile bağları nedeniyle bir tavsiye negatif test durumda, 360.360 olduğunu ).
Bay Xcoder

@ Mr.Xcoder: Doğru. Düzeltildi, ancak şimdi bunu yapmanın daha iyi bir yolu olabilir.
Emigna


2

R kullanarak numbers, 59 bayt

f=function(n)which.max(sapply(1:n,numbers::Sigma)/(1:n))==n

2

Mathematica, 53 50 bayt

a=Tr@Divisors@#/#&;AllTrue[a@#-Array[a,#-1],#>0&]&

Saf işlevi. Bir tamsayıyı girdi olarak döndürür Trueveya Falseçıktı olarak alır.


Gibi bir şey Tr@Divisors@#çalışır mı?
user202729

1

Japt v2.0a0, 12 16 bayt

Uykudan mahrum beyin, bundan daha fazla gelişemez!

1Truthy veya falsey 0için döndürür .

Æâ x÷U >Xâ x÷XÃ×

Dene

İşlemek için 4 bayt feda edildi 360360.


açıklama

  • Tamsayının örtük girişi U.
  • Æ Ãarasındaki tam bir dizi oluşturur 0için U-1aşağıdaki fonksiyonu olarak içinden her geçtiğiX .
  • âbölenleri alır U.
  • ÷Ubunların her birini böler U.
  • x sonuçları toplar.
  • bölenleri alır X.
  • ÷Xbunların her birini böler X.
  • x sonuçları toplar.
  • > ilk sonucun ikinciden büyük olup olmadığını kontrol eder.
  • × Elde edilen boolean dizisini çarpma ile azaltır.

1
Mevcut yaklaşımınız açıklamanızla eşleşirse, bu 360360tür tamsayılar için başarısız olur veya böyle bir tamsayı: Başarısız bir negatif test durumu (tercümanınız bunu yapabilirse) 360360'tır, çünkü son süratli sayıyla bağlantılıdır
Bay Xcoder

@ Mr.XCoder: Fındık, haklısın! Bunu düzeltmek için bir dakikanızı ayırdığımda bu muhtemelen bana biraz bayta mal olacak.
Shaggy

@ Mr.Xcoder: Şimdilik düzeltildi, geliştirip geliştiremeyeceğimi görmek için daha sonra geri gelmek zorunda kalacak.
Shaggy

0

APL + WIN, 37 bayt

 ↑1=⍒⌽(+/¨((0=(⍳¨n)|¨n)×⍳¨n)~¨⊂0)÷n←⍳⎕

Ekran girişi için bilgi istemi.


0

C (gcc), 99 bayt

s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;n=k;}f(n,i,r){for(i=r=0;++i<n;)r=1.*s(n)/n<1.*s(i)/i?:r;r=!r;}

Çevrimiçi deneyin!

C, 108 bayt

float s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;return k;}f(n,i,r){for(i=r=0;++i<n;)s(n)/n<s(i)/i&&++r;return!r;}

Çevrimiçi deneyin!


Öyleyse neden sbir şamandıra döndürmek gerekiyor?
Nissa

@StephenLeppik için kullanımı yüzdürme bölümü yerine bölünmesi tamsayıdır karşılaştırılması s(n)/niçin s(i)/i.
Steadybox

0

Swift , 120 118 bayt

let s={n in Float((1...n).reduce(0){n%$1>0 ?$0:$0+$1})}
{n in(1..<n).reduce(0){max($0,s($1)/Float($1))}<s(n)/Float(n)}

Swift'deki dolaylı tür bildirimleri nedeniyle derlemek biraz zaman aldı (TIO'da yaklaşık 6 saniye).

Çevrimiçi deneyin!



0

Funky , 79 bayt

d=n=>fors=i=0i<=n i++s+=i*!n%i
f=n=>{forc=1c<n c++if(d(n)/n)<=d(c)/c return0 1}

Açıklaması

Bu, ilk önce fonksiyon dolan fonksiyonu tanımlar σve bu, versiyonunun golflü versiyonudur.

function d(n){
    var s = 0;
    for(var i=0; i<n; i++){
        if(n%i == 0){
            s += i;
        }
    }
    return s;
}

İ'yi 0'a ayarlayabiliriz, çünkü i*n%0daima eşit olacaktır 0*..., böylece0 .

Bunun bir sonraki yarısı fSuperabandunce fonksiyonu olan fonksiyonu tanımlar ve sadece golf oynama şeklidir.

function f(n){
    for(var c=1; c<n; c++){
        if( (d(n)/n) <= (d(c)/c) ){
            return 0;
        }
    }
    return 1;
}

Ve bu sadece, meydan okuma özelliğinin önerdiği gibi, 1'den n-1'e kadar olan tüm tam sayıların d(n)/ngirdiden daha düşük bir değere sahip olduğunu kontrol eder.

Çevrimiçi deneyin!



0

Kabuğu , 9 bayt

εü<m§ṁ/Ḋṫ

Çevrimiçi deneyin! 360360 test durumu için çok yavaş.

açıklama

εü<m§ṁ/Ḋṫ  Implicit input, say n=6.
        ṫ  Decreasing range: [6,5,4,3,2,1]
   m       Map this function (example argument k=4):
       Ḋ    Divisors of k: [1,2,4]
    §ṁ      Map and sum
      /     division by k: 7/4
           Result: [2,6/5,7/4,4/3,3/2,1]
 ü         Remove duplicates by
  <        strict comparison. This greedily extracts a non-decreasing subsequence: [2]
ε          Is it a singleton list? Yes.


0

Perl 5, 84 bayt

say!grep$a[-1]<=$a[$_],0..(@a=map{$i=$_;my$j;map{$i%$_ or$j+=$_/$i}1..$i;$j}1..<>)-2

gerektirir -E (ücretsiz)

Spesifikasyonun basit bir uygulaması, golf


0

APL (NARS), 61 karakter, 122 bayt

r←f w;m;k
r←m←0
r+←1⋄k←r÷⍨11πr⋄→3×⍳r≥w⋄→2×⍳∼m<k⋄m←k⋄→2
r←k>m

11π faktörlerin fonksiyon toplamıdır

  (⍳9),¨ f¨1..9
1 1  2 1  3 0  4 1  5 0  6 1  7 0  8 0  9 0 
  f 360360
0
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.