Produkt der Ziffern

10

Schreiben Sie für eine gegebene positive ganze Zahl N ein vollständiges Programm, um das minimale natürliche M zu finden, so dass das Produkt der Ziffern von M gleich N ist. N ist kleiner als 1.000.000.000. Wenn kein M vorhanden ist, drucken Sie -1. Ihr Code sollte auf keinen Fall länger als 10 Sekunden dauern.

Sample Inputs
1
3
15
10 
123456789
32
432
1296

Sample Outputs
1
3
35
25
-1
48
689
2899
fR0DDY
quelle
4
1Geben 1ist ein wichtiger Testfall.
Peter Taylor
1
Sie sollten komplexere Fälle hinzufügen, wie die drei, die ich unten verwendet habe: 32, 432, 1296. Es sei denn, Sie belassen dies als Übung für den Codierer.
Mellamokb
@ s-mark 26, eh. Kleinste Zahl.
FR0DDY
Ich glaube, wir sollten auch die offensichtlichen 387420489 (9 ^ 9) und 1000000000 zum Spaß testen.
Asoundmove
2
Da dies eine alte Frage ist und das OP inaktiv ist, ist dies nur ein Hinweis für zukünftige Beiträge: "10 Sek."
Ist

Antworten:

4

Golfscript, 45 43 40 Zeichen

~9{{1$1$%!{\1$/1$}*}12*(}8*>{];-1}*]$1or

Ersetzt die Version, bei der kleine Primzahlen nicht in Potenzen gruppiert wurden, und spart dabei 8 Zeichen. Hinweis: 12 = Etage (9 log 10 / log 5).

Danksagung: zwei Zeichen, die durch einen Trick von @mellamokb gespeichert wurden; 3 mit einem Hinweis von @Nabb gespeichert.

Peter Taylor
quelle
1
Was! Sie können Golfscript schreiben, ohne es zu testen? +1, Sieht gut aus, außer 123456789, es dauert mehr als 1 Minute auf meinem Computer und ich habe den Prozess abgebrochen. 12345gib mir -1, vielleicht sollte es auch funktionieren, 123456789wenn ich lange genug warten könnte.
SIE
@ S.Mark, danke. Sieht so aus, als könnte ich mit dem naiven Faktorisierungsalgorithmus nicht durchkommen.
Peter Taylor
@Peter: Gibt falsche Antworten für komplexere Fälle. 32 -> 22222, sollte 48 sein. 432 -> 2222333, sollte 689 sein. 1296 -> 22223333, sollte 2899 sein. Usw.
Mellamokb
@ Mellamokb, guter Punkt. Ich denke, ich muss umschreiben und testen.
Peter Taylor
Wow, 17 Zeichen weniger. Ich brauche einen besseren Algorithmus, lol!
Mellamokb
6

Javascript ( 84 78 76 74 72 70 68)

n=prompt(m="");for(i=9;i-1;)n%i?i--:(m=i+m,n/=i);alert(n-1?-1:m?m:1)

http://jsfiddle.net/D3WgU/7/

Bearbeiten: Ausgeliehene Eingabe / Ausgabe-Idee von einer anderen Lösung und kürzere Ausgabelogik.

Bearbeiten 2: 2 Zeichen gespeichert, indem nicht benötigte Klammern in der forSchleife entfernt werden.

Bearbeiten 3: 2 Zeichen durch Umschreiben der whileSchleife als ifAnweisung mit gespeichert i++.

Bearbeiten 4: 2 Zeichen gespeichert, indem Sie sich bewegen und Operationen weiter reduzieren i.

Bearbeiten 5: Konvertieren Sie die if-Anweisung in ein ternäres Format, wobei Sie 2 weitere Zeichen sparen.

Bearbeiten 6: Speichern Sie 2 Zeichen, indem Sie i--in den wahren Teil des Ternärs wechseln, und entfernen Sie ihn ++i.

mellamokb
quelle
Sie haben nur für die Funktion Zeichen gezählt. Ist das ein komplettes Programm? Können Sie es hier ausführen ideone.com
fR0DDY
1
Es sieht so aus, als ob es eine ähnliche Eingabe für Javascript mit Spidermonkey bei ideone gibt, die er verlinkt hat - ideone.com/samples#sample_lang_112
YOU
@ FR0DDY: OK, jetzt ist es ein komplettes Programm :)
Mellamokb
Ich habe meine schließlich auf 69 Zeichen reduziert, aber das kannst du jetzt auch mit der gleichen Idee und dem gleichen promptDing machen.
Ry
m?m:1=>m||1
14 m2
4

