Bin ich perfekt (Nummer)?

26

Dies ist meine erste Herausforderung!

Hintergrund

Perfekte Zahl ist eine positive ganze Zahl, die der Summe aller Teiler außer sich selbst entspricht.
Also 6ist perfekte Nummer, da 1 + 2 + 3 = 6.
Auf der anderen Seite 12liegt das nicht daran 1 + 2 + 3 + 4 + 6 = 16 != 12.

Aufgabe

Ihre Aufgabe ist einfach: Schreiben Sie ein Programm, das für Sie neine der folgenden Meldungen ausgibt:

Ich bin eine perfekte Nummer, weil d1 + d2 + ... + dm = s == n
ich keine perfekte Nummer bin, weild1 + d2 + ... + dm = s [<>] n

Wo
d1, ... dmsind alle Teiler von nbis auf n.
sist die Summe aller Teiler d1, ..., dm(wieder ohne n).
[<>]ist entweder <(if s < n) oder >(if s > n).

Beispiele

Zum nSein 6: "Ich bin eine perfekte Zahl, weil 1 + 2 + 3 = 6 == 6"
Zum nSein 12: "Ich bin keine perfekte Zahl, weil 1 + 2 + 3 + 4 + 6 = 16> 12"
Zum nSein 13: "Ich bin keine perfekte Zahl, weil 1 = 1 <13"

Regeln

  • nist nicht größer als der Standard Ihrer Sprache int.
  • Sie können naus der Standardeingabe, aus Befehlszeilenargumenten oder aus einer Datei lesen .
  • Die Ausgabenachricht muss auf der Standardausgabe gedruckt werden und es können keine zusätzlichen Zeichen in der Ausgabe erscheinen (möglicherweise werden Leerzeichen oder Zeilenumbrüche nachgestellt).
  • Sie dürfen keine eingebauten Funktionen oder Bibliotheksfunktionen verwenden, die die Aufgabe (oder ihren Hauptteil) für Sie lösen würden. Nein GetDivisors()oder so ähnlich.
  • Alle anderen Standardlücken gelten.

Gewinner

Das ist also gewinnt der kürzeste Code in Bytes !

Zereges
quelle
@orlp Es ist nicht, ich habe die Herausforderung bearbeitet, danke dafür.
Zereges
7
Warum benutzt du =und ==in der gleichen Gleichung? Das macht keinen Sinn. Es sollte d1 + d2 + ... + dm = s = nIMO sein.
Orlp
Könnten Sie ein Beispiel für die Ein- und Ausgabe geben, zum Beispiel für die Eingänge 6 und 12?
Zgarb,
14
@Zereges Das ist unsinnig. Es wird nichts zugewiesen. Nur im Vergleich.
Orlp
1
@orlp Es ist beabsichtigt.
Zereges,

Antworten:

4

Pyth, 81 Bytes

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

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

                                 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
quelle
9

Java, 255 - 270 Byte (noch FF in 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);}}

Und eine lesbarere Version:

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

Funktionierte früher nicht für ungerade Zahlen, so musste ich ein paar Dinge optimieren. Zumindest hatte ich wieder Glück mit der Anzahl der Bytes. :)

TNT
quelle
werde ich über 255 arbeiten?
Dwana
Ich weiß, ob Ihre Byteanzahl ruiniert, aber Sie können ein Zeichen retten, indem Sie die letzten drei (von vier) Vorkommen von a [0] durch einen 'String b' ersetzen und an ihrer Stelle 'b' verwenden
Craig
6

R, 158 163 157 153 143 141 Bytes

Ich denke, es gibt immer noch Raum zum Golfen.
Bearbeiten: Ersetzt if(b<n)'<'else if(b>n)'>'else'=='durch c('<'[b<n],'>'[b>n],'=='[b==n]). Der paste(...)wird durch einen ersetzt rbind(...)[-1]. Vielen Dank an @plannapus für ein paar Bytes mehr.

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)

Ungolfed

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
)

Testlauf

> 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
quelle
+Zwischen den Teilern sollte ein Zeichen stehen.
Zereges
@Zereges Ich habe das gerade bemerkt und werde es in Kürze beheben
MickyT
+1 für den brillanten rbindTrick! Sie können 2 zusätzliche Bytes einsparen, wenn Sie 2:n-1einer Variablen Folgendes zuweisen a: which(!n%%1:(n-1)) Also wird a[!n%%a]. (Der vollständige Code ist dann 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 Danke, das hat mich sehr gefreut.
MickyT
5

Python 2, 183 173 170 Bytes

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)

Beispiele:

$ 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

Danke an xnor für das Speichern von 13 Bytes!

Celeo
quelle
4
'=<>'[cmp(b,d)]- Mach mit bei der Revolution!
Orlp
Großartig, danke! Oh, warte ... :)
Celeo
1
@Celeo Ich habe eine ähnliche Lösung gefunden. Sie können b%i<1für schreiben b%i==0. Für ['not ',''][int(d==b)]brauchst du das nicht int, da Python automatisch konvertiert. Darüber hinaus können Sie die String-Multiplikation verwenden "not "*(d!=b).
16.
@xnor danke für die Vorschläge!
Celeo,
1
@Celeo Sie können den Vorschlag von orlp so anpassen, dass er wie folgt funktioniert "=<>="[cmp(b,d)%3::3].
Xnor
4

Julia, 161 157 Bytes

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

Ungolfed:

# 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.
quelle
4

CJam, 90 Bytes

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

Zum Vergleich =könnte das Drucken einer einzelnen in 83 Bytes erreicht werden.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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

Mit Zeilenumbrüchen:

