Tester si un numéro donné est un numéro de vampire

14

EDIT: Dans l'intérêt d'augmenter la complexité, j'ai ajouté plus au défi.

En mathématiques, un nombre de vampires (ou vrai nombre de vampires) est un nombre naturel composite v, avec un nombre pair de chiffres n, qui peut être factorisé en deux entiers x et y chacun avec n / 2 chiffres et pas les deux avec des zéros à la fin, où v contient précisément tous les chiffres de x et de y, dans n'importe quel ordre, en comptant la multiplicité. x et y sont appelés les crocs.

En savoir plus sur Vampire Number

Numéros de pseudovampire

Les numéros de pseudovampire sont similaires aux numéros de vampire, sauf que les crocs d'un numéro de pseudovampire à n chiffres n'ont pas besoin d'être de longueur n / 2 chiffres. Les nombres de pseudovampires peuvent avoir un nombre impair de chiffres, par exemple 126 = 6 × 21.

Contribution

Accepter les numéros de ligne de commande ou stdin

Production

  • "1260 = 21 * 60" (croc plus petit en premier si le nombre est un vampire.)
  • "1261 n'est pas un numéro de vampire." (si le numéro n'est pas un numéro Vampire)
  • "126 = 6 * 21". (si le nombre est un nombre pseudovampire)

EDIT: Si le nombre a plusieurs crocs, affichez-le ainsi.

x = fang1a * fang1b = fang2a * fang2b
st0le
la source
J'ai décidé de ne pas inclure les vampires Prime, je n'irai pas trop loin avec ça.
st0le
Je devrais peut-être ajouter Printing si c'est un vampire ou un pseudo-vampire, que dites-vous les gars?
st0le
Qu'en est-il de plusieurs paires de crocs?
gnibbler
@gnibbler, je vais le modifier.
st0le
1
@Nakilon, imprimez-les dans l'ordre croissant. fang1aapparaît avant fang2aquandfang1a < fang2a
st0le

Réponses:

5

Python - 188 caractères

Ne fait pas de nombres de pseudovampires

from itertools import*
n=input()
a=[]
for i in map("".join,permutations(`n`)):x,y=int(i[::2]),int(i[::-2]);a+=[(x,y)]*(x*y==n)
print n,a and"=%s*%s"%min(a)or"is not a Vampire Number"
grignoteur
la source
Ne gère pas non plus plusieurs paires (pour 125460) et l'espace manquant après =.
Nakilon
(vérifié ici )
Nakilon
@Nakilon, cette réponse est antérieure à l'amendement pour plusieurs paires
gnibbler
4

Rubis, 190 caractères

o=[]
[*x.chars].permutation{|r|a=r.pop(x.size/2).join.to_i
r=r.join.to_i
o|=[[a,r]]if a<=r&&a*r==x.to_i}
puts x+(o.any? ? o.map{|i|" = "+i*" * "}*"":" is not a Vampire Number.")
Nakilon
la source