Prueba si un número dado es un número de vampiro

14

EDITAR: en aras de aumentar la complejidad, he agregado más al desafío.

En matemáticas, un número de vampiro (o número de vampiro verdadero) es un número natural compuesto v, con un número par de dígitos n, que puede factorizarse en dos enteros x e y cada uno con n / 2 dígitos y no ambos con ceros al final, donde v contiene precisamente todos los dígitos de xy de y, en cualquier orden, contando la multiplicidad. x e y se llaman colmillos.

Más sobre Número de vampiro

Números de pseudovampiros

Los números de pseudovampiros son similares a los números de vampiros, excepto que los colmillos de un número de pseudovampiros de n dígitos no necesitan tener una longitud de n / 2 dígitos. Los números de pseudovampiros pueden tener un número impar de dígitos, por ejemplo 126 = 6 × 21.

Entrada

Aceptar números de la línea de comando o stdin

Salida

  • "1260 = 21 * 60" (colmillo más pequeño primero si el número es un vampiro).
  • "1261 no es un número de vampiro". (si el número no es un número de vampiro)
  • "126 = 6 * 21". (si el número es un número de pseudovampiro)

EDITAR: si el número tiene múltiples colmillos, muéstrelo así.

x = fang1a * fang1b = fang2a * fang2b
st0le
fuente
He decidido no incluir a los vampiros principales, no me excederé.
st0le
Tal vez debería agregar impresión si es un vampiro o un pseudovampiro, ¿qué dicen ustedes?
st0le
¿Qué pasa con múltiples pares de colmillos?
gnibbler
@gnibbler, lo enmendaré.
st0le
1
@Nakilon, imprímalos en orden creciente. fang1aaparece antes fang2acuandofang1a < fang2a
2011

Respuestas:

5

Python - 188 caracteres

No hace números de pseudovampiros

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"
gnibbler
fuente
Tampoco maneja múltiples pares (para 125460) y espacio perdido después =.
Nakilon
(marcado aquí )
Nakilon
@Nakilon, esta respuesta es anterior a la enmienda para varios pares
gnibbler
4

Ruby, 190 caracteres

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
fuente