Apakah saya sempurna (angka)?

26

Ini tantangan pertamaku!

Latar Belakang

Angka sempurna adalah bilangan bulat positif, yaitu sama dengan jumlah semua pembagi, kecuali itu sendiri.
Begitu 6juga angka sempurna, karena 1 + 2 + 3 = 6.
Di sisi lain 12tidak, karena 1 + 2 + 3 + 4 + 6 = 16 != 12.

Tugas

Tugas Anda sederhana, tulis sebuah program, yang akan, misalnya n, mencetak salah satu pesan ini:

Saya angka sempurna, karena d1 + d2 + ... + dm = s == n
saya bukan angka sempurna, karenad1 + d2 + ... + dm = s [<>] n

Di mana
d1, ... dmsemua pembagi nkecuali n.
sadalah jumlah semua pembagi d1, ..., dm(sekali lagi, tanpa n).
[<>]adalah <(jika s < n) atau >(jika s > n).

Contohnya

Untuk nmenjadi 6: "Saya seorang angka sempurna, karena 1 + 2 + 3 = 6 == 6"
untuk nmenjadi 12: "Saya bukan angka sempurna, karena 1 + 2 + 3 + 4 + 6 = 16> 12"
untuk nmakhluk 13: "Saya bukan angka sempurna, karena 1 = 1 <13"

Aturan

  • ntidak lebih besar dari standar bahasa Anda int.
  • Anda dapat membaca ndari input standar, dari argumen baris perintah atau dari file.
  • Pesan keluaran harus dicetak pada keluaran standar dan tidak ada karakter tambahan yang dapat muncul di keluaran (mungkin ada spasi tambahan atau baris baru)
  • Anda tidak boleh menggunakan fungsi perpustakaan atau built-in apa pun yang akan menyelesaikan tugas (atau bagian utamanya) untuk Anda. Tidak GetDivisors()atau semacamnya.
  • Semua celah standar lainnya berlaku.

Pemenang

Ini adalah sehingga kode terpendek dalam byte menang!

Zereges
sumber
@ Atau tidak, saya mengedit tantangan, terima kasih untuk itu.
Zereges
7
Mengapa Anda menggunakan =dan ==dalam persamaan yang sama? Itu tidak masuk akal. Itu harus d1 + d2 + ... + dm = s = nIMO.
orlp
Bisakah Anda memberikan beberapa contoh input dan output, misalnya dengan input 6 dan 12?
Zgarb
14
@ Zona Itu tidak masuk akal. Tidak ada yang ditugaskan. Hanya dibandingkan.
orlp
1
@ orlp Ini dimaksudkan.
Zereges

Jawaban:

4

Pyth, 81 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

                                 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
Jakube
sumber
9

Java, 255 270 byte (Masih FF di basis 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);}}

Dan versi yang lebih mudah dibaca:

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

Sebelumnya tidak bekerja untuk angka ganjil, jadi saya harus mengubah beberapa hal. Setidaknya saya beruntung dengan hitungan byte lagi. :)

TNT
sumber
Apakah saya akan == bekerja lebih dari 255?
dwana
Saya tahu jika mengacaukan jumlah byte Anda, tetapi Anda dapat menyimpan karakter dengan mengganti tiga (dari empat) kejadian terakhir dari [0] dengan 'String b' dan menggunakan 'b' di tempatnya
Craig
6

R, 158 163 157 153 143 141 byte

Saya pikir masih ada ruang untuk bermain golf.
Sunting: Diganti if(b<n)'<'else if(b>n)'>'else'=='dengan c('<'[b<n],'>'[b>n],'=='[b==n]). The paste(...)diganti dengan rbind(...)[-1]. Terima kasih @plannapus untuk beberapa byte lagi.

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)

Tidak disatukan

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
)

Uji coba

> 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
> 
MickyT
sumber
Harus ada +masuk di antara pembagi.
Zereges
@ Zona Saya baru saja memperhatikan itu dan akan segera memperbaikinya
MickyT
+1 untuk rbindtrik yang brilian ! Anda dapat menyimpan 2 byte tambahan jika Anda menetapkan 2:n-1ke variabel, katakan a: which(!n%%1:(n-1)) demikian menjadi a[!n%%a]. (Kode lengkapnya saat itu 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 Terima kasih, saya sangat senang dengan itu sendiri.
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)

Contoh:

$ 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

Terima kasih kepada xnor karena telah menghemat 13 byte!

Celeo
sumber
4
'=<>'[cmp(b,d)]- bergabung dengan revolusi!
orlp
Luar biasa terima kasih! Oh, tunggu ... :)
Celeo
1
@ Celeo Saya datang dengan solusi serupa. Anda dapat menulis b%i<1untuk b%i==0. Sebab ['not ',''][int(d==b)], Anda tidak perlu int, karena Python akan mengonversi secara otomatis. Apalagi, Anda bisa menggunakan string mulitplication "not "*(d!=b).
xnor
@ xnor, terima kasih atas sarannya!
Celeo
1
@Celeo Anda dapat menyesuaikan saran orlp agar berfungsi sebagai "=<>="[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")

Tidak Disatukan:

# 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")
Alex A.
sumber
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*

Sebagai perbandingan, mencetak satu =dapat dicapai dalam 83 byte.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

"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.
Dennis
sumber
2

Perl, 148 Bytes

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

Dengan jeda baris:

$a=<>;
$_=join' + ',grep{$a%$_==0}1..$a-1;
$s=eval;
print"I am ".($s==$a?'':'not ')."a perfect number because $_ = $s ".(('==','>','<')[$s<=>$a])." $a"
faubi
sumber
Saya sudah menyodok ini dan Anda dapat menyimpan 10 byte dengan menghapus parens luar di sekitar 'not 'dan '==','>','<'pernyataan dan beralih dari .ke ,(karena tidak ada yang ditambahkan saat printdaftar). Juga memindahkan tugas Anda ke parens saat pertama kali digunakan menghemat pasangan, dan jika Anda mengubah sedikit logika menjadi grep$a%_<1,1..($a=<>)-1dan $a!=($s=eval)&&'not 'Anda harus mencukur sedikit lagi! Semoga semua masuk akal!
Dom Hastings
2

Lua, 244 231 byte

Golf:

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))