JavaScript, 88 72 78 74 69 68

für (s = '', i = 2, m = n = prompt (); i <m; i ++) während (! (n% i)) {if (i> 9) {alert (-1); E ( )} n / = i; s + = i} Warnung (en)
4 Zeichen länger, aber tatsächlich ein ausführbares Skript (im Gegensatz zu einer Funktion).

Bearbeiten: Mit Ideen aus dem anderen JavaScript kann ich es auf Folgendes reduzieren:

for(s='',i=9,n=prompt();i>1;i--)for(;!(n%i);n/=i)s=i+s;alert(n-1?-1:s?s:1)

Schließlich! Eine 69-stellige Lösung verwendet nur 1 für Schleife;)

for(s='',i=9,n=prompt();i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)

Okay, ein Komma abgeschabt.

for(i=9,n=prompt(s='');i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)
Ry-
quelle
Gleiches Problem wie bei der GolfScript-Lösung. Schlägt an den Eingängen 32, 432 und 1296 fehl. Es gibt einen Grund, warum ich bei 9 beginne und rückwärts gehe und von rechts statt von links verkette.
Mellamokb
Auch schlägt für Eingabe 1 fehl.
Müssen
Ich habe den "minimalen" Teil verpasst, geändert.
Ry
@minitech: Funktioniert immer noch nicht für Eingabe '1'. lol, unsere Antworten sind fast genau identisch :-)
mellamokb
Ah, es ist gelungen, es 2 Zeichen kürzer als deins zu machen! : D
Ry
4

awk ( 63 61 59 58 57)

{for(i=9;i>1;$1%i?i--:($1/=i)<o=i o);print 1<$1?-1:o?o:1}
asoundmove
quelle
Wir rufen das Programm nur für eine Eingabe auf. Es werden mehrere Eingaben gegeben, um die Richtigkeit zu überprüfen.
FR0DDY
3

Perl (75) (72)

$ d = shift; map {$ m = $ _. $ m, $ d / = $ _ bis $ d% $ _} umgekehrt 2..9; print $ d-1? -1: $ m || 1

inspiriert von Mellamokbs Javascript-Code; soll mit einem Parameter ausgeführt werden

chinesisches perl goth
quelle
Wäre es nicht kürzer, wenn Sie stdin anstelle eines Parameters verwenden würden?
Asoundmove
3

GolfScript ( 60 57)

