Tôi có hoàn hảo (số) không?


26

Đây là thử thách đầu tiên của tôi!

Lý lịch

Số hoàn hảo là một số nguyên dương, bằng tổng của tất cả các ước của nó, ngoại trừ chính nó.
Vì vậy, 6là số hoàn hảo, kể từ 1 + 2 + 3 = 6.
Mặt khác 12thì không, bởi vì 1 + 2 + 3 + 4 + 6 = 16 != 12.

Bài tập

Nhiệm vụ của bạn rất đơn giản, hãy viết một chương trình, trong đó sẽ đưa nra một trong những thông báo sau:

Tôi là một số hoàn hảo, bởi vì d1 + d2 + ... + dm = s == n
tôi không phải là một số hoàn hảo, bởi vìd1 + d2 + ... + dm = s [<>] n

Trường hợp
d1, ... dmtất cả các ước của nngoại trừ n.
slà tổng của tất cả các ước d1, ..., dm(một lần nữa, không có n).
[<>]<(nếu s < n) hoặc >(nếu s > n).

Ví dụ

Cho n6: "Tôi là một số hoàn hảo, bởi vì 1 + 2 + 3 = 6 == 6"
cho n12: "Tôi không phải là một số hoàn hảo, bởi vì 1 + 2 + 3 + 4 + 6 = 16> 12"
cho nhạnh phúc 13: "Tôi không phải là một số hoàn hảo, vì 1 = 1 <13"

Quy tắc

  • nkhông lớn hơn tiêu chuẩn ngôn ngữ của bạn int.
  • Bạn có thể đọc ntừ đầu vào tiêu chuẩn, từ các đối số dòng lệnh hoặc từ một tệp.
  • Thông báo đầu ra phải được in trên đầu ra tiêu chuẩn và không có ký tự bổ sung nào có thể xuất hiện trong đầu ra (nó có thể có khoảng trắng ở cuối hoặc dòng mới)
  • Bạn không được sử dụng bất kỳ chức năng tích hợp hoặc thư viện nào sẽ giải quyết nhiệm vụ (hoặc phần chính của nó) cho bạn. Không GetDivisors()hoặc một cái gì đó như thế.
  • Tất cả các sơ hở tiêu chuẩn khác áp dụng.

Người chiến thắng

Đây là để mã ngắn nhất tính theo byte thắng!


@orlp Không phải, tôi đã chỉnh sửa thử thách, cảm ơn vì điều đó.
Zereges

7
Tại sao bạn sử dụng ===trong cùng một phương trình? Điều đó không có ý nghĩa. Nó phải là d1 + d2 + ... + dm = s = nIMO.
orlp

Bạn có thể đưa ra một số ví dụ đầu vào và đầu ra, ví dụ với đầu vào 6 và 12?
Zgarb

14
@Zereges Điều đó thật vô lý. Không có gì được chỉ định. Chỉ so sánh.
orlp

1
@orlp Nó dự định.
Zereges

Câu trả lời:


4

Bình thường, 81 byte

jd[+WK-QsJf!%QTStQ"I am"" not""a perfect number, because"j" + "J\=sJ@c3"==<>"._KQ

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

                                 implicit: Q = input number
               StQ               the range of numbers [1, 2, ..., Q-1]
          f                      filter for numbers T, which satisfy:
           !%QT                     Q mod T != 0
         J                       save this list of divisors in J
      -QsJ                       difference between Q and sum of J
     K                           save the difference in K

jd[                              put all of the following items in a list
                                 and print them joined by spaces: 
                  "I am"           * "I am"
   +WK                  " not"       + "not" if K != 0
"a perfect number, because"        * "a perfect ..."
j" + "J                            * the divisors J joined by " + "
       \=                          * "="
         sJ                        * sum of J
            c3"==<>"               * split the string "==<>" in 3 pieces:
                                        ["==", "<", ">"]
           @        ._K              and take the (sign of K)th one (modulo 3)
                       Q           * Q

9

Java, 255 270 byte (Vẫn FF trong cơ sở 17)

class C{public static void main(String[]a){int i=new Integer(a[0]),k=0,l=0;a[0]=" ";for(;++k<i;)if(i%k<1){l+=k;a[0]+=k+" ";}}System.out.print("I am "+(l==i?"":"not ")+"a perfect number, because "+a[0].trim().replace(" "," + ")+" = "+l+(l==i?" == ":l<i?" < ":" > ")+i);}}

Và một phiên bản dễ đọc hơn:

class C {
    public static void main(String[] a) {
        int i = new Integer(a[0]), k = 0, l = 0;
        a[0] = " ";
        for(; ++k<i ;){
            if (i % k == 0) {
                l += k;
                a[0] += k + " ";
            }
        }
        System.out.print("I am " + (l == i ? "" : "not ") + "a perfect number, because " + a[0].trim().replace(" "," + ") + " = " + l + (l == i ? " == " : l < i ? " < " : " > ") + i);
    }
}

Trước đây không hoạt động cho số lẻ, vì vậy tôi phải điều chỉnh một số thứ. Ít nhất tôi đã gặp may mắn với số byte một lần nữa. :)


