Uji apakah nomor yang diberikan adalah Nomor Vampir

14

EDIT: Demi meningkatkan kompleksitas, saya telah menambahkan lebih banyak tantangan.

Dalam matematika, bilangan vampir (atau bilangan vampir sejati) adalah bilangan alami gabungan v, dengan bilangan genap n, yang dapat difaktorkan menjadi dua bilangan x dan y masing-masing dengan n / 2 digit dan tidak keduanya dengan trailing nol, di mana v berisi semua digit dari x dan dari y, dengan urutan apa pun, menghitung multiplisitas. x dan y disebut taring.

Lebih lanjut tentang Nomor Vampir

Nomor Pseudovampire

Nomor pseudovampire mirip dengan nomor vampir, kecuali bahwa taring nomor pseudovampire n-digit tidak boleh panjang n / 2 digit. Angka Pseudovampire dapat memiliki angka ganjil, misalnya 126 = 6 × 21.

Memasukkan

Terima Angka dari baris perintah atau stdin

Keluaran

  • "1260 = 21 * 60" (fang kecil dulu jika angkanya adalah Vampir.)
  • "1261 bukan Nomor Vampir." (jika nomor itu bukan nomor Vampir)
  • "126 = 6 * 21". (jika nomor tersebut adalah nomor Pseudovampire)

EDIT: Jika nomornya memiliki beberapa taring, tampilkan demikian.

x = fang1a * fang1b = fang2a * fang2b
st0le
sumber
Saya telah memutuskan untuk tidak memasukkan Prime vampir, saya tidak akan berlebihan.
st0le
Mungkin saya harus menambahkan Printing jika itu Vampire atau PseudoVampire, apa kata kalian?
st0le
Bagaimana dengan beberapa pasang taring?
gnibbler
@gnibbler, saya akan memperbaikinya.
st0le
1
@Nakilon, cetak dalam urutan yang meningkat. fang1amuncul sebelumnya fang2aketikafang1a < fang2a
st0le

Jawaban:

5

Python - 188 karakter

Tidak melakukan angka Pseudovampire

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
sumber
Juga tidak menangani banyak pasangan (untuk 125460) dan ruang terlewatkan setelahnya =.
Nakilon
(diperiksa di sini )
Nakilon
@Nakilon, jawaban ini mendahului amandemen untuk beberapa pasangan
gnibbler
4

Ruby, 190 karakter

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
sumber