Dies ist meine erste Herausforderung!
Hintergrund
Perfekte Zahl ist eine positive ganze Zahl, die der Summe aller Teiler außer sich selbst entspricht.
Also 6
ist perfekte Nummer, da 1 + 2 + 3 = 6
.
Auf der anderen Seite 12
liegt das nicht daran 1 + 2 + 3 + 4 + 6 = 16 != 12
.
Aufgabe
Ihre Aufgabe ist einfach: Schreiben Sie ein Programm, das für Sie n
eine 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, ... dm
sind alle Teiler von n
bis auf n
.
s
ist die Summe aller Teiler d1, ..., dm
(wieder ohne n
).
[<>]
ist entweder <
(if s < n
) oder >
(if s > n
).
Beispiele
Zum n
Sein 6
: "Ich bin eine perfekte Zahl, weil 1 + 2 + 3 = 6 == 6"
Zum n
Sein 12
: "Ich bin keine perfekte Zahl, weil 1 + 2 + 3 + 4 + 6 = 16> 12"
Zum n
Sein 13
: "Ich bin keine perfekte Zahl, weil 1 = 1 <13"
Regeln
n
ist nicht größer als der Standard Ihrer Spracheint
.- Sie können
n
aus 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 Code-Golf, also gewinnt der kürzeste Code in Bytes !
quelle
=
und==
in der gleichen Gleichung? Das macht keinen Sinn. Es sollted1 + d2 + ... + dm = s = n
IMO sein.Antworten:
Pyth, 81 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
Java,
255 -270 Byte (noch FF in Basis 17)Und eine lesbarere Version:
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. :)
quelle
R,
158163157153143141 BytesIch denke, es gibt immer noch Raum zum Golfen.
Bearbeiten: Ersetzt
if(b<n)'<'else if(b>n)'>'else'=='
durchc('<'[b<n],'>'[b>n],'=='[b==n])
. Derpaste(...)
wird durch einen ersetztrbind(...)[-1]
. Vielen Dank an @plannapus für ein paar Bytes mehr.Ungolfed
Testlauf
quelle
+
Zwischen den Teilern sollte ein Zeichen stehen.rbind
Trick! Sie können 2 zusätzliche Bytes einsparen, wenn Sie2:n-1
einer Variablen Folgendes zuweisena
:which(!n%%1:(n-1))
Also wirda[!n%%a]
. (Der vollständige Code ist dannn=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)
)Python 2,
183173170 BytesBeispiele:
Danke an xnor für das Speichern von 13 Bytes!
quelle
'=<>'[cmp(b,d)]
- Mach mit bei der Revolution!b%i<1
für schreibenb%i==0
. Für['not ',''][int(d==b)]
brauchst du das nichtint
, da Python automatisch konvertiert. Darüber hinaus können Sie die String-Multiplikation verwenden"not "*(d!=b)
."=<>="[cmp(b,d)%3::3]
.Julia,
161157 BytesUngolfed:
quelle
CJam, 90 Bytes
Zum Vergleich
=
könnte das Drucken einer einzelnen in 83 Bytes erreicht werden.Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Perl, 148 Bytes
Mit Zeilenumbrüchen:
quelle
'not '
und'==','>','<'
Aussagen und das Umschalten von.
zu,
(da nichts hinzugefügt wird, wennprint
eine Liste ing). Ihre Aufgaben in Pars das erste Mal bewegt sie benutzt spart ein paar, und wenn Sie die Logik etwas änderngrep$a%_<1,1..($a=<>)-1
und$a!=($s=eval)&&'not '
Sie sollten ein paar mehr abrasieren! Hoffe, dass alles Sinn macht!Lua,
244231 BytesGolf gespielt:
Ungolfed:
quelle
JavaScript (ES6), 146
Mit Vorlagenzeichenfolgen funktioniert es in Firefox und in der neuesten Version von Chrome.
quelle
Ruby,
174160155136134128122 BytesWeitere 6 Bytes gespeichert :)
Vielen Dank an Tipps zum Golfen in Ruby
quelle
C #, 252 Bytes
quelle
Hassium , 285 Bytes
Haftungsausschluss: Funktioniert aufgrund von Problemen mit Befehlszeilenargumenten nur mit der neuesten Version von Hassium.
Mehr lesbare Version:
}
quelle
mono src/Hassium/bin/Debug/Hassium.exe t.hs 6
, heißt esSystem.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
MATLAB, 238
Ich werde nie die kürzeste aller Sprachen sein, aber hier ist mein Versuch mit MATLAB:
Und dies ist in einer etwas besser lesbaren Form:
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.
quelle
Perl 6 , 138 Bytes
(Die Anzahl ignoriert die Zeilenumbrüche und Einzüge, da sie nicht benötigt werden.)
@d
ist das Array, das die Teiler enthält.$s
enthält die Summe der Teiler.$c
ist der Wert des Vergleichs zwischen der Eingabe und der Summe der Teiler.(Effektiv
$c
ist eine-1
,0
,1
, aber es ist wirklich einerOrder::Less
,Order::Same
oderOrder::More
)In
'not 'x?$c
,?$c
in diesem Fall ist tatsächlich die gleiche wieabs $c
, undx
ist der Zeichenfolge Wiederholungsoperator.«> == <»
ist eine Abkürzung für( '>', '==', '<' )
.Da
$c
es 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.
quelle
Pyth, 84 Bytes
Ungültige Antwort, weil ich mich weigere,
=
und==
in der gleichen Gleichung zu implementieren .quelle
Rubin, 164 Bytes
Prüfung
quelle
Emacs Lisp, 302 Bytes
Ungolfed-Version:
quelle
Powershell, 164 Bytes
Einige der gängigen und weniger gängigen PoSh-Tricks;
quelle
awk, 150
Es wurden einige Bytes verschwendet, um dies für die Eingabe zu korrigieren
1
. Ich bin mir nicht sicher, ob das erwartet wird.quelle
05AB1E , 58 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
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"
.quelle