l == tôi sẽ làm việc hơn 255?
dwana

Tôi biết nếu làm hỏng số byte của bạn, nhưng bạn có thể lưu một ký tự bằng cách thay thế ba (bốn) lần xuất hiện cuối cùng của [0] bằng 'Chuỗi b' và sử dụng 'b' ở vị trí của chúng
Craig

6

R, 158 163 157 153 143 141 byte

Vẫn còn chỗ để chơi golf này.
Chỉnh sửa: Thay thế if(b<n)'<'else if(b>n)'>'else'=='bằng c('<'[b<n],'>'[b>n],'=='[b==n]). Các paste(...)được thay thế bằng một rbind(...)[-1]. Cảm ơn @plannapus cho một vài byte.

n=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)

Bị đánh cắp

n<-scan()             # get number from stdin
w<-which(!n%%1:(n-1)) # build vector of divisors
b=sum(w)              # sum divisors
cat('I am',           # output to STDOUT with a space separator
    'not'[b!=n],      # include not if b!=n
    'a perfect number, because',
    rbind('+',w)[-1], # create a matrix with the top row as '+', remove the first element of the vector
    '=',
    b,                # the summed value
    c(                # creates a vector that contains only the required symbol and ==
        '<'[b<n],     # include < if b<n
        '>'[b>n],     # include > if b>n
        '=='
    )[1],             # take the first element 
    n                 # the original number
)

Chạy thử nghiệm

> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 6
2: 
Read 1 item
I am a perfect number, because 1 + 2 + 3 = 6 == 6
> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 12
2: 
Read 1 item
I am not a perfect number, because 1 + 2 + 3 + 4 + 6 = 16 > 12
> n=scan();b=sum(w<-which(!n%%1:(n-1)));cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
1: 13
2: 
Read 1 item
I am not a perfect number, because 1 = 1 < 13
> 

Cần có +dấu hiệu giữa các ước.
Zereges

@Zereges Tôi vừa nhận thấy điều đó và sẽ khắc phục ngay
MickyT

+1 cho rbindthủ thuật tuyệt vời ! Bạn có thể lưu thêm 2 byte nếu bạn gán 2:n-1cho một biến, giả sử a: which(!n%%1:(n-1)) do đó trở thành a[!n%%a]. (Mã đầy đủ sau đó n=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n))
plannapus

@plannapus Cảm ơn, tôi thực sự hài lòng với điều đó.
MickyT

5

Python 2, 183 173 170 byte

b=input();c=[i for i in range(1,b)if b%i<1];d=sum(c);print'I am %sa perfect number because %s = %d %s %d'%('not '*(d!=b),' + '.join(map(str,c)),d,'=<>='[cmp(b,d)%3::3],b)

Ví dụ:

$ python perfect_number.py <<< 6
I am a perfect number because 1 + 2 + 3 = 6 == 6
$ python perfect_number.py <<< 12
I am not a perfect number because 1 + 2 + 3 + 4 + 6 = 16 > 12
$ python perfect_number.py <<< 13
I am not a perfect number because 1 = 1 < 13
$ python perfect_number.py <<< 100
I am not a perfect number because 1 + 2 + 4 + 5 + 10 + 20 + 25 + 50 = 117 > 100
$ python perfect_number.py <<< 8128
I am a perfect number because 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 = 8128 == 8128