$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
quelle
Ich habe einen Sack über diese hatte und Sie 10 Bytes durch Entfernen der äußeren Pars um die sparen können 'not 'und '==','>','<'Aussagen und das Umschalten von .zu ,(da nichts hinzugefügt wird, wenn printeine Liste ing). Ihre Aufgaben in Pars das erste Mal bewegt sie benutzt spart ein paar, und wenn Sie die Logik etwas ändern grep$a%_<1,1..($a=<>)-1und $a!=($s=eval)&&'not 'Sie sollten ein paar mehr abrasieren! Hoffe, dass alles Sinn macht!
Dom Hastings
2

Lua, 244 231 Bytes

Golf gespielt:

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

Ungolfed:

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
quelle
2

JavaScript (ES6), 146

Mit Vorlagenzeichenfolgen funktioniert es in Firefox und in der neuesten Version von Chrome.

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

Weitere 6 Bytes gespeichert :)

Vielen Dank an Tipps zum Golfen in Ruby

Yuri Kazakov
quelle
Der Druckbefehl stört mich immer noch. Und ich muss einen Weg finden, um die ternäre if-Anweisung zu verkürzen? eine else - Klausel muss ich nicht bieten kann und akzeptiert nur einen Anruf pro Fall
Yuri Kazakov
Es ist nur noch ein Ausdruck übrig :)
Yuri Kazakov
1

C #, 252 Bytes

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
quelle
1

Hassium , 285 Bytes

Haftungsausschluss: Funktioniert aufgrund von Problemen mit Befehlszeilenargumenten nur mit der neuesten Version von Hassium.

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

Mehr lesbare Version:

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

}

Jacob Misirian
quelle
1
1. Ich kann Hassium anscheinend nicht davon überzeugen, meine Befehlszeilenargumente zu lesen. Wenn ich ausführe mono src/Hassium/bin/Debug/Hassium.exe t.hs 6, heißt es System.ArgumentException: The file 6 does not exist.. 2. Dies funktioniert mit dieser Version nicht. Dies ist die letzte Übergabe, bevor diese Herausforderung veröffentlicht wurde. Bitte fügen Sie Ihrer Antwort einen Haftungsausschluss hinzu, der besagt, dass Ihre Einreichung nicht konkurrierend ist.
Dennis
Ich habe es unter Windows (mit MVS2015 erstellt) versucht und den gleichen Fehler erhalten.
Zereges,
Dies ist ein Problem, das vor 15 Minuten buchstäblich aktualisiert wurde. Klonen Sie das Hassium und kompilieren Sie es erneut. Es tut mir sehr leid, da ich genau auf das gleiche Problem gestoßen bin.
Jacob Misirian
1
Es funktioniert gut mit der neuesten Version. Wenn Sie jetzt nur den Haftungsausschluss hinzufügen könnten, würde ich gerne meine Ablehnung entfernen. (Übrigens können Sie mich @Dennis
Dennis
@ Tennis Ich habe es hinzugefügt. Vielen Dank für Ihre Benachrichtigung :)
Jacob Misirian
1

MATLAB, 238

Ich werde nie die kürzeste aller Sprachen sein, aber hier ist mein Versuch mit 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)])

Und dies ist in einer etwas besser lesbaren Form:

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

Ich habe es geschafft, 2 weitere Bytes zu sparen, indem ich keine Funktion verwendet habe. Stattdessen führen Sie die Codezeile aus und fordern die Nummer als Eingabe an. Nach dem Ausführen wird die Ausgabe am Ende angezeigt.

Tom Carpenter
quelle
1

Perl 6 , 138 Bytes

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

(Die Anzahl ignoriert die Zeilenumbrüche und Einzüge, da sie nicht benötigt werden.)

@dist das Array, das die Teiler enthält.
$senthält die Summe der Teiler.
$cist der Wert des Vergleichs zwischen der Eingabe und der Summe der Teiler.
(Effektiv $cist eine -1, 0, 1, aber es ist wirklich einer Order::Less, Order::Sameoder Order::More)

In 'not 'x?$c, ?$cin diesem Fall ist tatsächlich die gleiche wie abs $c, und xist der Zeichenfolge Wiederholungsoperator.

«> == <»ist eine Abkürzung für ( '>', '==', '<' ).
Da $ces eines von gibt -1,0,1, müssen wir es um eins nach oben verschieben, um es zum Indizieren in eine Liste verwenden zu können.

Technisch funktioniert dies für Zahlen deutlich über 2⁶⁴, dauert jedoch für Zahlen über 2¹ takes übermäßig lange.

Brad Gilbert b2gills
quelle
0

Pyth, 84 Bytes

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

Ungültige Antwort, weil ich mich weigere, =und ==in der gleichen Gleichung zu implementieren .

orlp
quelle
2
+1 für die Ablehnung, "= und == in der gleichen Gleichung zu implementieren."
theonlygusti
0

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

Prüfung

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

Ungolfed-Version:

(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)))
Suppe
quelle
0

Powershell, 164 Bytes

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

Einige der gängigen und weniger gängigen PoSh-Tricks;

  • Erzeuge die Summe und bewerte sie mit iex
  • Vergleichen Sie mit dem Indizieren des gt, lt, eq-Arrays
  • !! $ d ergibt true == 1 für $ d = 1 oder -1 und false == 0 für $ d = 0
Tomkandy
quelle
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?"<":">"}

Es wurden einige Bytes verschwendet, um dies für die Eingabe zu korrigieren 1. Ich bin mir nicht sicher, ob das erwartet wird.

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
quelle
0

05AB1E , 58 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)

Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum „I€Üist "I am", '€–ist "not", und “€…íÀ‚³,ƒ«“ist "a perfect number, because".

Kevin Cruijssen
quelle