Faktorisiere es! …schlecht

15

Ein neugieriges Kind verwendet ein Programm , das eine Zahl oder einen Ausdruck in das folgende Formular faktorisieren kann: p1^e1 * p2^e2 * ... * pn^en. Exponenten gleich 1sind weggelassen, z360 = 2^3 * 3^2 * 5

Das Kind gibt diese Ausgabe als neue Eingabe in das Programm ein, aber es versteht das ^Vorzeichen nicht und überspringt manchmal eine oder mehrere derjenigen, die die entsprechende Prim-Basis und den entsprechenden Exponenten verketten. Z.B(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Aufgrund dieser Fehler erhält sie möglicherweise eine andere Faktorisierung, die sie erneut eingeben kann (indem sie 0 oder mehr überspringt ^). Sie wiederholt den Vorgang, bis sich die Faktorisierung nicht mehr ändert (möglicherweise gibt es keine mehr ^oder sie hat die Ausgabe korrekt kopiert).

Sie sollten ein Programm oder eine Funktion schreiben, die mit einer Ganzzahl n( n>1) alle möglichen Zahlen in aufsteigender Reihenfolge ausgibt, deren Faktorisierung diejenige sein könnte, mit der das Kind endete (einschließlich n). ZB für die Eingabe sind 16die möglichen endgültigen Faktorisierungen(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Eingabedetails:

  • Eingabe ist eine einzelne Ganzzahl größer als 1
  • Es werden keine Eingaben gemacht, die eine Ausgabenummer größer als erzeugen 2^31-1
  • Es werden keine Eingaben gemacht, die mehr als 1000Ausgabenummern erzeugen

Ausgabedetails:

  • eine Liste von Ganzzahlen in einer für Ihre Sprache geeigneten Form

Beispiele:

Eingabe => Ausgabe

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

Dies ist Code-Golf, also gewinnt das kürzeste Programm.

randomra
quelle
Haben wir nicht schon Factorize It?
Optimierer
5
@Optimizer Das ist ganz anders.
Randomra
1
Die letzte Zahl für 360 sollte 3 6 80 sein: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange
@blutorange Danke, bearbeitet.
Randomra

Antworten:

5

CJam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

Versuchen Sie es unter http://cjam.aditsu.net/

Erläuterung:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) Danke Martin

aditsu
quelle
cjam code von der cjam god
kaine 10.02.15
Beliebige Mengen ^können in einem Schritt entfernt werden. Also dafür 58564 = 2^2 * 11^4sollte man generieren können 2508 = 22 * 114.
Randomra
@ Randomra sollten Sie ein Beispiel für diese Art der Sache
hinzufügen
@randomra sollte jetzt besser sein
aditsu
Groß! Beispiel hinzugefügt. Entschuldigung für das Überspringen.
Randomra
4

Ruby, 219

So fangen Sie an:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

Erstellt eine Funktion, die ein Array von Zahlen zurückgibt.

https://ideone.com/iOMGny

Benutze es so:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

So viel Spaß dies alles auf einem Handy zu schreiben ...

blutorange
quelle
3

Perl, 193 Bytes

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

Zeilenumbrüche werden nur zur besseren Lesbarkeit hinzugefügt.

Die for-Schleife zerlegt die nächste Zahl ( $x) in einen Hash ( %f) von Primzahlen und Potenzen. Die rekursive Funktion ( R) verwendet diesen Hash, um alle Zahlen zu generieren, die durch Entfernen von ^Zeichen erreicht werden könnten . Diese Nummern werden zu einer Warteschlange ( @q) hinzugefügt , und der Vorgang wird von der äußeren while-Schleife wiederholt. Jede Nummer aus der Warteschlange wird auch @rzum Drucken in einem eindeutigen, sortierten Array ( ) gespeichert.

grc
quelle
3

Pyth, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

Probieren Sie es hier aus.

Der Mehrfachfehler wurde ^behoben. Zum Beispiel:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

Beachten Sie, dass dieser Code von einigen Bugfixes für den offiziellen Compiler abhängt, die nach der Beantwortung der Frage gesendet wurden. Es werden jedoch keine neuen Sprachfunktionen verwendet.

isaacg
quelle
Was bekommen Sie für 58564?
Aditsu
[230, 456, 1311, 58564, 322102], was falsch ist.
Isaacg
@aditsu Das Problem wurde behoben.
Isaacg
Da Pyth (basierend auf meinen Erkenntnissen) nicht streng dokumentiert ist, ist es schwierig, zwischen Fehlerkorrekturen und neuen Funktionen zu unterscheiden, und ich habe mich entschieden, diesen Eintrag nicht als die beste Antwort zu wählen.
Randomra
@randomra Ich verstehe Ihre Entscheidung, diese Antwort nicht zu akzeptieren. Ich möchte jedoch nur erwähnen, was der Bugfix war: Die Verwendung einer reduktion ( u) in einer anderen reduzierung war unmöglich. Ich habe an der entsprechenden Stelle eine 2 in eine 3 geändert, sodass die Reduzierung 3 Eingaben anstelle von 2 erfordert. Das ist alles.
isaacg