Cảm ơn xnor vì đã tiết kiệm được 13 byte!


4
'=<>'[cmp(b,d)]- tham gia cách mạng!
orlp

Cảm ơn vô cùng! Ôi, đợi đã ... :)
Celeo

1
@Celeo Mình nghĩ ra một giải pháp tương tự. Bạn có thể viết b%i<1cho b%i==0. Đối với ['not ',''][int(d==b)], bạn không cần int, bởi vì Python sẽ tự động chuyển đổi. Hơn nữa, bạn có thể sử dụng chuỗi mulitplication "not "*(d!=b).
xnor

@xnor cảm ơn những lời đề nghị!
Celeo

1
@Celeo Bạn có thể điều chỉnh đề xuất của orlp để hoạt động như "=<>="[cmp(b,d)%3::3].
xnor

4

Julia, 161 157 byte

n=int(ARGS[1])
d=filter(i->n%i<1,1:n-1)
s=sum(d)
print("I am ",s!=n?"not ":"","a perfect number, because ",join(d," + ")," = $s ",s<n?"<":s>n?">":"=="," $n")

Ung dung:

# Read n as the first command line argument
n = int(ARGS[1])

# Get the divisors of n and their sum
d = filter(i -> n % i == 0, 1:n-1)
s = sum(d)

# Print to STDOUT
print("I am ",
      s != n ? "not " : "",
      "a perfect number, because ",
      join(d, " + "),
      " = $s ",
      s < n ? "<" : s > n ? ">" : "==",
      " $n")

4

CJam, 90 byte

"I am"rd:R{R\%!},:D:+R-g:Cz" not"*" a perfect number, because "D'+*'=+D:++'=C+_'=a&+a+R+S*

Để so sánh, in một đơn =có thể đạt được trong 83 byte.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

"I am"  e# Push that string.
rd:R    e# Read a Double from STDIN and save it in R.
{       e# Filter; for each I in [0 ... R-1]:
  R\%!  e# Push the logical NOT of (R % I).
},      e# Keep the elements such that R % I == 0.
:D      e# Save the array of divisors in D.
:+R-g   e# Add the divisors, subtract R and compute the sign of the difference.
:Cz     e# Save the sign in C and apply absolute value.
"not "* e# Repeat the string "not " that many times.

" a perfect number, because "

D'+*    e# Join the divisors, separating by plus signs.
'=+D:++ e# Append a '=' and the sum of the divisors.
'=C+    e# Add the sign to '=', pushing '<', '=' or '>'.
_'=a&   e# Intersect a copy with ['='].
+a+     e# Concatenate, wrap in array and concatenate.
        e# This appends "<", "==" or ">".
R+      e# Append the input number.
S*      e# Join, separating by spaces.

2

Perl, 148 byte

$a=<>;$_=join' + ',grep{$a%$_==0}1..$a-1;$s=eval;print"I am ".($s==$a?'':'not ')."a perfect number because $_ = $s ".(('==','>','<')[$s<=>$a])." $a"

Với ngắt dòng:

$a=<>;
$_=join' + ',grep{$a%$_==0}1..$a-1;
$s=eval;
print"I am ".($s==$a?'':'not ')."a perfect number because $_ = $s ".(('==','>','<')[$s<=>$a])." $a"

Tôi đã chọc vào điều này và bạn có thể tiết kiệm 10 byte bằng cách loại bỏ các dấu ngoặc ngoài xung quanh 'not 'và các '==','>','<'câu lệnh và chuyển từ .sang ,(vì không có gì được thêm vào khi nhập printdanh sách). Ngoài ra, việc chuyển các bài tập của bạn vào parens lần đầu tiên chúng được sử dụng sẽ tiết kiệm được một vài thứ và nếu bạn thay đổi logic một chút grep$a%_<1,1..($a=<>)-1$a!=($s=eval)&&'not 'bạn nên cạo đi một vài lần nữa! Hy vọng rằng tất cả có ý nghĩa!
Dom Hastings

2

Lua, 244 231 byte

Chơi gôn

n=io.read("*n")d={}s="1"t=1 for i=2,n-1 do if n%i==0 then table.insert(d,i)s=s.." + "..i t=t+i end end print(("I am%s a perfect number, because %s = %s"):format(t==n and""or" not", s, t..(t==n and" == "or(t>n and" > "or" < "))..n))

