Sprawdź, czy podana liczba jest liczbą wampirów

14

EDYCJA: W celu zwiększenia złożoności dodałem więcej do wyzwania.

W matematyce liczba wampirów (lub prawdziwa liczba wampirów) jest złożoną liczbą naturalną v, o parzystej liczbie cyfr n, którą można podzielić na dwie liczby całkowite xiy każda z n / 2 cyframi, a nie obie z zerami na końcu, gdzie v zawiera dokładnie wszystkie cyfry od xi od y, w dowolnej kolejności, licząc wielokrotność. xiy są nazywane kłami.

Więcej informacji o liczbie wampirów

Liczby pseudowampirów

Liczby pseudowampirów są podobne do liczb wampirów, z tym że kły n-cyfrowej liczby pseudowampirów nie muszą mieć długości n / 2 cyfr. Liczby pseudowampirów mogą mieć nieparzystą liczbę cyfr, na przykład 126 = 6 × 21.

Wejście

Akceptuj liczby z wiersza poleceń lub standardowego wejścia

Wynik

  • „1260 = 21 * 60” (najpierw mniejszy kieł, jeśli liczba to wampir).
  • „1261 nie jest liczbą wampirów”. (jeśli liczba nie jest liczbą wampirów)
  • „126 = 6 * 21”. (jeśli liczba jest liczbą pseudowampira)

EDYCJA: Jeśli liczba ma wiele zębów, wyświetl ją.

x = fang1a * fang1b = fang2a * fang2b
st0le
źródło
Postanowiłem nie włączać wampirów Prime, nie przesadzę z tym.
st0le
Może powinienem dodać Drukowanie, jeśli to Wampir lub PseudoWampir, co powiecie?
st0le
Co z wieloma parami kłów?
gnibbler 28.01.11
@gnibbler, naprawię to.
st0le
1
@Nakilon, drukuj je w rosnącej kolejności. fang1apojawia się przedtem, fang2akiedyfang1a < fang2a
st0le

Odpowiedzi:

5

Python - 188 znaków

Nie robi liczb Pseudowampirów

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
źródło
Nie obsługuje także wielu par (dla 125460) i miejsca, za którym brakuje =.
Nakilon
(zaznaczono tutaj )
Nakilon
@Nakilon, ta odpowiedź poprzedza poprawkę dla wielu par
gnibbler
4

Ruby, 190 znaków

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
źródło