Mon ami et moi travaillions sur un laboratoire dans notre classe AP Computer Science et avons décidé de coder le golf comme l’un des problèmes étant donné que nous avions encore la moitié de la classe libre après avoir terminé. Voici la question:
Soit un nombre n, n est-il divisible par chacun de ses chiffres?
Par exemple, 128 réussira ce test - il est divisible par 1,2 et 8. Tout nombre avec un zéro le disqualifie automatiquement. Bien que vous puissiez utiliser d'autres langages et proposer des solutions avec eux si vous le souhaitez, nous sommes particulièrement intéressés par la capacité des personnes compactes à créer le programme en Java, car c'est le langage que nous utilisons dans la classe. Jusqu'ici, nous avons tous les deux 51. Voici mon code actuel:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Exigences
La signature de la méthode peut être celle que vous souhaitiez. Il suffit de compter le corps de la fonction. Assurez-vous cependant que la méthode retourne une valeur booléenne et ne transmet qu'un paramètre numérique (pas une chaîne).
Le code doit pouvoir passer tous ces cas (pour rester conforme aux indications de la question d'origine, seules les valeurs booléennes vraies et fausses sont prises en compte si la langue prend en charge les valeurs booléennes. Si et seulement si votre langue n'a pas de variables booléennes peut représenter faux avec 0 et vrai avec n'importe quel entier non nul (de préférence 1 ou -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
De plus, nous ne comptons pas les espaces, alors n'hésitez pas à faire de même, à moins que les espaces ne soient essentiels au fonctionnement du programme (les nouvelles lignes en Java ne comptent pas, mais un seul espace sépare int
et x=1
compte.) Bonne chance !
true
et / ou les valeurs vérité / falsificationfalse
sont- elles également acceptables? 3. Lajava
balise ne s'applique pas vraiment ici, car le défi lui-même n'est pas lié à Java.0
chiffres qui soit un multiple de chacun d'eux), j'imagine que la plupart des réponses s'allongeraient simplement d'une manière inintéressante pour inclure un chèque. J'aime donc mieux le problème posé par le titre (divisible par ses chiffres, plutôt que d'être un multiple de ses chiffres, ce qui exclut 0).Réponses:
Perl 6, 13
Utilise la variable implicite
$_
-$_ %% .comb.all
est équivalent à$_ %% all($_.comb)
.%%
est l'opérateur "est divisible" etcomb
sans argument supplémentaire, retourne une liste des caractères d'une chaîne. Par exemple, si l'argument est 123, alors la fonction évaluelequel est
lecture automatique de jonction rend
lequel est
ce qui est faux dans un contexte booléen car c'est une jonction "tout" et il est évident que tous ses éléments ne sont pas vrais.
Il devrait être possible de contraindre la valeur renvoyée
Bool
et de masquer la jonction aux appelants en donnant la signature de fonctionsub golf($_ --> Bool())
, mais les contraintes dans les signatures de fonction ne fonctionnent pas encore dans Rakudo. La valeur de retour est toujours correctement true ou false, ce n'est tout simplement pasTrue
ouFalse
.la source
Bool
ajoutez simplementso
au début du codeso$_%%.comb.all
.C # et System.Linq - 26/40
Selon les règles, sans compter la déclaration de méthode elle-même.
Cela prouve une fois de plus que C # est le meilleur choix lorsque Java est envisagé ... Je gamine, je gamine!
Malheureusement, cette fonction (et de nombreuses autres réponses) ne produira pas des résultats corrects pour une entrée négative. Nous pouvons y remédier, mais la solution perd beaucoup de son charme (et passe à 46 caractères):
Edit : rasé un personnage avec la suggestion de Tim.
Edit : avec l’introduction de membres à corps d’ expression en C # 6, nous pouvons réduire cela davantage en supprimant
return
:pour un total de 26 caractères (à mon avis, le
=>
ne devrait pas être inclus, pas plus que les accolades). La version gérant les nombres négatifs peut être raccourcie de la même manière.la source
.0
? Il n'y a pas besoin de rien d'autre que du module entier.i % 0
aveci
un entier donne unDivideByZeroException
.48d
est le même que48.0
, mais un caractère de moins (d pour double).&
, précisément parce&
que ne court-circuite pas - vous obtiendrez une exception de division par zéro le%
. Nous pouvons résoudre ce problème en en faisant un double (avecd
), mais nous avons encore perdu un caractère.APL (
(apparemment les crochets ne comptent pas)1311)Explication:
⍎¨⍕⍵
: évalue chaque caractère dans la représentation sous forme de chaîne de⍵
⍵|⍨
: pour chacun de ceux-ci, trouver le modulo de celui-ci et⍵
0∧.=
: voir si tous sont égaux à0
Testcases:
la source
X%0
? sans jeter?0|X
donneX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 caractères
Vérifie si le nombre a des restes non nuls, modulo ses chiffres, et en affiche la négation. Zéro chiffre est traité étrangement: puisque le calcul
%0
provoque une erreur, les chiffres de0
sont remplacés par.3
, ce qui semble toujours donner un résultat différent de zéro à cause des inexactitudes en virgule flottante.Le corps de la fonction est composé de 32 caractères.
la source
Perl - 27 octets
Sans compter la signature de la fonction, comme indiqué.
Exemple d'utilisation:
Exemple de sortie:
Réponse à la spécification du problème: "Seules les valeurs booléennes vraies et fausses comptent. Les valeurs Truthy / Falsey ne comptent pas ."
Les sorties:
'True' et 'False' sont définis comme
1
et""
.Erratum:
Comme Brad Gilbert l'a fait remarquer à juste titre , perl définit true comme un scalaire qui est à la fois l'entier
1
et la chaîne"1"
, et false comme un scalaire qui est à la fois l'entier0
et la chaîne""
.la source
$_
:pop=~s///ger<1
. Je ne sais pas si le PO en conviendra1
et ce""
sont des résultats valables. Sinon, il peut être corrigé avec deux octets supplémentaires: il suffit d'ajouter|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
est de 26 octets, y compris le drapeau|0
et-p
. Vous n'êtes pas obligé d'utiliser une fonction.dualvar(1,'1')
anddualvar(0,'')
.SVIV
(int),SVNV
(double) etSVPV
(chaîne).'abc'
un nombre (en supposant que vous ayezuse warnings;
activé la fonction.)CJam,
11 à10 octetsCeci définit une fonction nommée
F
et supprime le bloc de la pile.Essayez-le en ligne.
Cas de test
Comment ça fonctionne
la source
JavaScript ES6,
393228 octetsMerci core1024 pour la suggestion de remplacer
(""+v).split("")
par[...""+v]
, et openorclose pour suggérer l'utilisation de laevery
fonction.La réponse actuellement ne contient pas un bit de mon code: O
Solution précédente
==""
n'est pas un moyen valable pour vérifier si un tableau est vide, puisque les[""]==""
retourstrue
, mais il est garanti que le tableau contiendra une chaîne non vide, donc cela fonctionne ici.Le reste est une conversion de type sténographie tout à fait standard en JavaScript.
la source
(""+v).split("")
par[...""+v]
.every
méthode?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
renvoieNaN
etNaN == false
, ainsi, dans votre cas, les numéros contenant 0, tels que10
, peuvent être renvoyéstrue
.Java 8, 46 octets (corps de la méthode)
Utiliser la conversion de Jeroen Mostert en double tour.
la source
Pyth, 12 octets
Ceci filtre les caractères de la chaîne pour qu’ils soient zéro (
!vT
) ou ne divisent pas l’entrée (%vzvT
), puis prend le pas logique de la liste résultante.Essayez-le ici.
la source
Ruby, 44 octets (corps de la fonction: 37)
A probablement le potentiel d'être joué au golf plus loin.
Entrée prise par la fonction
f
. Exemple d'utilisation:la source
.to_i
en.hex
, puisque les nombres à un chiffre sont les mêmes en base 16 et peuvent changer==0
en<1
.Python -
59504947 octetsJe suis sûr qu'il y a un moyen plus rapide ... ah bon.
Edit - Merci à FryAmTheEggman pour les astuces de golf.
Edit 2 - FryAmTheEggman peut aussi bien avoir écrit ceci à ce stade, oups
Edit 3 - Mains levées si vous ne saviez même pas que genexps était une chose. ...Juste moi?
la source
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. Et pas de problème :)all
méthode.1>n%int(c)
travailler?all(c>'0'and 0==n%int(c)for c in`n`)
fait exactement la même chose, avec 2 caractères de moins et même en sauvegardant l’allocation de la liste.Pyth 11
Ceci combine les réponses de @ isaacg et de @ xnor . Il filtre les chiffres de l'entrée en vérifiant la valeur de
input % (eval(current_digit) or .3)
. Ensuite, il vérifie si la chaîne résultante est vide ou non.Entré dans une autre paire de variantes de même longueur:
Essayez-le en ligne.
la source
Bash + coreutils, 44 octets
La définition complète de la fonction est:
Je ne suis pas sûr de savoir comment marquer cela car normalement les fonctions shell utilisent un seul ensemble
{}
ou()
contiennent le corps de la fonction. J'ai trouvé ici que je pourrais aussi utiliser double(())
pour contenir le corps de la fonction, ce qui provoque une expansion arithmétique, ce dont j'ai besoin ici. Donc, pour l'instant, je ne compte qu'une paire de ces crochets. Nous vous invitons à en discuter davantage.Sortie:
la source
true
/false
?J - 14 caractères
Le corps de fonction est la partie après le
=:
. Si nous voulons minimiser le nombre de caractères pour l'ensemble de la fonction, il s'agit du 15 caractères*/@(0=,.&.":|])
.,.&.":
est le moyen le plus court en J pour développer un nombre dans une liste de chiffres décimaux: convertir en chaîne, séparer les chiffres et reconvertir chaque chiffre en un nombre.,.&.":|]
prend le nombre d'entrée (]
) modulo (|
) ces chiffres.0*/@:=
renvoie vrai si tous les résultats étaient 0, sinon donne un faux.la source
Java -
121102977978 octetsJe sais juste que ça va se tasser plus tard. Tant pis.
Je reviendrai.
la source
Haskell -
1005438Toujours en train d'apprendre, critiques appréciées
la source
length
s, ils sont inutiles. 2) Remplacert
par sa définition. 3)elem y s
est inutile. 4)/='0'
peut être déplacé vers le filtre de gauche, à la place deelem y s
. 5) Dans ce cas,/='0'
est équivalent à>'0'
, puisque chaque lettre est un chiffre. 6) Mettremod
en backticks, il devient infixe. 7) Mettez tout sur une seule ligne.s==filter(...)s
vous devriez utiliserall(...)s
. maintenant, comme elles
n'apparaît qu'une fois dans l'expression, vous pouvez la remplacer par sa définition et la supprimerwhere
. aussi, au lieu de==0
vous pourriez utiliser<1
.all(\y->...)$show x
parand[...|y<-show x]
.CJam, 15 octets
C'est un bloc, l'élément le plus proche d'une fonction dans CJam. Je ne compte que le corps (c'est-à-dire en omettant les accolades). Vous pouvez l'utiliser comme suit:
Ou si vous voulez tester une série d'entrées, vous pouvez faire
Le bloc laisse
0
(fausseté) ou1
(vérité) sur la pile pour indiquer le résultat. (CJam n'a pas de type booléen.)Testez-le ici.
Explication:
Alternative, aussi 15 octets
Explication
la source
CJam, 15 octets
{}
est la chose la plus proche d'une fonction dans CJam. Je ne fais que compter le corps de la fonctionUtilisez-le comme ceci:
Pour obtenir soit
1
(si le nombre est divisible) ou0
(si le nombre n'est pas divisible par ses chiffres).Essayez-le en ligne ici
Explication
la source
Ab
scinder les chiffres? Il semble simplement le convertir en base 10. De plus, comment% sait-il modifier le nombre, et pas seulement le chiffre suivant, puisqu'il semble que le prochain chiffre serait le suivant sur la pile?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
prenez simplement les deux derniers chiffres (dans ce cas) et calculez le mod. Les deux derniers chiffres représentent le nombre et le chiffre réels (toujours)C89, 43 octets
C89 n'a pas de type booléen. J'espère que ça marche. De plus, j'ai utilisé un deuxième paramètre pour transmettre une copie du numéro d'origine à travers la pile, mais la définition peut être n'importe quoi. Pour obtenir le résultat correct, il vous suffit d'appeler la fonction avec la même valeur pour les deux paramètres (
d(128, 128)
).MODIFIER: modifications suggérées appliquées par un utilisateur anonyme
la source
C11 - 44 octets dans le corps de la fonction
Une autre version C, non récursive et sans exception en virgule flottante.
Cela fonctionnera également en C ++, Java et la plupart des autres langages de type C.
Édité pour inclure l'amélioration du commentaire de primo.
la source
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
un octet plus court que le code de l'OP.Julia
322523Amélioré en utilisant des chiffres
Corrige aussi le problème avec les nombres négatifs
Ancienne méthode
Tous les chiffres se divisent si la somme de tous les restes est 0. Comme les autres, il y a un problème avec les nombres négatifs.
Sortie
La méthode améliorée gère également BigInt
pourtant
parce que
la source
C / C ++, 58 octets (44 dans le corps)
Invoque un comportement non défini (voir les commentaires)
true
etfalse
sont 1 et 0, mais n'hésitez pas à ajouter un caractère à la signature pour renvoyer unbool
.Et pour le plaisir, une version récursive qui est plus petite si vous autorisez les appels de la forme
r(128,128)
Edit : Désactivé par les règles:
C / C ++, 53 octets (33 dans le corps)
la source
R:
726765La fonction
Merci à @AlexA et @plannapus pour les économies réalisées
Essai
la source
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
au lieu detoString(a)
donne le même résultat.GNU Awk: 53 caractères
La partie comptée:
La fonction entière:
Comme Awk n'a pas de valeur booléenne, retourne 1 pour vrai et 0 pour faux.
la source
JavaScript (ES6) 30
Fonction avec un paramètre numérique. En utilisant% et soustraction, inutile de mettre le cas spécial '0' car 0% 0 est NaN en JavaScript.
Éditer sauvegardé 1 caractère DocMax
Juste pour le plaisir, abusant de la règle de ne pas compter la signature de fonction, 4
Tester dans la console FireFox / FireBug
Sortie
la source
of(t=n+'')
par justeof t=n+''
pour économiser 1.PHP: 85 octets (64 octets sur le corps)
Pour que cette fonction fonctionne, il suffit de passer une chaîne ou un nombre.
0
retournera correctement false.Le code:
S'il vous plaît, NE PAS DÉFINIR LE 2ÈME PARAMÈTRE!
Javascript: 76 octets (61 octets sur le corps)
Ceci est une réécriture de la fonction précédente.
Pas beaucoup changé entre les deux versions.
Voici le code:
Polyglot: Javascript + PHP 187
217octets (7684 octets sans passe-partout):Pourquoi je l'ai fait?
À cause de la raison et peut-être parce que je peux!
Ignorez simplement l'erreur sur PHP: cela fonctionne quand même!Plus nécessaire, cela a été corrigé en supprimant 3 octets.
Voici le chef d'oeuvre:
Vous pouvez exécuter ce code à la fois sur votre console et sur un interpréteur PHP!
Ancienne version:
la source
Octave, 33 (39 avec configuration des fonctions)
Utilisation de la conversion numérique en matrice:
Divisez le nombre élément par élément de la matrice X, où X est obtenu en convertissant un nombre en chaîne et en soustrayant 48 pour passer de nouveau des valeurs ASCII à des nombres. Prenez modulo 1 pour obtenir la partie décimale de chaque division, confirmez que toutes ces valeurs sont égales à zéro (le cas échéant, NaN en raison de / 0, la somme sera NaN et donc non nulle).
Exemple de saisie avec www.octave-online.net:
Sortie:
la source
f(123)
ce qui est divisible par 1, 2 et 3). Mais cela fonctionne pour les cas de test fournis.MATLAB - 39 caractères
la source
BASH - 117 caractères
tests
la source
PHP -
747164 caractèresGolfé:
Moins golfé:
Résultats de test:
(Code)
(Sortie)
la source