Ung dung:

n=io.read("*n")
divisors={}
sequence="1"
sum=1
for i=2,n-1 do
    if n%i==0 then 
        table.insert(divisors,i)
        sequence=sequence.." + "..i
        sum=sum+i
    end
end

print(("I am%s a perfect number, because %s = %s"):format(sum==n and""or" not", sequence, sum..(sum==n and" == "or(sum>n and" > "or" < "))..n))

2

JavaScript (ES6), 146

Sử dụng chuỗi mẫu, nó hoạt động trong Firefox và Chrome mới nhất.

for(n=prompt(),o=t=i=1;++i<n;)n%i||(t+=i,o+=' + '+i)
alert(`I am ${t-n?'not ':''}a perfect number because ${o} = ${t} ${t<n?'<':t>n?'>':'=='} `+n)


2

Ruby, 174 160 155 136 134 128 122 byte

n=6;a=[*1...n].reject{|t|n%t>0};b=a.inject(:+)<=>n;print"I am#{" not"*b.abs} a perfect number, because ",a*?+,"<=>"[b+1],n

Đã lưu thêm 6 byte :)

Cảm ơn Mẹo chơi golf trong Ruby


Lệnh in vẫn làm phiền tôi .. Và tôi cần tìm ra một cách để rút ngắn ternary if-statement? cần một điều khoản khác tôi không thể cung cấp và chỉ chấp nhận một cuộc gọi cho mỗi trường hợp
Yuri Kazakov

chỉ còn lại một bản in :)
Yuri Kazakov

1

C #, 252 byte

class A{static void Main(string[]a){int i=int.Parse(a[0]);var j=Enumerable.Range(1,i-1).Where(o=>i%o==0);int k=j.Sum();Console.Write("I am "+(i!=k?"not ":"")+"a perfect number, because "+string.Join(" + ",j)+" = "+k+(k>i?" > ":k<i?" < ":" == ")+i);}}

1

Kali , 285 byte

Tuyên bố miễn trừ trách nhiệm: Chỉ hoạt động với phiên bản mới nhất của Kali do các vấn đề với dòng lệnh args.

func main(){n=Convert.toNumber(args[0]);s=1;l="1";foreach(x in range(2,n-3)){if(n%x==0){l+=" + "+x;s+=x;}}if(s==n)println("I am a perfect number, because "+l+" = "+s+" == "+s);else {print("I am not a perfect number, because "+l+" = "+s);if(s>n)println(" > "+n);else println(" < "+n);}}

Phiên bản dễ đọc hơn:

func main() {
    n = Convert.toNumber(args[0]);
    s = 1;
    l = "1";
    foreach(x in range(2, n - 3)) {
            if (n % x== 0) {
                    l += " + " + x;
                    s += x;
            }
    }
    if (s == n)
            println("I am a perfect number, because " + l + " = " + s + " == " + s);
    else {
            print("I am not a perfect number, because " + l + " = " + s);
            if (s > n)
                    println(" > " + n);
            else
                    println(" < " + n);
    }

}


1
1. Tôi dường như không thể thuyết phục được Kali để đọc các đối số dòng lệnh của mình. Nếu tôi thực hiện mono src/Hassium/bin/Debug/Hassium.exe t.hs 6, nó nói System.ArgumentException: The file 6 does not exist.. 2. Điều này không hoạt động với phiên bản này , đây là cam kết cuối cùng trước khi thử thách này được đăng. Vui lòng thêm từ chối trách nhiệm vào câu trả lời của bạn nói rằng bài nộp của bạn không cạnh tranh.
Dennis

Tôi đã thử nó trên Windows (được xây dựng bằng MVS2015) và gặp lỗi tương tự.
Zereges

Đây là một vấn đề đã được cập nhật theo nghĩa đen 15 phút trước. Nhân bản Kali và biên dịch lại. Tôi rất xin lỗi vì tôi gặp vấn đề chính xác như vậy.
Jacob Misirian

