Teste, ob eine bestimmte Zahl eine Vampirzahl ist

14

EDIT: Um die Komplexität zu erhöhen, habe ich der Herausforderung mehr hinzugefügt.

In der Mathematik ist eine Vampirzahl (oder wahre Vampirzahl) eine zusammengesetzte natürliche Zahl v mit einer geraden Anzahl von Ziffern n, die in zwei ganze Zahlen x und y mit jeweils n / 2 Ziffern und nicht beide mit nachgestellten Nullen zerlegt werden kann. Dabei enthält v genau alle Ziffern von x und von y in beliebiger Reihenfolge, wobei die Multiplizität gezählt wird. x und y heißen die Reißzähne.

Weitere Informationen zu Vampire Number

Pseudovampir-Zahlen

Pseudovampir-Nummern ähneln Vampir-Nummern, mit der Ausnahme, dass die Reißzähne einer n-stelligen Pseudovampir-Nummer nicht mindestens zwei Ziffern lang sein müssen. Pseudovampir-Zahlen können eine ungerade Anzahl von Ziffern haben, zum Beispiel 126 = 6 × 21.

Eingang

Akzeptiere Zahlen von der Kommandozeile oder stdin

Ausgabe

  • "1260 = 21 * 60" (kleinerer Fang zuerst, wenn die Zahl ein Vampir ist.)
  • "1261 ist keine Vampirzahl." (wenn die Nummer keine Vampirnummer ist)
  • "126 = 6 * 21". (wenn die Nummer eine Pseudovampir-Nummer ist)

BEARBEITEN: Wenn die Nummer mehrere Reißzähne hat, zeigen Sie es so an.

x = fang1a * fang1b = fang2a * fang2b
st0le
quelle
Ich habe mich entschieden, Prime Vampire nicht einzuschließen, ich werde nicht über Bord gehen.
st0le
Vielleicht sollte ich Printing hinzufügen, wenn es ein Vampir oder ein PseudoVampir ist. Was sagt ihr?
st0le
Was ist mit mehreren Paaren von Reißzähnen?
Gnibbler
@knibbler, ich werde es wieder gutmachen.
st0le
1
@Nakilon, drucke sie in aufsteigender Reihenfolge. fang1aErscheint vor fang2awannfang1a < fang2a
st0le

Antworten:

5

Python - 188 Zeichen

Tut keine Pseudovampir-Zahlen

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"
Knabberzeug
quelle
Behandelt auch nicht mehrere Paare (für 125460) und Speicherplatz, der danach verpasst wird =.
Nakilon
( hier überprüft )
Nakilon
@Nakilon, diese Antwort ist älter als die Änderung für mehrere Paare
Gnibbler
4

Rubin, 190 Zeichen

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
quelle