Tidak Disatukan:

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))
Nikolai97
sumber
2

JavaScript (ES6), 146

Menggunakan string template, ini berfungsi di Firefox dan Chrome terbaru.

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)

edc65
sumber
2

Ruby, 174 160 155 136 134 128 122 Bytes

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

Disimpan 6 Bytes lain :)

Terima kasih untuk Tips bermain golf di Ruby

Yuri Kazakov
sumber
Perintah cetak masih mengganggu saya .. Dan saya perlu mencari cara untuk mempersingkat ternary if-statement? membutuhkan klausa lain yang tidak dapat saya berikan dan hanya menerima satu panggilan per kasus
Yuri Kazakov
hanya satu pernyataan cetak yang tersisa :)
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);}}
Yitz
sumber
1

Hassium , 285 Bytes

Penafian: Bekerja dengan hanya versi terbaru dari Hassium karena masalah dengan args baris perintah.

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

Versi yang lebih mudah dibaca:

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

}

Yakub Misirian
sumber
1
1. Saya sepertinya tidak bisa meyakinkan Hassium untuk membaca argumen baris perintah saya. Jika saya mengeksekusi mono src/Hassium/bin/Debug/Hassium.exe t.hs 6, katanya System.ArgumentException: The file 6 does not exist.. 2. Ini tidak berfungsi dengan versi ini , yang merupakan komit terbaru sebelum tantangan ini diposting. Harap tambahkan penafian atas jawaban Anda yang menyatakan bahwa kiriman Anda tidak bersaing.
Dennis
Saya mencobanya di Windows (dibangun menggunakan MVS2015) dan mendapat kesalahan yang sama.
Zereges
Ini adalah masalah yang telah diperbarui secara harfiah 15 menit yang lalu. Kloning Hassium dan kompilasi lagi. Saya sangat menyesal karena saya mengalami masalah yang sama persis.
Jacob Misirian
1
Ini berfungsi dengan baik dengan versi terbaru. Sekarang jika Anda bisa menambahkan sangkalan, dengan senang hati saya akan menghapus downvote saya. (Ngomong-ngomong, Anda dapat mem-ping saya dengan menambahkan @Denniskomentar Anda. Jika tidak, saya tidak mendapat pemberitahuan tentang balasan Anda.)
Dennis
@Dennis Saya menambahkannya. Terima kasih atas pemberitahuan Anda :)
Jacob Misirian
1

MATLAB, 238

Tidak akan pernah menjadi yang terpendek dari semua bahasa, tapi inilah upaya saya dengan 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)])

Dan ini dalam bentuk yang sedikit lebih mudah dibaca:

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

Saya berhasil menyimpan 2 byte lebih banyak dengan tidak menggunakan fungsi. Alih-alih Anda menjalankan baris kode dan meminta nomor sebagai input. Setelah dijalankan akan menampilkan output di akhir.

Tom Carpenter
sumber
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]
  } $_"

(Hitungan mengabaikan baris baru, dan indentasi, karena mereka tidak diperlukan)

@dadalah array yang memegang pembagi.
$smemegang jumlah pembagi.
$cadalah nilai perbandingan antara input, dan jumlah pembagi.
(Efektif $cadalah salah satu -1, 0, 1, tapi benar-benar salah satu Order::Less, Order::Sameatau Order::More)

Di 'not 'x?$c , ?$cdalam hal ini secara efektif sama dengan abs $c, dan xmerupakan operator pengulangan string.

«> == <» kependekan dari ( '>', '==', '<' ) .
Karena $cmemiliki salah satunya -1,0,1, kita harus mengubahnya satu per satu untuk dapat menggunakannya untuk mengindeks ke dalam daftar.

Secara teknis ini akan bekerja untuk angka-angka di atas 2 but, tetapi membutuhkan waktu yang sangat banyak untuk angka-angka di atas 2¹⁶.

Brad Gilbert b2gills
sumber
0

Pyth, 84 byte

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

Jawaban tidak valid, karena saya menolak untuk mengimplementasikan =dan ==dalam persamaan yang sama.

orlp
sumber
2
+1 karena menolak untuk "mengimplementasikan = dan == dalam persamaan yang sama."
theonlygusti
0

Ruby, 164 Bytes

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

Uji

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
Vasu Adari
sumber
0

Emacs Lisp, 302 Bytes

(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)))

Versi tidak disatukan:

(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)))
Pekat
sumber
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"

Beberapa trik PoSh umum dan tidak begitu umum;

  • Buat jumlah, lalu evaluasi dengan iex
  • Bandingkan untuk mengindeks array gt, lt, eq
  • !! $ d akan mengevaluasi true == 1 untuk $ d = 1 atau -1, dan false == 0 untuk $ d = 0
Tomkandy
sumber
0

awk, 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?"<":">"}

Buang beberapa byte untuk membuat ini benar untuk input 1. Saya tidak yakin apakah itu yang diharapkan.

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?"<":">"
}
Cabbie407
sumber
0

05AB1E , 58 byte

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa „I€Üadalah "I am", '€–adalah "not", dan “€…íÀ‚³,ƒ«“ini "a perfect number, because".

Kevin Cruijssen
sumber