1
Nó hoạt động tốt với phiên bản mới nhất. Bây giờ nếu bạn có thể thêm từ chối trách nhiệm, tôi sẽ vui lòng xóa downvote của tôi. (Nhân tiện, bạn có thể ping tôi bằng cách thêm @Dennisvào nhận xét của bạn. Nếu không, tôi không nhận được thông báo về câu trả lời của bạn.)
Dennis

@Dennis Tôi đã thêm nó vào. Cảm ơn bạn đã thông báo :)
Jacob Misirian

1

MATLAB, 238

Sẽ không bao giờ là ngôn ngữ ngắn nhất trong tất cả các ngôn ngữ, nhưng đây là nỗ lực của tôi với MATLAB:

n=input('');x=1:n-1;f=x(~rem(n,x));s=sum(f);a='not ';b=strjoin(strtrim(cellstr(num2str(f')))',' + ');if(s>n) c=' > ';elseif(s<n) c=' < ';else c=' == ';a='';end;disp(['I am ' a 'a perfect number, because ' b ' = ' num2str(s) c num2str(n)])

Và đây là một dạng dễ đọc hơn một chút:

n=input();      %Read in the number using the input() function
x=1:n-1;        %All integers from 1 to n-1
f=x(~rem(n,x)); %Determine which of those numbers are divisors
s=sum(f);       %Sum all the divisors
a='not ';       %We start by assuming it is not perfect (to save some bytes)
b=strjoin(strtrim(cellstr(num2str(f')))',' + '); %Also convert the list of divisors into a string 
                                                 %where they are all separated by ' + ' signs.
%Next check if the number is >, < or == to the sum of its divisors
if(s>n)  
    c=' > ';    %If greater than, we add a ' > ' to the output string
elseif(s<n) 
    c=' < ';    %If less than, we add a ' < ' to the output string
else
    c=' == ';   %If equal, we add a ' == ' to the output string
    a='';       %If it is equal, then it is a perfect number, so clear the 'not' string
end

%Finally concatenate the output string and display the result
disp(['I am ' a 'a perfect number, because ' b ' = ' num2str(s) c num2str(n)])

Tôi đã quản lý để tiết kiệm thêm 2 byte bằng cách không sử dụng hàm. Thay vào đó, bạn chạy dòng mã và nó yêu cầu số làm đầu vào. Sau khi chạy, nó sẽ hiển thị đầu ra ở cuối.


1

Perl 6 , 138 byte

$_=get;
my$c=$_ <=>my$s=[+] my@d=grep $_%%*,^$_;
say "I am {
    'not 'x?$c
  }a perfect number, because {
    join ' + ',@d
  } = $s {
    «> == <»[1+$c]
  } $_"

(Số lượng bỏ qua các dòng mới và thụt lề, vì chúng không cần thiết)

@dlà mảng giữ các ước.
$sgiữ tổng của các ước.
$clà giá trị so sánh giữa đầu vào và tổng của các ước.
(Một cách hiệu quả $clà một trong những -1, 0, 1, nhưng thực sự là một trong những Order::Less, Order::SamehoặcOrder::More )

Trong 'not 'x?$c, ?$ctrong trường hợp này có hiệu quả tương tự như abs $c, và xlà toán tử lặp lại chuỗi.

«> == <» là viết tắt của ( '>', '==', '<' ) .
Kể từ khi$c có một-1,0,1 , chúng tôi phải thay đổi nó để có thể sử dụng nó để lập chỉ mục vào danh sách.

Về mặt kỹ thuật, điều này sẽ làm việc cho các số tốt hơn 2⁶⁴, nhưng mất một lượng thời gian không phù hợp cho các số trên 2¹⁶.


0

Bình thường, 84 byte

jd+,+"I am"*.aK._-QsJf!%QTtUQ" not""a perfect number, because"+.iJm\+tJ[\=sJ@"=<>"KQ

Câu trả lời không hợp lệ, vì tôi từ chối thực hiện ===trong cùng một phương trình.


2
+1 để từ chối "hiện thực = và == trong cùng một phương trình."
theonlygusti

0

Ruby, 164 byte

->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}

Kiểm tra

irb(main):185:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 6
I am a perfect number, because 1 + 2 + 3 = 6 == 6

irb(main):186:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 12
I am not a perfect number, because 1 + 2 + 3 + 4 + 6 = 16 > 12

irb(main):187:0> ->i{t=(1...i).select{|j|i%j==0};s=t.inject &:+;r=['==','>','<'][s<=>i];puts "I am #{'not ' if r!='=='}a perfect number, because #{t.join(' + ')} = #{s} #{r} #{i}"}.call 13
I am not a perfect number, because 1 = 1 < 13

0

Emacs Lisp, 302 byte

(defun p(n)(let((l(remove-if-not'(lambda(x)(=(% n x)0))(number-sequence 1(- n 1)))))(setf s(apply'+ l))(format"I am%s a perfect number, because %s%s = %s %s %s"(if(= s n)""" not")(car l)(apply#'concat(mapcar'(lambda(x)(concat" + "(number-to-string x)))(cdr l)))s(if(= sum n)"=="(if(> sum n)">""<"))n)))

Phiên bản bị đánh cắp:

(defun perfect (n)
  (let ((l (remove-if-not '(lambda (x) (= (% n x) 0))
              (number-sequence 1 (- n 1)))))
    (setf sum (apply '+ l))
    (format "I am%s a perfect number, because %s%s = %s %s %s" (if (= sum n)"" " not") (car l)
        (apply #'concat (mapcar '(lambda (x) (concat " + " (number-to-string x))) (cdr l)))
        sum (if(= sum n)
            "=="
          (if(> sum n)
              ">"
            "<"))
        n)))

0

Powershell, 164 byte

$a=$args[0]
$b=(1..($a-1)|?{!($a%$_)})-join" + "
$c=iex $b
$d=$a.compareto($c)
"I am $("not "*!!$d)a perfect number, because $b = $c $(("==","<",">")[$d]) $a"

Một vài thủ thuật PoSh phổ biến và không phổ biến;

  • Tạo tổng, sau đó đánh giá nó với iex
  • So sánh để lập chỉ mục mảng gt, lt, eq
  • !! $ d sẽ đánh giá là true == 1 với $ d = 1 hoặc -1 và false == 0 với $ d = 0

0

ôi, 150

n=$0{for(p=i=s=n>1;++i<n;)for(;n%i<1;p+=i++)s=s" + "i;printf"I am%s a perfect number, because "s" = "p" %s "n RS,(k=p==n)?_:" not",k?"==":p<n?"<":">"}

Đã lãng phí một số byte khi thực hiện điều này chính xác cho đầu vào 1. Tôi không chắc chắn nếu điều đó được mong đợi.

n=$0{
    for(p=i=s=n>1;++i<n;)
        for(;n%i<1;p+=i++)s=s" + "i;
    printf "I am%s a perfect number, because "s" = "p" %s "n RS,
           (k=p==n)?_:" not",k?"==":p<n?"<":">"
}

0

05AB1E , 58 byte

„I€ÜIѨ©OIÊi'€–}“€…íÀ‚³,ƒ«“®vy'+}\'=®ODI.S"==><"211S£sèIðý

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Iۆ              # Push dictionary string "I am"
IѨ               # Push the divisors of the input-integer, with itself removed
   ©              # Store it in the register (without popping)
    O             # Get the sum of these divisors
     IÊi   }      # If it's not equal to the input-integer:
        '€–      '#  Push dictionary string "not"
“€…íÀ‚³,ƒ«“       # Push dictionary string "a perfect number, because"
®v   }            # Loop `y` over the divisors:
  y'+            '#  Push the divisor `y`, and the string "+" to the stack
      \           # Discard the final "+"
       '=        '# And push the string "="
®O                # Get the sum of the divisors again
  D               # Duplicate it
I.S               # Compare it to the input-integer (-1 if smaller; 0 if equal; 1 if larger)
   "==><"         # Push string "==><"
         211S£    # Split into parts of size [2,1,1]: ["==",">","<"]
              sè  # Index into it (where the -1 will wrap around to the last item)
I                 # Push the input-integer again
ðý                # Join everything on the stack by spaces
                  # (and output the result implicitly)

Xem mẹo 05AB1E này của tôi (phần Làm thế nào để sử dụng từ điển? ) Để hiểu tại sao „I€Ü"I am", '€–"not", và “€…íÀ‚³,ƒ«“"a perfect number, because".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.