Senin için yeterince iyi değil miyim?


29

Arka fon:

Mevcut Perfect Numbers mücadelesi , kusurlu ve karmaşıktır, çünkü sayının faktörlerini içeren karmaşık bir biçimde çıktı almanızı ister. Bu, mücadelenin tamamen bildirisidir.

Meydan okuma

Herhangi bir standart giriş biçiminde pozitif bir tamsayı verildiğinde , mükemmel olup olmadığını ayırt edin.

Mükemmel bir sayı tüm uygun bölenlerin toplamına eşit bir sayıdır (pozitif bölenler kendisinden daha az). Örneğin, onun bölenler çünkü mükemmel bir sayı olduğu kadar özetlenir, ise, kendi bölenler beri mükemmel bir sayı (değildir 1,2,3,4,6 ) için Özetle 16 , 12 değil .61,2,36121,2,3,4,61612

Test Durumları:

Imperfect:
1,12,13,18,20,1000,33550335

Perfect:
6,28,496,8128,33550336,8589869056

kurallar

  • Programınız, hafıza veya zaman kısıtlaması varsa daha büyük sınav senaryolarını tamamlamak zorunda değildir, ancak daha fazla hafıza / zaman verilip verilmediğine teorik olarak yapabilmelidir.
  • Çıktı, izin verilen herhangi bir çıktı biçiminde iki farklı ve tutarlı değer olabilir . Perfect / Imperfect'in neyi temsil ettiği hemen belli değilse, lütfen cevabınızı belirttiğinizden emin olun.

Bekle, öyleyse truthy mükemmel olmayan değerler için, falsey ise değerler için mi?
Esolanging Fruit

2
@ Tvde1 Doğru bölenlerin sayıdan daha azına sahip olmaları gerekir, aksi halde 1her sayı 1kendi başına bölünebilir olduğu için mükemmel olandan başka sayı yoktur . Uygun bölenlerinin toplamı 1ise0
Jo Kral

3
@Grimy Sadece bunu ispatlayabilirseniz . İyi şanslar! (bunun baytları nasıl kurtaracağını merak ediyorum)
Jo King

1
Yani hayır, çok kötü. ECMA regex cevabının boyutunu yaklaşık 3 faktörü ile
keserdi

