Teste se um determinado número é um número de vampiro


14

EDIT: No interesse de aumentar a complexidade, eu adicionei mais ao desafio.

Em matemática, um número de vampiro (ou número de vampiro verdadeiro) é um número natural composto v, com um número par de dígitos n, que pode ser fatorado em dois números inteiros x e y, cada um com n / 2 dígitos e não ambos com zeros à direita, onde v contém precisamente todos os dígitos de xe de y, em qualquer ordem, contando a multiplicidade. x e y são chamados de presas.

Mais sobre o número de vampiros

Números de pseudo-vampiro

Os números de pseudo-vampiro são semelhantes aos números de vampiro, exceto que as presas de um número de pseudo-vampiro de um dígito n não precisam ter o comprimento de n / 2 dígitos. Os números de pseudo-vampiro podem ter um número ímpar de dígitos, por exemplo 126 = 6 × 21.

Entrada

Aceitar números da linha de comando ou stdin

Resultado

  • "1260 = 21 * 60" (canino menor primeiro se o número for um vampiro.)
  • "1261 não é um número de vampiro." (se o número não for um número de vampiro)
  • "126 = 6 * 21". (se o número for um número de pseudo-vampiro)

EDIT: Se o número tiver várias presas, exiba-o.

x = fang1a * fang1b = fang2a * fang2b

Eu decidi não incluir os vampiros Prime, não vou exagerar nisso.
st0le

Talvez eu deva adicionar Printing se for um vampiro ou um pseudo-vampiro, o que vocês dizem?
st0le

E quanto a vários pares de presas?
Gnibbler

@gnibbler, eu vou corrigi-lo.
st0le

1
@Nakilon, imprima-os em ordem crescente. fang1aaparece antes fang2aquandofang1a < fang2a
st0le

Respostas:


5

Python - 188 caracteres

Não faz números de pseudo-vampiro

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"

Também não lida com vários pares (para 125460) e com o espaço perdido depois =.
Nakilon

(verificado aqui )
Nakilon

@Nakilon, esta resposta anterior à alteração de vários 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.")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.