Bei einer positiven ganzen Zahl als Eingabe, ist Ihre Aufgabe , ein truthy Wert ausgibt , wenn die Zahl teilbar durch das Doppelte der Summe ihrer Ziffern und ein falsy Wert sonst ( OEIS A134516 ). Mit anderen Worten:
(sum_of_digits)*2 | number
Anstelle wahrer / falscher Werte für die Fälle true und false können Sie stattdessen eine beliebige endliche Menge von Werten für den Fall true / false angeben und diese Werte zu den anderen Werten ergänzen. Für ein einfaches Beispiel können Sie
0
für den wahren Fall und alle anderen Zahlen für den falschen Fall verwenden (oder umgekehrt, wenn Sie möchten).Es gelten die Standard-Ein- und Ausgaberegeln. Es gelten auch Standardlücken.
Sie können Eingaben als Ganzzahl oder als Zeichenfolgendarstellung dieser Ganzzahl übernehmen.
Dies ist Code-Golf , daher gewinnt der kürzeste Code in Bytes!
Ich bin neu bei PPCG und möchte, dass Sie eine Erklärung abgeben, wenn dies möglich ist.
Testfälle
Eingabe - Ausgabe - (Grund) 80 - Wahrheit - (16 teilt 80) 100 - Wahrheit - (2 teilt 100) 60 - Wahrheit - (12 teilt 60) 18 - Wahrheit - (18 teilt 18) 12 - Wahrheit - (6 teilt 12) 4 - Falsy - (8 teilt 4 nicht) 8 - Falsy - (16 teilt 8 nicht) 16 - Falsy - (14 teilt 16 nicht) 21 - Falsy - (6 teilt 21 nicht) 78 - Falsch - (30 teilt 78 nicht) 110 - Falsy - (4 dide nicht 110) 111 - Falsy - (6 teilt 111 nicht) 390 - Falsy - (24 teilt 390 nicht)
Antworten:
Neim , 3 Bytes
Erläuterung:
Probieren Sie es online!
Ausführliche Version
quelle
JavaScript (ES6),
312927 ByteÜbernimmt die Eingabe als Zeichenfolge. Gibt null für wahr und ungleich null für falsch zurück.
Kommentiert
Testfälle
Code-Snippet anzeigen
quelle
C #, 46 Bytes
Voll / Formatierte Version:
quelle
Retina ,
3827 Bytes-11 Bytes und behebt einen Fehler mit dem Code dank @MartinEnder
Probieren Sie es online!
Gibt 1 aus, wenn teilbar, sonst 0
Erklärung (hoffe ich habe das richtig verstanden)
Fügt die gesamte Eingabe plus eine neue Zeile plus die Eingabe erneut hinzu
Konvertiert jede Übereinstimmung in Unary (entweder die gesamte zweite Zeile, die die ursprüngliche Eingabe ist, oder jede Ziffer in der ersten Zeile)
Überprüfen Sie, ob die erste Zeile (die Summe aus zwei Ziffern) ein Teiler der zweiten Zeile ist
quelle
MATL , 7 Bytes
Gibt aus,
0
wenn teilbar, ansonsten positive Ganzzahl. Insbesondere gibt es den Rest der Division der Zahl durch die doppelte Summe ihrer Ziffern aus.Probieren Sie es online!
Erläuterung
quelle
05AB1E ,
54 Bytes-1 Byte dank Okx
Probieren Sie es online!
Sie können auch das letzte Ö entfernen, um 0 für truthy und etwas anderes für falsy zu erhalten, was nur 3 Bytes ergibt, aber für mich scheint das einfach nicht angemessen zu der Definition zu passen.
Erläuterung
quelle
%_
mitÖ
.x86-64-Maschinencode, 24 Byte
Der obige Code definiert eine Funktion im 64-Bit-x86-Maschinencode, die bestimmt, ob der Eingabewert durch die doppelte Summe seiner Ziffern teilbar ist. Die Funktion entspricht der System V AMD64-Aufrufkonvention, sodass sie aus praktisch jeder Sprache aufgerufen werden kann, als wäre sie eine C-Funktion.
Es wird ein einzelner Parameter als Eingabe über das
EDI
Register gemäß der aufrufenden Konvention verwendet, bei der es sich um die zu testende Ganzzahl handelt. (Es wird angenommen, dass dies eine positive Ganzzahl ist, die den Herausforderungsregeln entspricht und für dieCDQ
Anweisung erforderlich ist, die wir verwenden, um korrekt zu arbeiten.)Es gibt sein Ergebnis
EAX
wieder gemäß der Aufrufkonvention im Register zurück. Das Ergebnis wird 0 sein , wenn der Eingangswert ist durch die Summe ihrer Ziffern teilbar und nicht-Null sonst. (Grundsätzlich ein inverser Boolescher Wert, genau wie das in den Herausforderungsregeln angegebene Beispiel.)Sein C-Prototyp wäre:
Hier sind die Anweisungen in Assemblersprache ohne Golf, die mit einer kurzen Erläuterung des Zwecks der einzelnen Anweisungen versehen sind:
Im ersten Block führen wir eine vorläufige Initialisierung der Register durch:
PUSH
+POP
-Anweisungen werden als langsamer, aber kurzer Weg zur InitialisierungESI
auf 10 verwendet. Dies ist erforderlich, da dieDIV
Anweisung auf x86 einen Registeroperanden erfordert. (Es gibt keine Form, die durch einen unmittelbaren Wert von beispielsweise 10 dividiert.)XOR
wird als kurzer und schneller Weg zum Löschen desECX
Registers verwendet. Dieses Register dient als "Akkumulator" innerhalb der anstehenden Schleife.EDI
) erstellt und in gespeichertEAX
, die beim Durchlaufen der Schleife gelöscht wird.Dann beginnen wir, die Ziffern im Eingabewert zu schleifen und zu summieren. Dies basiert auf dem x86-
DIV
Befehl, derEDX:EAX
durch seinen Operanden dividiert und den Quotienten inEAX
und den Rest in zurückgibtEDX
. Was wir hier tun, ist, den Eingabewert durch 10 zu teilen, so dass der Rest die Ziffer an der letzten Stelle ist (die wir unserem Akkumulatorregister hinzufügenECX
) und der Quotient die verbleibenden Ziffern sind.CDQ
Befehl ist eine kurze Methode, umEDX
auf 0 zu setzen. Er erweitert den Wert tatsächlichEAX
aufEDX:EAX
, wasDIV
als Dividende verwendet wird. Wir brauchen hier eigentlich keine Vorzeichenerweiterung, da der Eingabewert nicht vorzeichenbehaftet ist, sondernCDQ
1 Byte beträgt, im Gegensatz zur Verwendung vonXOR
to clearEDX
, was 2 Byte entsprechen würde.DIV
ideEDX:EAX
durchESI
(10).EDX
) wird zum Akku (ECX
) hinzugefügt .EAX
Register (der Quotient) wird getestet, um festzustellen, ob es gleich 0 ist. Wenn ja, haben wir alle Ziffern durchlaufen und fallen durch. Wenn nicht, haben wir noch mehr Ziffern zu summieren, und kehren zum oberen Ende der Schleife zurück.Nachdem die Schleife beendet ist, implementieren wir
number % ((sum_of_digits)*2)
:Der
LEA
Befehl wird verwendet, umECX
mit 2 zu multiplizieren (oderECX
sich selbst zu addieren ) und das Ergebnis in einem anderen Register zu speichern (in diesem FallEAX
).(Wir hätten auch
add ecx, ecx
+ machen könnenxchg ecx, eax
; beide sind 3 Bytes, aber dieLEA
Anweisung ist schneller und typischer.)CDQ
bereiten wir uns erneut auf die Teilung vor. DaEAX
positiv (dh ohne Vorzeichen) ist, bewirkt diesEDX
wie zuvor eine Nullsetzung .EDX:EAX
durch den Eingabewert (eine ungestörte Kopie davon befindet sich noch inEDI
). Dies ist äquivalent zu Modulo, mit dem Rest inEDX
. (Der Quotient wird ebenfalls eingegebenEAX
, aber wir brauchen ihn nicht.)XCHG
tauschen wir die Inhalte vonEAX
und ausEDX
. Normalerweise würden Sie eineMOV
hier machen, aberXCHG
ist nur 1 Byte (wenn auch langsamer). DaEDX
der Rest nach der Division enthalten ist, ist er 0, wenn der Wert gleichmäßig teilbar war, oder ansonsten ungleich Null. Wenn wir alsoRET
urnieren, istEAX
(das Ergebnis) 0, wenn der Eingabewert durch die doppelte Summe seiner Ziffern teilbar war, oder andernfalls ungleich Null.Hoffentlich reicht das für eine Erklärung.
Dies ist nicht der kürzeste Eintrag, aber hey, es sieht so aus, als ob er fast alle Nicht-Golf-Sprachen übertrifft! :-)
quelle
Japt ,
74 BytesÜbernimmt die Eingabe als Zeichenfolge. Ausgaben
0
fürtrue
oder eine Zahl größer als0
fürfalse
, die aus anderen Lösungen als gültig erscheinen. Wenn nicht, lass es mich wissen und ich mache ein Rollback.Probier es aus
Erläuterung
Implizite Eingabe eines Strings
U
."390"
Wiederholen Sie
U
zweimal."390390"
Aufteilen in eine Reihe einzelner Zeichen.
["3","9","0","3","9","0"]
Reduzieren durch Summieren, wobei jedes Zeichen automatisch in eine Ganzzahl umgewandelt wird.
24
Erhalten Sie den Rest der Division
U
durch das Ergebnis, und wandeln Sie es dabei automatischU
in eine Ganzzahl um. Die resultierende Ganzzahl implizit ausgeben.6 (=false)
quelle
C89,
5553 Bytes(Danke an Steadybox!
Es wird eine einzelne Eingabe benötigt,
x
der zu testende Wert. Es gibt 0 zurück, wennx
es gleichmäßig durch die doppelte Summe seiner Ziffern teilbar ist, oder andernfalls ungleich Null.Probieren Sie es online!
Ungolfed:
Wie Sie sehen, nutzt dies die impliziten Int-Regeln von C89. Die globalen Variablen
s
undt
werden implizit alsint
s deklariert . (Sie werden auch implizit mit 0 initialisiert, da sie global sind. Dies können wir jedoch nicht nutzen, wenn die Funktion mehrmals aufgerufen werden soll.)In ähnlicher Weise akzeptiert die Funktion
f
einen einzelnen Parameter,x,
der implizit ein istint
, und gibt einen zurückint
.Der Code innerhalb der Funktion ist ziemlich einfach, obwohl die
for
Schleife furchtbar seltsam aussehen wird, wenn Sie mit der Syntax nicht vertraut sind. Grundsätzlich besteht einfor
Schleifenkopf in C aus drei Teilen:Im Abschnitt "Initialisierung" haben wir unsere globalen Variablen initialisiert. Dies wird einmal ausgeführt, bevor die Schleife betreten wird.
Im Abschnitt "Schleifenbedingung" haben wir festgelegt, unter welcher Bedingung die Schleife fortgesetzt werden soll. Dies sollte offensichtlich sein.
Im Abschnitt "increment" haben wir im Grunde beliebigen Code eingefügt, da dieser am Ende jeder Schleife ausgeführt wird.
Der größere Zweck der Schleife besteht darin, jede Ziffer im Eingabewert zu durchlaufen und zu addieren
s
. Schließlich, nachdem die Schleife beendet ist,s
wird sie verdoppelt und modulo genommen, umx
zu sehen, ob sie gleichmäßig teilbar ist. (Eine bessere, detailliertere Erklärung der Logik hier findet sich in meiner anderen Antwort , auf der diese basiert.)Für Menschen lesbare Version:
quelle
t
stattt>0
als Schleifenbedingung verwenden .Brachylog , 8 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 2 ,
3432 Bytes-2 Bytes dank @Rod
Probieren Sie es online!
quelle
<1
.Mathematica, 26 Bytes
Keine Ahnung, warum
∣
eine höhere Priorität hat als die Multiplikation ...quelle
PHP , 41 Bytes
Gibt Null aus, wenn teilbar, andernfalls positive Ganzzahl.
Probieren Sie es online!
quelle
$a=10
könntest es genauso gut benutzen , aber du hast vergessen, das für deine$argn
ist mit der-F
(in diesem Fall) oder-R
Option-F
. Dies spiegelt sich jedoch nicht in Ihrem TIO wider (unterstützt es das Echo von STDIN?).-F
Option anstelle von-R
php.net/manual/en/features.commandline.options.php verwenden würden line lass es mich wissenExcel, 63 Bytes
Das Summieren von Ziffern ist das langwierige Bit.
quelle
Perl 6 , 19 Bytes
Probieren Sie es online!
quelle
Schale ,
98 BytesDanke an Leo für das Speichern von 1 Byte.
Probieren Sie es online!
Erläuterung
quelle
Haskell ,
383742 BytesVielen Dank an Zgarb für das Golfen ab 1 Byte
Probieren Sie es online!
Nimmt die Eingabe als Zeichenfolge; Gibt 0 zurück, wenn teilbar, andernfalls ungleich Null.
quelle
(:[])
kann seinpure
.Python 3, 35 Bytes
quelle
=
und nach dem)
inint(c)
. Dasum
ein Generator als Argument verwendet werden kann, können Sie das[..]
Innere des Generators entfernen . Wenn Sie weitere Fragen haben, können Sie mich gerne anrufen.int(c)for c in a
könnte auch seinmap(int,a)
, ein paar bytes zu sparen.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 Bytes-5 danke an @Oki
Dies wird durch die Tatsache erschwert, dass es in TI-BASIC keinen präzisen Weg gibt, ganzzahlige Ziffern zu summieren . Gibt
0
fürTrue
und eine andere Zahl für zurückFalse
.Erläuterung:
quelle
10^-randIntNoRep(1,1+int(log(Ans
tut das gleiche wieseq(10^(~A-1),A,0,log(Ans
in weniger Bytes, da die Reihenfolge keine Rolle spielt (vorausgesetzt, Version 2.55MP)Braingolf ,
1312 BytesProbieren Sie es online!
Gibt 0 für Wahrheit aus, eine andere Zahl für Falsch.
Erläuterung
quelle
Japt , 7 Bytes
Rückgabe
1
fürtrue
,0
fürfalse
Probieren Sie es online!
Erläuterung
quelle
Haskell , 49 Bytes
Verwendungszweck
Probieren Sie es online!
quelle
Java , 66 Bytes
-1 Byte danke an Olivier
Ungolfed & Erklärung:
quelle
int
stattbyte
zu speichern ... ein Byte.a%i*2
analysiert,(a%i)*2
da Modul und Multiplikation dieselbe Reihenfolge haben.J, 15 Bytes
0 bedeutet Wahrhaftigkeit, ungleich Null bedeutet Falschheit.
Erläuterung
quelle
@
oder[:
!|~2*1#.,.&.":
für 13 Bytes.Ohm , 5 Bytes
Probieren Sie es online!
quelle
tcl, 45
Demo
quelle
0==
mit1>
.Haskell ,
3534 BytesProbieren Sie es online!
Liefert '0' im wahren Fall, der Rest sonst.
Haskell , pointfree edition von nimi, 34 bytes
Probieren Sie es online!
quelle
mod<*>(2*).sum.map(read.pure).show
PHP, 44 Bytes
Laufen Sie wie folgt:
Erläuterung
Durchlaufen Sie die Ziffern, um die Summe zu berechnen, und geben Sie das Modulo wie die meisten Antworten aus.
quelle
Java (OpenJDK 8) ,
5553 BytesProbieren Sie es online!
Ein Rückgabewert von
0
bedeutet Wahrheit, alles andere bedeutet Falsch.Da mein Kommentar in Okx 'Antwort keine Kräuselung verursachte, löschte ich ihn und postete ihn als diese Antwort, spielte sogar noch ein bisschen mehr Golf.
Weiteres Golfen dank @KrzysztofCichocki und @Laikoni, die mir zu Recht gezeigt haben, dass ich nicht auf einen wahrheitsgemäßen / falschen Wert antworten muss, sondern auf einen beliebigen Wert, solange ich das Ergebnis beschreibe.
quelle
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Mini-Flak,
296292 BytesProbieren Sie es online!
Der TIO-Link hat mehr Kommentare von mir, daher ist es teilweise einfacher zu lesen.
Wahrheit / Falsch: Wahrheit (teilbar), wenn die zweite Zahl gleich der dritten Zahl ist, sonst falsch. Also sind sowohl die Wahrheit als auch die Falschheit unendlich, aber ich denke, das sollte erlaubt sein. +10 Byte, wenn dies nicht der Fall ist.
Hinweis: Führende / nachfolgende Zeilenumbrüche / Leerzeichen sind in der Eingabe nicht zulässig.
quelle