Si vous entrez un nombre entier positif , votre tâche consiste à produire une valeur de vérité si le nombre est divisible par le double de la somme de ses chiffres et une valeur de fausseté sinon ( OEIS A134516 ). En d'autres termes:
(sum_of_digits)*2 | number
Au lieu de valeurs vérité / fausseté pour les cas vrais et faux, vous pouvez spécifier un ensemble fini de valeurs pour le cas vrai / faux et leur complément aux autres valeurs. Pour un exemple simple, vous pouvez utiliser
0
pour le cas réel et tous les autres nombres pour le casse faux (ou vice versa, si vous voulez).Les règles d'entrée et de sortie standard s'appliquent. Les failles par défaut s'appliquent également.
Vous pouvez prendre l’entrée sous forme d’entier ou sous forme de représentation sous forme de chaîne de cet entier.
C'est du code-golf , d'où le code le plus court en octets gagne!
Je suis nouveau à PPCG, alors j'aimerais que vous publiez une explication si c'est possible.
Cas de test
Entrée - Sortie - (Raison) 80 - Vérité - (16 divise 80) 100 - Vérité - (2 divise 100) 60 - Vérité - (12 divise 60) 18 - Vérité - (18 divides 18) 12 - Vérité - (6 divides 12) 4 - Falsy - (8 ne divise pas 4) 8 - Falsy - (16 ne divise pas 8) 16 - Falsy - (14 ne divise pas 16) 21 - Falsy - (6 ne divise pas 21) 78 - Falsy - (30 ne divise pas 78) 110 - Falsy - (4 ne meurt pas 110) 111 - Falsy - (6 ne divise pas 111) 390 - Falsy - (24 ne divise pas 390)
Réponses:
Neim , 3 octets
Explication:
Essayez-le en ligne!
Version détaillée
la source
JavaScript (ES6),
312927 octetsPrend l'entrée sous forme de chaîne. Retourne zéro pour la vérité et non nul pour la fausseté.
Commenté
Cas de test
Afficher l'extrait de code
la source
C #, 46 octets
Version complète / formatée:
la source
Rétine ,
3827 octets-11 octets et correction d'une erreur de code grâce à @MartinEnder
Essayez-le en ligne!
Imprime 1 si divisible, 0 sinon
Explication (j'espère que j'ai bien compris)
Ajoute l'entrée entière, plus une nouvelle ligne, plus l'entrée encore
Convertit chaque correspondance en unary (soit la seconde ligne entière qui est l'entrée d'origine, soit chaque chiffre de la première ligne)
Vérifiez si la première ligne (la somme des chiffres doublés) est un diviseur de la deuxième ligne
la source
MATL , 7 octets
Sorties
0
si divisible, entier positif sinon. Plus précisément, il sort le reste de la division du nombre par deux fois la somme de ses chiffres.Essayez-le en ligne!
Explication
la source
05AB1E ,
54 octets-1 octet grâce à Okx
Essayez-le en ligne!
Vous pouvez également supprimer le dernier Ö pour obtenir 0 pour la vérité et quelque chose d'autre pour la fausseté, qui ne donne que 3 octets, mais pour moi, cela ne semble tout simplement pas correspondre à la définition.
Explication
la source
%_
parÖ
.Code machine x86-64, 24 octets
Le code ci-dessus définit une fonction dans le code machine x86 64 bits qui détermine si la valeur d'entrée est divisible par le double de la somme de ses chiffres. La fonction est conforme à la convention d'appel System V AMD64, de sorte qu'elle peut être appelée à partir de pratiquement n'importe quel langage, comme s'il s'agissait d'une fonction C.
Il faut un seul paramètre en entrée via le
EDI
registre, conformément à la convention d'appel, qui est le nombre entier à tester. (Ceci est supposé être un entier positif , compatible avec les règles de challenge, et est nécessaire au bon fonctionnement de l'CDQ
instruction utilisée.)Il retourne son résultat dans le
EAX
registre, encore une fois, conformément à la convention d'appel. Le résultat sera 0 si la valeur en entrée était divisible par la somme de ses chiffres et non nul sinon. (Fondamentalement, un booléen inverse, exactement comme dans les règles de challenge.)Son prototype C serait:
Voici les instructions non assemblées du langage d'assemblage, annotées avec une brève explication du but de chaque instruction:
Dans le premier bloc, nous effectuons une initialisation préliminaire des registres:
PUSH
+ lesPOP
instructions sont utilisées comme moyen lent mais court d'initialisationESI
à 10. Cela est nécessaire car l'DIV
instruction sur x86 nécessite un opérande de registre. (Aucune forme ne divise par une valeur immédiate, disons 10.)XOR
est utilisé comme un moyen rapide et rapide pour effacer leECX
registre. Ce registre servira d’accumulateur à l’intérieur de la prochaine boucle.EDI
) est créée et stockée dansEAX
laquelle elle sera compressée au fur et à mesure de notre progression dans la boucle.Ensuite, nous commençons à boucler et à additionner les chiffres de la valeur d’entrée. Ceci est basé sur l’
DIV
instruction x86 , qui diviseEDX:EAX
par son opérande et renvoie le quotient dansEAX
et le reste dansEDX
. Ce que nous ferons ici est de diviser la valeur d’entrée par 10, de sorte que le reste soit le chiffre de la dernière position (que nous ajouterons à notre registre accumulateur,ECX
) et le quotient, les chiffres restants.CDQ
instruction est un moyen simple de définir la valeurEDX
sur 0. En fait, elle signe-étend la valeurEAX
àEDX:EAX
, qui correspondDIV
au dividende. En fait, nous n’avons pas besoin de l’extension de signe ici, car la valeur en entrée est non signée, maisCDQ
vaut 1 octet, par opposition àXOR
de clearEDX
, qui serait de 2 octets.DIV
IdeEDX:EAX
parESI
(10).EDX
) est ajouté à l'accumulateur (ECX
).EAX
registre (le quotient) est testé pour voir s'il est égal à 0. Si c'est le cas, nous l'avons fait à travers tous les chiffres et nous échouons. Sinon, nous avons toujours plus de chiffres à additionner, alors nous retournons au début de la boucle.Enfin, une fois la boucle terminée, nous implémentons
number % ((sum_of_digits)*2)
:L'
LEA
instruction est utilisée comme un moyen rapide de multiplierECX
par 2 (ou, de manière équivalente, de s'ajouterECX
à elle-même) et de stocker le résultat dans un registre différent (dans ce cas,EAX
).(Nous aurions aussi pu faire
add ecx, ecx
+xchg ecx, eax
; les deux sont de 3 octets, mais l'LEA
instruction est plus rapide et plus typique.)CDQ
nouveau une préparation pour la division. Parce queEAX
sera positif (c'est-à-dire non signé), cela a pour effet de réduire à zéroEDX
, comme avant.EDX:EAX
par la valeur d'entrée (une copie non altérée de celle-ci réside toujours dansEDI
). Cela équivaut à modulo, le reste étant enEDX
. (Le quotient est également ajoutéEAX
, mais nous n'en avons pas besoin.)XCHG
échangeons le contenu deEAX
etEDX
. Normalement, vous feriezMOV
ici, mais ceXCHG
n’est qu’un octet (bien que plus lent). Parce queEDX
contient le reste après la division, il sera 0 si la valeur est divisible de façon égale ou non nulle sinon. Ainsi, lorsque nousRET
urn,EAX
(le résultat) est égal à 0 si la valeur entrée est divisible par le double de la somme de ses chiffres, ou différente de zéro dans le cas contraire.J'espère que cela suffit pour une explication.
Ce n'est pas l'entrée la plus courte, mais bon, on dirait qu'elle bat presque toutes les langues autres que le golf! :-)
la source
Japt ,
74 octetsPrend l'entrée sous forme de chaîne. Sorties
0
pourtrue
ou un plus grand nombre de que0
pourfalse
qui, à partir d' autres solutions, semblent valides. Sinon, faites le moi savoir et je reviens en arrière.Essaye-le
Explication
Entrée implicite de chaîne
U
."390"
Répétez
U
deux fois."390390"
Diviser en tableau de caractères individuels.
["3","9","0","3","9","0"]
Réduisez en faisant la somme, en transformant automatiquement chaque caractère en un entier du processus.
24
Obtenez le reste de la division
U
par le résultat, ainsi que la conversion automatiqueU
en un entier du processus. Sortie implicite de l'entier résultant.6 (=false)
la source
C89,
5553 octets(Merci à Steadybox!
Il faut une seule entrée,
x
qui est la valeur à tester. Il renvoie 0 six
est divisible par le double de la somme de ses chiffres, ou non nul sinon.Essayez-le en ligne!
Ungolfed:
Comme vous pouvez le constater, cela tire parti des règles implicit-int de C89. Les variables globales
s
ett
sont implicitement déclarées commeint
s. (Ils sont également implicitement initialisés à 0 car ils sont globaux, mais nous ne pouvons en tirer parti si nous voulons que la fonction puisse être appelée plusieurs fois.)De même, la fonction,,
f
prend un seul paramètre,x,
qui est implicitement unint
, et renvoie unint
.Le code à l’intérieur de la fonction est assez simple, bien que le
for
boucle paraisse terriblement étrange si vous ne connaissez pas la syntaxe. Fondamentalement, un en-for
tête de boucle en C contient trois parties:Dans la section "initialisation", nous avons initialisé nos variables globales. Cela fonctionnera une fois, avant que la boucle ne soit entrée.
Dans la section "condition de boucle", nous avons spécifié à quelle condition la boucle doit continuer. Cela devrait être évident.
Dans la section "incrément", nous avons essentiellement mis du code arbitraire, car il sera exécuté à la fin de chaque boucle.
Le but plus important de la boucle est de parcourir chaque chiffre de la valeur en entrée, en les ajoutant
s
. Enfin, une fois la boucle terminée,s
on double et on prend modulox
pour voir si elle est divisible. (On trouvera une explication meilleure et plus détaillée de la logique ici dans mon autre réponse , sur laquelle celle-ci est basée.)Version lisible par l'homme:
la source
t
plutôtt>0
que la condition de boucle .Brachylog , 8 octets
Essayez-le en ligne!
Explication
la source
Python 2 ,
3432 octets-2 octets grâce à @Rod
Essayez-le en ligne!
la source
<1
.Mathematica, 26 octets
Aucune idée pourquoi
∣
a une priorité plus élevée que la multiplication ...la source
PHP , 41 octets
affiche zéro si divisible, entier positif sinon.
Essayez-le en ligne!
la source
$a=10
, mais vous avez oublié de compter cela dans votre nombre d'octets$argn
est disponible avec l' option-F
(dans ce cas) ou l'-R
option-F
. Mais cela ne se voit pas dans votre TIO (cela supporte-t-il l'écho de STDIN?).-F
option au lieu de-R
php.net/manual/en/features.commandline.options.php Si vous aviez trouvé un meilleur moyen de faire la même chose comme dans la commande ligne faites le moi savoirExcel, 63 octets
La somme des chiffres est le bit le plus long.
la source
Perl 6 , 19 octets
Essayez-le en ligne!
la source
Husk ,
9 à8 octetsMerci à Leo d’avoir économisé 1 octet.
Essayez-le en ligne!
Explication
la source
Haskell,
383742 bytesThanks to Zgarb for golfing off 1 byte
Try it online!
Takes input as a string; returns 0 if divisible and nonzero otherwise.
la source
(:[])
can bepure
.Python 3, 35 bytes
la source
=
and after the)
inint(c)
. In addition sincesum
can take a generator as an argument you can remove the[..]
inside it. If you have any additional questions feel free to ping me.int(c)for c in a
could also bemap(int,a)
, to save a few bytes.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 bytes-5 thanks to @Oki
This is made trickier by the fact that there is no concise way to sum integer digits in TI-BASIC. Returns
0
forTrue
, and a different number forFalse
.Explanation:
la source
10^-randIntNoRep(1,1+int(log(Ans
does the same asseq(10^(~A-1),A,0,log(Ans
in fewer bytes as order doesnt matter (Assuming version 2.55MP)Braingolf,
1312 bytesTry it online!
Outputs 0 for truthy, any other number for falsey.
Explanation
la source
Japt, 7 bytes
Returns
1
fortrue
,0
forfalse
Try it online!
Explanation
la source
Haskell, 49 Bytes
Usage
Try it online!
la source
Java, 66 bytes
-1 byte thanks to Olivier
Ungolfed & explanation:
la source
int
instead ofbyte
to save... a byte.a%i*2
that's parsed as(a%i)*2
since modulus and multiplication have the same order.J, 15 bytes
0 indicates truthy, nonzero indicates falsy.
Explanation
la source
@
or[:
!|~2*1#.,.&.":
for 13 bytes.Ohm, 5 bytes
Try it online!
la source
tcl, 45
demo
la source
0==
with1>
.Haskell,
3534 bytesTry it online!
Returns '0' in the true case, the remainder otherwise.
Haskell, pointfree edition by nimi, 34 bytes
Try it online!
la source
mod<*>(2*).sum.map(read.pure).show
PHP, 44 bytes
Run like this:
Explanation
Iterates over the digits to compute the total, then outputs the modulo like most answers.
la source
Java (OpenJDK 8),
5553 bytesTry it online!
A return value of
0
means truthy, anything else means falsy.Since my comment in Okx's answer made no ripple, I deleted it and posted it as this answer, golfed even a bit more.
Further golfing thanks to @KrzysztofCichocki and @Laikoni who rightfully showed me I needn't answer a truthy/falsy value, but any value as long as I describe the result.
la source
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 bytesTry it online!
The TIO link have more comments from me, so it is partially easier to read.
Truthy/Falsey: Truthy (divisible) if the second number is equal to the third number, falsy otherwise. So both the truthy and falsy set are infinite, but I suppose that should be allowed. +10 byte if that is not.
Note: Leading/trailing newlines/whitespaces are not allowed in input.
la source