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

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"

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.")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.