3
"Çıktı iki farklı ve tutarlı değer olabilir" - burada "truthy vs falsey" kullanamaz mıyız (örneğin, sıfırdan sıfıra sıfır kullanarak Python için; boş bir listeye karşı içerik içeren bir liste;
Jonathan Allan,

Yanıtlar:


16

Brachylog , 4 bayt

fk+?

Çevrimiçi deneyin!

Öngörü, mükemmel girdiler için başarılıdır ve hatalı girdiler, yazdırma true.veya false.tam bir program olarak çalıştırılırsa başarısız olur ( TIO'da bir dakikadan uzun süren son test durumu hariç ).

        The input's
f       factors
 k      without the last element
  +     sum to
   ?    the input.

1
Kodun nasıl yazdığını seviyorum fk: x
Ismael Miguel

9

Neim , 3 bayt

𝐕𝐬𝔼

Çevrimiçi deneyin!

(Ne kadar on beş dakika önce Neim'i öğrenmeye başladığımdan beri tüm test vakalarını aynı anda nasıl çalıştıracağımı bilmiyorum, ancak bireysel olarak kontrol ettim.)

Mükemmel için 0, mükemmel için 1 yazdırır.

𝐕      Pop an int from the stack and push its proper divisors,
       implicitly reading the int from a line of input as the otherwise absent top of the stack.
 𝐬     Pop a list from the stack and push the sum of the values it contains.
  𝔼    Pop two ints from the stack and push 1 if they are equal, 0 if they are not;
       implicitly reading the same line of input that was already read as the second int, I guess?
       Implicitly print the contents of the stack, or something like that.

2
Sanırım? ”; " ya da onun gibi bir şey. " Ne yazdığını bile bilmiyorsan, haha. ;) Ama evet, gerçekten böyle çalışır. Neim'i bilmiyorum, ancak girişi dolaylı olarak kullanmak ve dolaylı olarak örtük şekilde çıkarmak, 05AB1E'de de aynıdır.
Kevin Cruijssen

𝔼1 bayt nasıl ? Neim, standart olmayan karakterlerden sadece 128 tanesini kullanıyor mu?
kajacx

3
@kajacx Neim'in kendi kod sayfası var . Bu nedenle, kod sayfasında bulunan 256 karakterin her biri 1 byte kullanılarak kodlanabilir.
Bay Xcoder,

8

R , 33 29 bayt

!2*(n=scan())-(x=1:n)%*%!n%%x

Çevrimiçi deneyin!

İade TRUEmükemmel sayılar için ve FALSEkusurlu olanlar için.


Arka arkaya 2! S size ne kazandırır?
CT Hall

@CTHall Ben spec yanlış okudum; başlangıçta sıfırlandı 0(mükemmel) FALSEve sıfırdan farklıydılar TRUEama eşlemeyi tersine çevirmek için onlardan birini çıkardım. Sık sık veya ile birlikte olmak numericüzere logical, üzerinden atmak için yararlı bir golf numarasıdır . which[
Giuseppe


7

Japt -! , 4 bayt

¥â¬x
-----------------
            Implicit Input U
¥           Equal to
   x        Sum of
 â          Factors of U
  ¬         Without itself

Bazı sebeple ¦TiO üzerinde doesnt iş bu yüzden kullanmak gerekmez -!bayrağı ve ¥yerine

Çevrimiçi deneyin!


Bu bir TIO sorunu değil; Udaha önce otomatik olarak girilmez !.
Shaggy

6

Python 3 , 46 bayt

lambda x:sum(i for i in range(1,x)if x%i<1)==x

Çevrimiçi deneyin!

Kaba kuvvet, faktörleri toplar ve eşitliği kontrol eder.


2
Anlama koşulunu yineleme değişkeniniz için bir maske olarak kullanmak bir bayttan tasarruf sağlar.
Jonathan Frech

Kusurlu bir sayı için gerçekliği geri getirebildiğiniz için lambda x:sum(i for i in range(1,x)if x%i<1)^xde çalışmalısınız.
nedla2004

5

Python , 45 bayt

lambda n:sum(d*(n%d<1)for d in range(1,n))==n

Truemükemmel için; Falsediğerleri için (bu geçiş ==-> !=)

Çevrimiçi deneyin!

 44 42  41 bayt (ovs sayesinde -2), "truthy vs falsey" kullanarak çıktı verebilirsek:

f=lambda n,i=1:i/n or-~f(n,i+1)-(n%i<1)*i

(falsey ( 0)) mükemmel için; aksi halde truthy (sıfır olmayan bir tam sayı)


İkinci çıkış formatı geçerliyse, bu 42 baytta yapılabilir .
ovs

@ovs ah, güzel bitti.
Jonathan Allan

@ovs .. ve ondan bir başkası kurtardı - teşekkürler!
Jonathan Allan

5

Octave , 25 bayt

@(n)~mod(n,t=1:n)*t'==2*n

Çevrimiçi deneyin!

açıklama

@(n)~mod(n,t=1:n)*t'==2*n

@(n)                        % Define anonymous function with input n
             1:n            % Row vector [1,2,...,n]
           t=               % Store in variable t
     mod(n,     )           % n modulo [1,2,...,n], element-wise. Gives 0 for divisors
    ~                       % Logical negate. Gives 1 for divisors
                  t'        % t transposed. Gives column vector [1;2;...;n]
                 *          % Matrix multiply
                      2*n   % Input times 2
                    ==      % Equal? This is the output value

4

JavaScript, 38 bayt

n=>eval("for(i=s=n;i--;)n%i||!(s-=i)")

Çevrimiçi deneyin!

(TIO'daki son test çantası zaman aşımı.)


@Arnauld Sadece f=özyinelemeli bir işlevden dönüştürdükten sonra kaldırmayı unuttum .
tsh

Sadece meraktan soruyorum, neden özyinelemeli bir sürüme geçmiyorsunuz? (34 byte olur.)
Arnauld

@ Ardından, özyinelemeli sürüm yığın taşması nedeniyle daha büyük test çantası için başarısız olacağı için. Belki çalışabilmesi için bazı ortamlar için sıkı mod varsayılanına ihtiyacım var.
tsh

2
Yeterince adil, ancak programınız daha büyük sınav durumlarını tamamlamak zorunda değil (ki bu varsayılan kural, yine de bence).
Arnauld

4

C # (Visual C # Etkileşimli Derleyici) , 46 bayt

n=>Enumerable.Range(1,n).Sum(x=>n%x<1?x:0)^n*2

Mükemmel olursa 0, aksi halde pozitif bir sayı döndürür. İki farklı doğruluk ve sahte değer yerine farklı türde tamsayıların çıktısına izin verilip verilmediğini ve meta ile ilgili herhangi bir tartışma bulamadığımı bilmiyorum. Bu geçersizse, kaldırırım.

Çevrimiçi deneyin!

C # (Visual C # Etkileşimli Derleyici) , 49 47 bayt

n=>Enumerable.Range(1,n).Sum(x=>n%x<1?x:0)==n*2

Çevrimiçi deneyin!



3

TI-BASIC (TI-84), 30 23 bayt

:2Ans=sum(seq(Ans/Xnot(remainder(Ans,X)),X,1,Ans,1

Korkunç derecede verimsiz ama işe yarıyor.
Bayt sayısını azaltmak programı çok hızlandırdı.
Giriş girildi Ans. Program tamamlandığında,
çıktı girilir Ansve otomatik olarak yazdırılır.

Açıklama:
(TI-BASIC'in yorumu yoktur, bu yüzden ;yorumda bulunduğunu varsayalım )

:2Ans=sum(seq(Ans/Xnot(remainder(Ans,X)),X,1,Ans    ;Full program

 2Ans                                               ;double the input
          seq(                                      ;generate a list
                                         X,          ;using the variable X,
                                           1,        ;starting at 1,
                                             Ans     ;and ending at the input
                                                     ;with an implied increment of 1
              Ans/X                                 ;from the input divided by X
                   not(                ),           ;multiplied by the negated result of
                       remainder(Ans,X)              ;the input modulo X
                                                     ;(result: 0 or 1)
      sum(                                          ;sum up the elements in the list
     =                                              ;equal?

Örnek:

6
            6
prgmCDGF2
            1
7
            7
prgmCDGF2
            0

Not: Bir programın bayt sayısı, [MEM] > [2] > [7] (36 bayt) içindeki değer kullanılarak değerlendirilir, ardından program adının uzunluğu CDGF2, (5 bayt) ve bunun için kullanılan fazladan 8 bayt çıkarılır. programı saklamak:

36 - 5 - 8 = 23 bayt


3

Java (JDK) , 54 bayt

n->{int s=0,d=0;for(;++d<n;)s+=n%d<1?d:0;return s==n;}

Çevrimiçi deneyin!

Sayı eşleşmesine göre katı bir sayı olsa da, aşağıdakiler aynı değerleri döndürür, ancak yalnızca 40 bayttır.

n->n==6|n==28|n==496|n==8128|n==33550336

Çevrimiçi deneyin!


Kurallar söylüyor Your program doesn't have to complete the larger test cases, if there's memory or time constraints, but it should be theoretically able to if it were given more memory/time.
Jo King

@JoKing Bu Java'yı hiç kullanamayacağım anlamına mı geliyor, a intyerine BigInteger? Çünkü Java’da BigIntegers, ancak intimzalanan 31 bitten daha fazla bir değeri olmayacak, burada temsil edilenlerden başka bir değere sahip olamaz ...
Olivier Grégoire

hayır, ancak inttür sınırlanmamışsa program hala çalışmalıysa
Jo King,

1
@JoKing Tamam, önce hesaplamaya sahip olmak için iki çözümü de değiştirdim.
Olivier Grégoire

3

x86 Meclisi, 45 43 Bayt.

6A 00 31 C9 31 D2 41 39  C1 7D 0B 50 F7 F9 58 85
D2 75 F1 51 EB EE 31 D2  59 01 CA 85 C9 75 F9 39
D0 75 05 31 C0 40 EB 02  31 C0 C3

Açıklama (Intel Sözdizimi):

PUSH $0          ; Terminator for later
XOR ECX, ECX        ; Clear ECX
.factor:
    XOR EDX, EDX    ; Clear EDX
    INC ECX
    CMP ECX, EAX    ; divisor >= input number?
    JGE .factordone ; if so, exit loop.
    PUSH EAX        ; backup EAX
    IDIV ECX        ; divide EDX:EAX by ECX, store result in EAX and remainder in EDX
    POP EAX         ; restore EAX
    TEST EDX, EDX   ; remainder == 0?
    JNZ .factor     ; if not, jump back to loop start
    PUSH ECX        ; push factor
    JMP .factor     ; jump back to loop start
.factordone:
XOR EDX, EDX        ; clear EDX
.sum:
    POP ECX         ; pop divisor
    ADD EDX, ECX    ; sum into EDX
    TEST ECX, ECX   ; divisor == 0?
    JNZ .sum        ; if not, loop.
CMP EAX, EDX        ; input number == sum?
JNE .noteq          ; if not, skip to .noteq
    XOR EAX, EAX    ; clear EAX
    INC EAX         ; increment EAX (sets to 1)
JMP .return         ; skip to .return
.noteq:
    XOR EAX, EAX    ; clear EAX
.return:
RETN

Giriş sağlanmalıdır EAX.
Fonksiyon setleri EAXiçin 1mükemmel için ve 0kusurlu için.

EDIT : ve MOV EAX, $1ile değiştirerek Byte-Count iki azalırXOR EAX, EAXINC EAX


1
Makro bir derleme kullanıyorum, bu yüzden kesin olarak bilmiyorum ama yorumum benim için "; divisor> input number", "; divisor> = input number" olur.
RosLuP

Montaj kolay bir şekilde komutların uzunluğunu azaltabilir, hepsini sıraya sokar, girintiyi kullanır ve her 10 20 asm talimatında yorum yapar ....
RosLuP

@RosLuP Yorumdaki kodu düzelttim (teşekkürler), ancak ikinci yorumunuzla ne demek istediğinizi bilmiyorum.
Fayti1703

3

Labirent , 80 bayt

?::`}:("(!@
perfect:
{:{:;%"}
+puts; "
}zero: "
}else{(:
"negI"  _~
""""""{{{"!@

Latince karakterler perfect puts zero else neg Iaslında sadece yorumlardır *.
yani giriş mükemmelse, a 0basılır, aksi takdirde basılır -1.

Çevrimiçi deneyin!


* yani bu ya da bu iş ...

?::`}:("(!@               ?::`}:("(!@
       :                  BEWARE :
{:{:;%"}                  {:{:;%"}
+    ; "                  +LAIR; "
}    : "                  } OF : "
}    {(:                  }MINO{(:
"    "  _~                "TAUR"  _~
""""""{{{"!@              """"""{{{"!@

Nasıl?

Bir girdi olarak pozitif bir tamsayı alır nve -nyardımcı yığının üzerine bir akümülatör değişkeni yerleştirir, daha sonra her bir tamsayı için akümülatöre bölünen herhangi bir ilacı ekleyen n-1ve bunları içeren bir bölünebilirlik testi gerçekleştirir . Akümülatör değişkeni sıfır değilse, bu tamamlandıktan sonra a çıkar , yoksa a olur.1n-10

?::`}:(Sadece uygulamanın başında, bir kez yürütülür:

?::`}:(                                                      Main,Aux
?       - take an integer from STDIN and place it onto Main  [[n],[]]
 :      - duplicate top of Main                            [[n,n],[]]
  :     - duplicate top of Main                          [[n,n,n],[]]
   `    - negate top of Main                            [[n,n,-n],[]]
    }   - place top of Main onto Aux                       [[n,n],[-n]]
     :  - duplicate top of Main                          [[n,n,n],[-n]]
      ( - decrement top of Main                        [[n,n,n-1],[-n]]

Bir sonraki komut, "no-op'tur, fakat komşu üç talimatımız vardır, bu yüzden Main'in tepesindeki değere göre dallanırız, sıfır bizi ileri götürür, sıfır olmayan bizi doğru alır.

Eğer girdi 1ileri giderse, Main'in üstü sıfır olduğu için:

(!@                                                          Main,Aux
(   - decrement top of Main                             [[1,1,-1],[-1]]
 !  - print top of Main, a -1
  @ - exit the labyrinth

Fakat girdiler 1sağa döndüğümüzden büyükse , Main'in tepesi sıfır olmayan:

:}                                                           Main,Aux
:  - duplicate top of Main                         [[n,n,n-1,n-1],[-n]]
 } - place top of Main onto Aux                        [[n,n,n-1],[-n,n-1]]

Bu noktada üç komşu bir şubemiz var, ama n-1sıfır olmadığını biliyoruz , bu yüzden sağa dönüyoruz ...

"%                                                           Main,Aux
"  - no-op                                             [[n,n,n-1],[-n,n-1]]
 % - place modulo result onto Main                   [[n,n%(n-1)],[-n,n-1]]
   - ...i.e we've got our first divisibility indicator n%(n-1), an
   -    accumulator, a=-n, and our potential divisor p=n-1:
   -                                                 [[n,n%(n-1)],[a,p]]

Şu anda adresinde başka bir üç komşu şubesindeyiz %.

Eğer sonuç %sıfır değilse, potansiyel bölenimizi düşürmek için sola gider p=p-1ve akümülatörü aolduğu gibi bırakırız :

;:{(:""}"                                                    Main,Aux
;          - drop top of Main                                [[n],[a,p]]
 :         - duplicate top of Main                         [[n,n],[a,p]]
  {        - place top of Aux onto Main                  [[n,n,p],[a]]
           - three-neighbour branch but n-1 is non-zero so we turn left
   (       - decrement top of Main                     [[n,n,p-1],[a]]
    :      - duplicate top of Main                 [[n,n,p-1,p-1],[a]]
     ""    - no-ops                                [[n,n,p-1,p-1],[a]]
       }   - place top of Main onto Aux                [[n,n,p-1],[a,p-1]]
        "  - no-op                                     [[n,n,p-1],[a,p-1]]
         % - place modulo result onto Main           [[n,n%(p-1)],[a,p-1]]
           - ...and we branch again according to the divisibility
           -    of n by our new potential divisor, p-1

sonucu eğer ... ama %sıfır oldu (ilk geçiş için yalnızca n=2doğruca için gitmek) İKİ bizim akümülatör için böleni eklemek a=a+p, VE potansiyel bölen azaltma p=p-1:

;:{:{+}}""""""""{(:""}                                       Main,Aux
;                      - drop top of Main                    [[n],[a,p]]
 :                     - duplicate top of Main             [[n,n],[a,p]]
  {                    - place top of Aux onto Main      [[n,n,p],[a]]
   :                   - duplicate top of Main         [[n,n,p,p],[a]]
    {                  - place top of Aux onto Main  [[n,n,p,p,a],[]]
     +                 - perform addition            [[n,n,p,a+p],[]]
      }                - place top of Main onto Aux      [[n,n,p],[a+p]]
       }               - place top of Main onto Aux        [[n,n],[a+p,p]]
        """""""        - no-ops                            [[n,n],[a+p,p]]
                       - a branch, but n is non-zero so we turn left
               "       - no-op                             [[n,n],[a+p,p]]
                {      - place top of Aux onto Main      [[n,n,p],[a+p]]
                       - we branch, but p is non-zero so we turn right
                 (     - decrement top of Main         [[n,n,p-1],[a+p]]
                  :    - duplicate top of Main     [[n,n,p-1,p-1],[a+p]]
                   ""  - no-ops                    [[n,n,p-1,p-1],[a+p]]
                     } - place top of Main onto Aux    [[n,n,p-1],[a+p,p-1]]

Bu noktada p-1hala sıfır değilse , sola döneriz:

"%                                                           Main,Aux
"  - no-op                                             [[n,n,p-1],[a+p,p-1]]
 % - modulo                                          [[n,n%(p-1)],[a+p,p-1]]
   - ...and we branch again according to the divisibility
   -    of n by our new potential divisor, p-1

... ama p-1sıfıra gidersek :, labirentin ikinci satırına doğrudan gideriz (daha önce tüm talimatları gördün, bu yüzden açıklamalarını bırakıyorum ve sadece etkilerini veriyorum):

:":}"":({):""}"%;:{:{+}}"""""""{{{                           Main,Aux
:                                  -                   [[n,n,0,0],[a,0]]
 "                                 -                   [[n,n,0,0],[a,0]]
                                   - top of Main is zero so we go straight
                                   -  ...but we hit the wall and so turn around
  :                                -                 [[n,n,0,0,0],[a,0]]
   }                               -                   [[n,n,0,0],[a,0,0]]
                                   - top of Main is zero so we go straight
    ""                             -                   [[n,n,0,0],[a,0,0]]
      :                            -                 [[n,n,0,0,0],[a,0,0]]
       (                           -                [[n,n,0,0,-1],[a,0,0]]
        {                          -              [[n,n,0,0,-1,0],[a,0]]
                                   - top of Main is zero so we go straight
                                   -  ...but we hit the wall and so turn around
         (                         -             [[n,n,0,0,-1,-1],[a,0]]
          :                        -          [[n,n,0,0,-1,-1,-1],[a,0]]
           ""                      -          [[n,n,0,0,-1,-1,-1],[a,0]]
             }                     -             [[n,n,0,0,-1,-1],[a,0,-1]]
                                   - top of Main is non-zero so we turn left
              "                    -             [[n,n,0,0,-1,-1],[a,0,-1]]
               %                   - (-1)%(-1)=0     [[n,n,0,0,0],[a,0,-1]]
                ;                  -                   [[n,n,0,0],[a,0,-1]]
                 :                 -                 [[n,n,0,0,0],[a,0,-1]]
                  {                -              [[n,n,0,0,0,-1],[a,0]]
                   :               -           [[n,n,0,0,0,-1,-1],[a,0]]
                    {              -         [[n,n,0,0,0,-1,-1,0],[a]]
                     +             -           [[n,n,0,0,0,-1,-1],[a]]
                      }            -              [[n,n,0,0,0,-1],[a,-1]]
                       }           -                 [[n,n,0,0,0],[a,-1,-1]]
                        """""""    -                 [[n,n,0,0,0],[a,-1,-1]]
                                   - top of Main is zero so we go straight
                               {   -              [[n,n,0,0,0,-1],[a,-1]]
                                {  -           [[n,n,0,0,0,-1,-1],[a]]
                                 { -         [[n,n,0,0,0,-1,-1,a],[]]

Şimdi bunun {üç komşu talimatı var, yani ...

... eğer asıfırsa, ki bu mükemmel olacak n, o zaman dümdüz gideceğiz:

"!@                                                          Main,Aux
"   -                                        [[n,n,0,0,0,-1,-1,a],[]]
    - top of Main is a, which is zero, so we go straight
 !  - print top of Main, which is a, which is a 0
  @ - exit the labyrinth

... eğer asıfır değilse , mükemmel olmayan için olacak n, o zaman sola dönelim:

_~"!@                                                        Main,Aux
_     - place a zero onto Main             [[n,n,0,0,0,-1,-1,a,0],[]]
 ~    - bitwise NOT top of Main (=-1-x)   [[n,n,0,0,0,-1,-1,a,-1],[]]
  "   -                                   [[n,n,0,0,0,-1,-1,a,-1],[]]
      - top of Main is NEGATIVE so we turn left
   !  - print top of Main, which is -1
    @ - exit the labyrinth


2

Javascript, 62

n=>n==[...Array(n).keys()].filter(a=>n%a<1).reduce((a,b)=>a+b)

Açıklama (oldukça basit olmasına rağmen)

n=> //return function that takes n
  n== //and returns if n is equal to
    [...Array(n).keys()] //an array [0..(n-1)]...
      .filter(a=>n%a<1) //where all of the elements that are not divisors of n are taken out...
      .reduce((a,b)=>a+b) //summed up

Gelişim için Jo King'e teşekkürler !




2

C (gcc) , 41 bayt

f(n,i,s){for(i=s=n;--i;s-=n%i?0:i);n=!s;}

Çevrimiçi deneyin!

1: 0
12: 0
13: 0
18: 0
20: 0
1000: 0
33550335: 0
6: 1
28: 1
496: 1
8128: 1
33550336: 1
-65536: 0 <---- Unable to represent final test case with four bytes, fails

Son davanın başarısızlığının bir sorun olup olmadığını bana bildirin.



2
"Çıktı, izin verilen herhangi bir çıktı biçiminde iki farklı ve tutarlı değer olabilir." İki farklı değer döndürmüyorsunuz.
Olivier Grégoire

2
@ OlivierGrégoire Neyse ki bu alan bir ünlem işareti ile değiştirilerek kolayca düzeltilebilir!
Neil

1
@Neil Daha da iyisi, 5 bayt kaydetmek n=!s;yerine düzeltilebilir return!s;.

@ OlivierGrégoire ahh, bu noktayı unuttum. Ayrıca, geliştirilmiş kod ile güncellendi. Benzer bir şey denedim, fakat yaptığım aptal s=s, muhtemelen daha iyi duruma geldi.
Marcos,


2

İleri (gforth) , 45 bayt

: f 0 over 1 ?do over i mod 0= i * - loop = ;

Çevrimiçi deneyin!

açıklama

Her sayı üzerinde 1'den n-1'e kadar olan döngüler, n'yi mükemmel şekilde bölen tüm değerleri toplar. Toplam n'ye eşitse true değerini döndürür

Kod Açıklaması

: f                \ start word definition
  0 over 1         \ create a value to hold the sum and setup the bounds of the loop
  ?do              \ start a counted loop from 1 to n. (?do skips if start = end)
    over           \ copy n to the top of the stack
    i mod 0=       \ check if i divides n perfectly
    i * -          \ if so, use the fact that -1 = true in forth to add i to the sum
  loop             \ end the counted loop
  =                \ check if the sum and n are equal
;                  \ end the word definition

2

Pyth , 9 13 bayt

qsf!%QTSt

Çevrimiçi deneyin!

Golf yardımı için yorum yapanlara teşekkür ederiz

Girdideki tüm faktörleri bulur, toplar ve orijinal girdiyle karşılaştırır.


Sizin için birkaç golf - q0değiştirilebilir !ve SQmenzili üretir [1-Q], böylece menzil [1-Q)kullanılarak oluşturulabilir StQ. Şöyle Qprogramında sonunda artık her ikisi de ihmal edilebilir. Fettled sürümü, 9 bayt -qsf!%QTSt
Sok

1

Toplu iş, 81 bayt

@set s=-%1
@for /l %%i in (1,1,%1)do @set/as+=%%i*!(%1%%%%i)
@if %s%==%1 echo 1

Alır nbir komut satırı parametresi olarak ve çıkışlar 1mükemmel bir sayı ise. Brute force yöntemi, toplamı başlatır, -nböylelikle nkendini döngüye dahil eder.


1

Mangal kömürü , 13 bayt

Nθ⁼θΣΦθ∧ι¬﹪θι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. -Mükemmel sayılar için çıktılar . Kaba kuvvet kullanır. Açıklama:

Nθ              Numeric input
     Φθ         Filter on implicit range
        ι       Current value (is non-zero)
       ∧        Logical And
           θ    Input value
          ﹪     Modulo
            ι   Current value
         ¬      Is zero
    Σ           Sum of matching values
  ⁼             Equals
   θ            Input value


1

Pyth, 8 bayt

qs{*MPyP

Burada çevrimiçi deneyin .

qs{*MPyPQQ   Implicit: Q=eval(input())
             Trailing QQ inferred
       PQ    Prime factors of Q
      y      Powerset
     P       Remove last element - this will always be the full prime factorisation
   *M        Take product of each
  {          Deduplicate
 s           Sum
q        Q   Is the above equal to Q? Implicit print

1

Retina 0.8.2 , 44 bayt

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

Çevrimiçi deneyin! Kaba kuvvet kullanır, bu yüzden bağlantı sadece daha hızlı test vakaları içerir. Açıklama:

.+
$*

Birliğe dönüştür.

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

Girişin tüm faktörlerini eşleştirin. Bu, Retina 0.8.2'de tüm eşleşmelerin farklı konumlarda başlamasını gerektiren örtüşen modunu kullanır, bu yüzden eşleşmeler asıl girdiden başlayarak azalan sırada geri döner.

+`^1(1*¶+)1
$1

Girişten uygun faktörleri çıkarın.

^¶+$

Sonucun sıfır olup olmadığını test edin.


1

Java 8, 66 bayt


Bunu yapmak için daha kısa bir yol olsa bile, birisinin akış API'sini bir noktada kullanması gerekir.

n->java.util.stream.IntStream.range(1,n).filter(i->n%i<1).sum()==n

Çevrimiçi deneyin!


1

cQuents , 8 bayt

?#N=U\zN

Çevrimiçi deneyin!

açıklama

?           Mode query: return whether or not input is in sequence
 #          Conditional: iterate N, add N to sequence if condition is true
  N=         Condition: N == 
    U    )                   sum(                  )
     \z )                        proper_divisors( )
       N                                         N
        ))    implicit
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.