~[{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+\9>[-1]@if$

~{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+$\9>-1@if

Bearbeiten

Ok, ich denke diese Version liefert jetzt für jeden Fall die richtige Ausgabe :-)

Bearbeiten 2

3 Zeichen pro @ Peters Vorschläge rasiert.

mellamokb
quelle
Der Grund, warum ich oben kommentiert habe, dass 1Geben 1ein wichtiger Testfall ist, ist, dass es ein böser Sonderfall ist - die einzige Zahl, für die die Ziffer 1in der Ausgabe erscheint. Und es bricht Ihren Code, fürchte ich.
Peter Taylor
Es bricht auch für Zahlen, die durch Primzahlen größer als 9 teilbar sind.
Peter Taylor
@ Peter: OK, versuchen Sie es erneut. Ich denke, diese Version funktioniert jetzt für alle Testfälle.
Mellamokb
Scheint ja. Sie können ein Zeichen sofort speichern, indem Sie dieses zuerst entfernen. [Wenn Sie [bei der Auswertung kein Zeichen auf dem Stapel ]haben, wird alles auf dem Stapel benötigt. Und Sie können wahrscheinlich zwei Zeichen gegen Ende speichern, indem Sie nicht -1in ein Array einwickeln und das Finale verschieben $.
Peter Taylor
@ Peter: Danke, 3 weitere Zeichen gespeichert!
Mellamokb
3

Haskell

f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])
Ming-Tang
quelle
Abscheren einen char durch Änderung (show m)an $show m.
FUZxxl
1
sollte es nicht sein m<-[1..9^9]... sonst ist es eine unendliche Liste ... also -1wird es nie vorkommen ... korrigiere mich, wenn ich falsch liege.
st0le
Ich glaube nicht, dass es innerhalb von 10
Sekunden
2

Windows PowerShell, 87

if(($n="$args")-le1){$n;exit}(-1,-join(9..2|%{for(;!($n%$_)){$_;$n/=$_}}|sort))[$n-eq1]
Joey
quelle
2

Perl (68)

$x=pop;map{$_-=11;$x/=$_,$@=-$_.$@until$x%$_}1..9;print!$x?-1:$@||1

Es scheint, als würde der großartige Trick, den @mellamokb in Javascript verwendet, um die verschachtelte Schleife zu vermeiden, gut in Perl übersetzt, aber er ist viel ausführlicher, da Sie die foreachStilschleife nicht mehr verwenden können. Es ist auch schade, dass Perl nicht glaubt, dass mapeine Schleife sonst redonützlich wäre.

Jasvir
quelle
2

Scala 106 Zeichen:

def p(n:Int,l:Int=9):List[Int]=if(n<=9)List(n)else
if(l<2)List(-1)else
if(n%l==0)l::p(n/l,l)else
p(n,l-1)

Test & Aufruf:

scala> val big=9*9*9*8*8*8*7*7*7*5*3 
big: Int = 1920360960

scala> p(big)                        
res1: List[Int] = List(9, 9, 9, 8, 8, 8, 7, 7, 7, 5, 3)

Reaktionszeit: sofort <1s auf 2-GHz-CPU.

Benutzer unbekannt
quelle
2

Gelee , 18 13 10 Bytes

×⁵RDP$€io-

Probieren Sie es online aus!

13-Byte-Lösung:

×⁵RDP$€iµ’¹¬?

Probieren Sie es online aus!

Erklärung mit Eingabe N:

׳R              create a range from 1 to N * 100 (replace ³ with ⁵ for a faster execution time)
   DP$           define a function ($) to get the product of the digits of a number,
      €          apply that function to each element in the list,
       iµ        get the index of the input N in the list (or 0 if it's not there), and yeild it as the input to the next link,
         ’¹¬?    conditional: if the answer is 0, then subtract one to make it -1, otherwise, yeild the answer

18-Byte-Lösung:

D×/
×⁵RÇ€i
Ç⁾-1¹¬?

Probieren Sie es online aus!

D×/        product of digits function, takes input M
D          split M into digits,
 ×/        reduce by multiplication (return product of digits)

×⁵RÇ€i     range / index function
×⁵R        make a range from 1 to N*10,
   ǀ      run the above function on each of the range elements,
     i     get the index of N in the result, or 0 if it's not there

Ç⁾-1¹¬?    main function:
Ç    ¬?    run the line above and check if the answer is null (0)
 ⁾-1       if it is, return "-1",
    ¹      otherwise, return the answer (identity function).

Der letzte Link ersetzt nur 0 (Jellys Standard-Falsey-Wert, da alle Listen einsindiziert sind) durch -1. Wenn Sie 0 als OK-Falsey-Wert betrachten, beträgt das Programm 8 Byte .

Harry
quelle
1
Einige Hinweise: (1) Sie verwenden jede Hilfsverbindung nur einmal, sodass es keinen Grund gibt, eine Hilfsverbindung herzustellen. Verwenden Sie einfach die $ƊƲµ. (2) Da die Zeichenfolge -1und die Nummer -1bei der Ausgabe identisch sind, werden durch die Verwendung der Nummer 2 Byte eingespart. (3) Pist eine Abkürzung für ×/. (4) Eingabe fehlgeschlagen 3125.
user202729
@ user202729 Vielen Dank! Ich habe (1), (2) und (3) implementiert und sie haben 6 Bytes gespart! Wenn ich das ⁵ in ein ³ änderte, funktionierte es am Eingang 3125, jedoch erst nach einer beträchtlichen Verzögerung. Wissen Sie, ob es einen besseren (und kürzeren) Weg gibt, oder ist mein Ansatz (von dem ich weiß, dass er in Bezug auf die Zeitkomplexität definitiv nicht der schnellste ist) so gut wie er wird?
Harry
1
Ich denke, _¬$sollte ’¹¬?
überarbeiten
1
o-ist noch kürzer.
user202729
@dylnan Danke - mir ist aufgefallen, dass ich wegen der µnur ohne $die 2 Bytes sparen konnte! Aber dann wurde mir klar, dass o-ich das einfach µganz weglassen und 3 Bytes sparen konnte!
Harry
1

Rubin (100)

n=gets.to_i;(d=1..9).map{|l|[*d].repeated_combination(l){|a|a.reduce(:*)==n&&(puts a*'';exit)}};p -1
Lars Haugseth
quelle
0

Python 2 , 89 Bytes

f=lambda n,a=0,u=1,i=9:n<2and(a or 1)or-(i<2)or n%i<1and f(n/i,a+i*u,u*10)or f(n,a,u,i-1)

Probieren Sie es online aus!

Nur weil es noch keine Python-Antwort gibt. Es ist wirklich schmerzhaft, keine implizite Typkonvertierung zwischen string und int zu haben.

Bubbler
quelle