Eine Selbstzahl (auch als kolumbianische oder Devlali-Zahl bezeichnet) ist eine natürliche Zahl x
, bei der die Gleichung n + <digit sum of n> = x
keine Lösung für eine natürliche Zahl enthält n
. Beispielsweise ist 21 keine Selbstzahl, wie sich n = 15
ergibt 15 + 1 + 5 = 21
. Auf der anderen Seite, 20 ist eine Selbst Zahl, da kein n
welche Folgendes erfüllt eine solche Gleichheit gefunden werden kann.
Da diese Definition die Ziffernsumme referenziert, ist sie basisabhängig. Für die Zwecke dieser Herausforderung werden wir nur die Basis-10-Selbstzahlen berücksichtigen, die im OEIS die Sequenz A003052 sind . Binäre ( A010061 ) und Basis 100 ( A283002 ) Selbstnummern wurden ebenfalls kalibriert.
Die Herausforderung
x
Geben Sie bei einer positiven Ganzzahl als Eingabe einen Wahrheitswert aus, wenn x
es sich um eine Selbstzahl in der Basis 10 handelt, und ansonsten einen Falsey-Wert. Informationen zu Wahrheiten und falschen Werten finden Sie in diesem Meta-Post zum Thema .
Sie können ein komplettes Programm oder eine komplette Funktion schreiben und die Ein- und Ausgabe kann auf jedem der üblichen Kanäle erfolgen. Standardlücken sind natürlich verboten.
Das ist Code-Golf . Je kürzer Ihre Antwort (in Bytes), desto besser!
Testfälle
Wahrheit:
1
3
5
7
9
20
31
86
154
525
Falsey:
2
4
6
8
10
15
21
50
100
500
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Antworten:
Oktave , 37 Bytes
Port meiner MATL-Antwort.
Probieren Sie es online!
quelle
Java (JDK 10) , 84 Byte
Probieren Sie es online!
Erläuterung
Credits
quelle
n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
05AB1E , 8 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
Brachylog , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
false.
ein wahrer Wert durch irgendeine objektive Methode auf eine Weise, dietrue.
es nicht ist? Ich denke nicht, und es sieht so aus, als würde dies vom MetakonsensC (gcc) ,
706765 BytesProbieren Sie es online!
Um weitere 2 Bytes zu sparen, ist der zurückgegebene Wahrheitswert nicht mehr 1, sondern die Zahl selbst.
quelle
Oktave ,
494744 BytesProbieren Sie es online!
Erläuterung:
Der Versuch, die Operation in einem Bereich auszuführen, ist umständlich und lang, da
num2str
eine Zeichenfolge mit Leerzeichen als Trennzeichen zurückgegeben wird, wenn mehr als die eingegebene Zahl vorhanden ist. Das Subtrahieren von 48 würde also etwa ergeben:1 -16 -16 2 -16 -16 3 -16 -16 4
für einen Eingabebereich 1 ... 4 . Um all das loszuwerden, sind-16
viele Bytes erforderlich.Deshalb machen wir das mit einer Schleife mit
arrayfun
. Für jede der Zahlen k = 1 .. x , wobei x die Eingabe ist, addieren wirk
und ihre Ziffernsumme und subtrahierenx
. Dies gibt ein Array mit dem Ergebnis dieser Operation für jede der Zahlen in k zurück . Wenn eine der Zahlen im Array eine Null ist, ist die Zahl keine Selbstzahl.Für Eingänge
20
und21
sind die Ausgänge:Es gibt nur Nicht-Null-Elemente für die Eingabe
20
und mindestens ein Nicht-Null-Element für die Eingabe21
. Das heißt, das20
ist eine Selbstzahl und21
nicht.Octave behandelt ein Array mit mindestens einer Null als falsch, wie im TIO-Link zu sehen ist.
quelle
MATL , 11 Bytes
Die Ausgabe ist ein nicht leeres Array, das wahr ist, wenn alle Einträge ungleich Null sind, und falsch, wenn es eine oder mehrere Nullen enthält.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle , einschließlich des Wahrheits- / Falschheitstests.
Erläuterung
Betrachten Sie die Eingabe
n = 10
als Beispiel.quelle
APL (Dyalog) , 14 Bytes
Probieren Sie es online!
Wie?
quelle
+/⍎¨∘⍕
->#+.⍎⍕
Gelee , 6 Bytes
Bei Eingabe von n wird [n] zurückgegeben, wenn n eine Selbstzahl ist, [], wenn nicht.
Probieren Sie es online!
Wie es funktioniert
quelle
Pari / GP , 32 Bytes
Probieren Sie es online!
quelle
Haskell , 46 Bytes
Probieren Sie es online!
quelle
J ,
28, 24, 22,21 Bytes-1 Byte danke an Conor O'Brien
-2 Bytes dank ngn
Probieren Sie es online!
Erläuterung:
i.
eine Liste 0 .. n-1( )"+
für jedes Element in der Liste.,.&.":
konvertiere es in eine Liste von Ziffern,1#
finde ihre Summe+
und füge es dem Gegenstand hinzu$@-.
schließe die Liste aus dem Argument aus und finde die Formquelle
"0 i.
kann sein"+i.
(-1 Byte).-.@e.
->$@-.
[:(
)"+i.
->(
)"+@i.
Python 2,
7066 BytesBEARBEITEN: -4 dank @ user56656
quelle
`i`
stattstr(i)
4 Bytes speichern.[
und]
innerhalb dessum
lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
Pyth , 8 Bytes
Testsuite.
Wenn das Austauschen von Wahrheits- / Falschwerten zulässig ist, können wir das löschen
!
und stattdessen 7 Bytes abrufen . Einer von Sok Vorschlägen hat mir geholfen, 2 Bytes Golf zu spielen.Erläuterung
quelle
.AmnQ+dsjdT
, ich hatte keine Ahnung/
. Ich habe Pyth anscheinend schon lange nicht mehr richtig benutzt! +1/
zählt grundsätzlich die Vorkommen eines Elements in einer Liste. Ich kann auch benutzen}
, um zu testen, ob ein Objekt in einer Liste erscheint, aber ich denke, das ist die gleiche Anzahl von Bytes.S
ist nicht erforderlich - die Eingabe wird eine positive Ganzzahl sein, also0
wird es kein Problem sein , in der Zuordnungsliste zu sein? Zumindest scheint es für die gegebenen Testfälle zu funktionieren.+sjdT
hinzufügensjdT
zud
? Ich habe so etwas noch nie gesehenPerl 6 ,
3933 BytesVersuch es!
Ein leerer Block mit einem impliziten einzelnen Parameter, der wie folgt aufgerufen wird:
Seitdem
n + digits(n) >= n
können wir nur die kolumbianische Zahl für alle Zahlen bis zu unserem Abfragewert berechnen und prüfen, ob eine davon übereinstimmt. Dies berechnet also die kolumbianische Zahl für eine bestimmte Eingabe:Was wir auf alle Werte anwenden, bis zu unserem Ziel:
Aber es ist uns nur wichtig, ob einer von ihnen übereinstimmt, und nicht, was diese Werte sind, also können wir, wie von @nwellenhof hervorgehoben, Folgendes sagen:
Der Rest ist nur Nötigung zum Narren und Einwickeln in einen Block.
39 Bytes
TIO-Testlink von @Emigna
@nwellenhof wies darauf hin, dass mit grep 6 Bytes gespart würden!
quelle
{!grep $_,map {$_+[+] .comb},^$_}
für 33 Bytes.Python 3 ,
60,56,55, 54 BytesProbieren Sie es online!
-4 Verwenden Sie all inverse anstelle von
-1, indem Sie! = In ^ by @ jonathan-allan
-1 ändern, indem Sie Mengen von @ovs verwenden
quelle
Japt
-d!
, 6 BytesVersuch es
Original, 8 Bytes
Gibt die eingegebene Nummer für truthy oder zurück
0
Falsch" zurück. Wenn nur das leere Array in JavaScript falsch wäre, könnten dies 7 Bytes sein.Versuch es
Erläuterung
Alternative
Versuch es
quelle
Netzhaut , 55 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Eingabe
x
in Unary konvertieren .Erstellen Sie einen Bereich von
x
bis1
.Suffixieren Sie den Dezimalwert jedes Werts
n
mit seinem unären Wert.Machen Sie eine Kopie von
x
.Konvertieren Sie jede Dezimalstelle von
n
in unär, und fügen Sie die Ziffern der vorhandenen Kopie von hinzun
.Überprüfen Sie, ob
x
in einem der Ergebnisse angezeigt wird.Kehre das Ergebnis um.
quelle
JavaScript (ES6),
5251 Bytes1 Byte dank @ l4m2 eingespart
Gibt 0 oder 1 zurück .
Probieren Sie es online!
quelle
n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
Haskell ,
63-58BytesProbieren Sie es online!
quelle
Perl 5
-a
, 34 BytesProbieren Sie es online!
quelle
Ruby , 38 Bytes
Probieren Sie es online!
quelle
Retina , 24 Bytes
Probieren Sie es online!
Könnten 18 Bytes sein, wenn die Eingabe unär ist, aber die andere Retina-Antwort verwendet auch Dezimalzahlen, so dass ich angenommen habe, dass die Verwendung von Dezimalzahlen für einen faireren Vergleich sorgen würde.
Erläuterung
Wandelt die Eingabe in eine unäre Zahl um und verwendet sie
_
als unäre Ziffer.Fügen Sie an jeder Position in der Zeichenfolge (dh am Anfang, am Ende und zwischen jedem Zeichenpaar) Folgendes ein:,
$.`
die Länge des Präfixes (oder die mit Nullen versehene Position der Übereinstimmung)¶
, einen Zeilenumbruch$`
, das Präfix selbst (dh eine unäre Darstellung der nullindizierten Position). ZB wenn die Eingabe wäre3
und wir die unäre Darstellung hätten___
, würde dies ergeben:Mit anderen Worten, wir erhalten eine Zeile für jede Zahl von 0 bis zur Eingabe (einschließlich), die sowohl eine unäre als auch eine dezimale Darstellung dieser Zahl enthält.
Wir konvertieren jede Ziffer in eine unäre Zahl, wodurch die Ziffernsumme in jeder Zeile effektiv berechnet und der Zahl selbst hinzugefügt wird (alles in einer unären Zahl).
Deduplizieren Sie Zeilen. Dies löscht keine doppelten Zeilen, sondern löscht sie nur in leere Zeilen. Wenn also eine Zahl von 0 bis zur Eingabe plus deren Ziffernsumme der Eingabe entspricht, wird die letzte Zeile gelöscht. Ansonsten bleibt die letzte Zeile bestehen.
Überprüfen Sie, ob sich in der letzten Zeile noch ein Zeichen befindet. Wir können nicht verwenden
$
, da dies auch vor einem nachgestellten Zeilenumbruch passt (genau dort, wo wir nicht hinschauen möchten).quelle
Bash + GNU Coreutils, 91 Bytes
Gibt wahr oder falsch zurück.
quelle
Kotlin , 48 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Add ++ , 27 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Elixier ,
6665 BytesProbieren Sie es online!
quelle
Stax , 8 Bytes
Führen Sie es aus und debuggen Sie es
Erläuterung
ASCII-Äquivalent:
fcE+|+x=
ist ein Stax-Programm, das alle Zahlen ausgibt, deren Summe der sich selbst hinzugefügten Ziffern der Eingabe entspricht. Zum Beispiel für101
die Ausgabe wäre91
und100
, jeweils in einer eigenen Zeile.Führen Sie es aus und debuggen Sie es
quelle
Pyt , 7 Bytes
Probieren Sie es online!
Wenn das Austauschen von Wahrheits- / Falschwerten zulässig ist,
¬
kann das Ende für 6 Byte gelöscht werden.Erläuterung:
quelle
J , 20 Bytes
Probieren Sie es online!
quelle