Rakam Ürünü


10

Belirli bir pozitif N tamsayı için, M rakamlarının çarpımı N'nin eşit olacağı şekilde minimum doğal M'yi bulmak için tam bir program yazın. N 1.000.000.000'dan az olacaktır. M yoksa, -1 yazdırın. Kodunuz hiçbir durumda 10 saniyeden fazla sürmemelidir.

Sample Inputs
1
3
15
10 
123456789
32
432
1296

Sample Outputs
1
3
35
25
-1
48
689
2899

4
1vermek 1önemli bir test durumudur.
Peter Taylor

1
Aşağıda kullandığım üç gibi daha karmaşık durumlar eklemelisiniz: 32, 432, 1296. Kodlayıcı için bir egzersiz olarak bırakmazsanız.
mellamokb

@ s-mark 26, ha. En Küçük Sayı.
fR0DDY

Ben de bariz 387420489 (9 ^ 9) ve 1000000000'i eğlence için test etmemiz gerektiğine inanıyorum.
asoundmove

2
Bu eski bir soru olduğundan ve OP etkin olmadığından, bu yalnızca gelecekteki gönderiler için bir nottur: "10 sn", geçerli standarda (hangi makinede?)
Göre belirsizdir

Yanıtlar:


4

Golfscript, 45 43 40 karakter

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

Küçük asalları güçlere gruplamayan sürümü değiştirir ve bunu yaparken 8 karakter kaydeder. Not: 12 = zemin (9 log 10 / log 5).

Teşekkür: @mellamokb'dan bir numara kesilerek kaydedilen iki karakter; 3 @ Nabb'dan bir ipucu ile kaydedildi.


1
Ne! Golfscript test etmeden yazabilirsiniz? +1, İyi görünüyor, 123456789 hariç, makinemde 1 dakikadan fazla sürüyor ve süreci öldürdüm. 12345Bana -1 verin, bu yüzden 123456789yeterince uzun süre bekleyebilirsem de işe yarayabilir.
SİZ

@ S.Mark, teşekkürler. Saf faktörleştirme algoritmasından kurtulamadığım anlaşılıyor.
Peter Taylor

@Peter: Daha karmaşık vakalar için yanlış cevaplar verir. 32 -> 22222, 48 olmalı. 432 -> 2222333, 689 olmalı. 1296 -> 22223333, 2899 olmalı. Vb.
mellamokb

@mellamokb, iyi bir nokta. Sanırım yeniden yazmam ve test etmem gerekecek.
Peter Taylor

Vay canına, 17 karakter daha az. Daha iyi bir algoritmaya ihtiyacım var, 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/

Edit: Diğer çözümden ödünç alınan giriş / çıkış fikri ve daha kısa çıkış mantığı.

Düzenleme 2: Döngüde olmayan parantezleri kaldırarak 2 karakter kaydedildi for.

Düzenleme 3:while Döngüyü ifdeyim olarak yeniden yazarak kaydedilen 2 karakter i++.

Düzenleme 4: Hareket ederek ve işlemleri azaltarak kaydedilen 2 karakter i.

Edit 5: If ifadesini 2 karakter daha kaydederek üçlü formata dönüştürün.

Edit 6: Üçlünün i--gerçek kısmına geçerek 2 karakter kaydedin , kaldırın ++i.


Sadece işlev için karakter saydınız. Bu tam bir program mı? Burada idam edebilirsiniz ideone.com
fR0DDY

1
bağlandığı ideone spidermonkey ile javascript için benzer bir girdi var gibi görünüyor - ideone.com/samples#sample_lang_112
SİZ

@ fR0DDY: Tamam, şimdi tam bir program :)
mellamokb

Sonunda benimkini 69 karaktere düşürdüm, ancak şimdi de aynı fikir ve promptşeyle yapabilirsiniz.
Ry-

m?m:1=>m||1
l4m2

4

JavaScript, 88 72 78 74 69 68

için (s = '', i = 2, m = n = () istem i <m, i ++) ise {(i ((n,% i!))> 9) {uyarı (1); E ( )}, n / i = s + = i} uyarısı (lar)
4 karakter daha uzun, ancak aslında yürütülebilir bir komut dosyası (bir işlevin aksine).

Düzenleme: Diğer JavaScript fikirleri kullanarak, ben bunu azaltabilir:

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

En sonunda! 69 karakterlik bir çözüm, döngü için yalnızca 1 kullanır;)

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

Tamam, bir virgülle traş ettim.

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

GolfScript çözümü ile aynı sorun. 32, 432 ve 1296 girişlerinde başarısız olur. 9'dan başlayıp geriye doğru gitmem ve soldan ziyade sağdan birleştirme yapmamın bir nedeni var.
mellamokb

Ayrıca giriş 1 için başarısız. 1 işlemek için özel bir durum yapmak zorunda.
mellamokb

Ben, "minimal" kısmı özledim değişti.
Ry-

@minitech: '1' girişi için hala çalışmıyor. lol, cevaplarımız neredeyse tamamen aynı olmaya geliyor :-)
mellamokb

Ah, sizinkinden 2 karakter daha kısa yapmayı başardınız! : 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}

Sadece bir giriş için program çağırıyoruz. Doğruluğu kontrol etmek için birden fazla giriş verilir.
fR0DDY

3

Perl (75) (72)

$ d = üst karakter; harita {$ m = $ _. $ m, $ d / = $ _ $ d% $ _} tersine 2..9; $ d-1? -1: $ m || 1 yazdır

mellamokb'un javascript kodundan esinlenilmiştir; bir parametre ile çalıştırılmak istenen


Parametre yerine stdin kullandıysanız daha kısa olmaz mıydı?
asoundmove

3

GolfScript ( 60 57)

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

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

Düzenle

Tamam, bu sürümün şimdi her durum için doğru çıktı verdiğini düşünüyorum :-)

Düzenle 2

@ Peter'ın önerisi başına 3 karakter çıkarıldı.


Yukarıda 1vermenin 1önemli bir test vakası olduğunu açıklamamın nedeni , kötü bir özel durum olmasıdır - basamağın 1çıktıda göründüğü tek sayı . Ve kodunu kırıyor, korkarım.
Peter Taylor

Ayrıca 9'dan büyük asallere bölünebilen sayılar için kırılıyor
Peter Taylor

@Peter: Tamam, tekrar deneyin. Bu sürümün tüm test senaryoları için geçerli olduğunu düşünüyorum.
mellamokb

Öyle görünüyor, evet. Önce bir karakteri kaldırarak hemen bir karakter kaydedebilirsiniz [- [değerlendirdiğinizde yığınınızda yoksa ], yığındaki her şeyi alır. Ve muhtemelen -1bir diziyi kaydırıp finali taşımadan sonuna kadar iki karakter kaydedebilirsiniz $.
Peter Taylor

@Peter: Teşekkürler, 3 karakter daha kaydetti!
mellamokb

3

Haskell

f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])

Olarak değiştirerek bir karakter tıraş (show m)edin $show m.
FUZxxl

1
olmamalı m<-[1..9^9].... Aksi takdirde sonsuz bir liste ... bu yüzden -1asla gerçekleşmeyecek .... eğer yanlışsam beni düzeltin.
st0le

Ben 10 saniye içinde çalışabilir sanmıyorum ....
st0le

2

Windows PowerShell, 87

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

2

Perl (68)

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

O görünüyor javascript @mellamokb kullandığı Perlde iyi tercüme ediyorum iç içe döngü önlemek için müthiş numara gibi ama kullanamıyorum çünkü çok daha ayrıntılı çıkıyor foreachartık stil döngü. Ayrıca perl mapbaşka bir döngü redokullanışlı olacağını düşünmüyor yazık .


2

scala 106 karakter:

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 ve Çağrı:

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)

Tepki süresi: hemen, 2Ghz CPU üzerinde <1s.


2

Jöle , 18 13 10 bayt

×⁵RDP$€io-

Çevrimiçi deneyin!

13 baytlık çözelti:

×⁵RDP$€iµ’¹¬?

Çevrimiçi deneyin!

Giriş ile açıklama 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 baytlık çözelti:

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

Çevrimiçi deneyin!

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).

Son bağlantı yalnızca 0'ı (tüm listeler tek dizinli olduğu için Jelly'in varsayılan falsey değeri) -1 ile değiştirmektir. 0'ın uygun bir falsey değeri olduğunu düşünüyorsanız, program 8 bayttır .


1
Bazı notlar: (1) her bir yardımcı bağlantıyı yalnızca bir kez kullanırsınız, bu nedenle yardımcı bağlantı yapmak için bir neden yoktur. Sadece $ƊƲµ. (2) Çıktı sırasında dize -1ve sayı -1aynı olduğu için, sayı kullanıldığında 2 bayt kaydedilir. (3) Pkısaltmasıdır ×/. (4) Giriş başarısız 3125.
user202729

@ user202729 Çok teşekkür ederim! (1), (2) ve (3) 'ü uyguladım ve 6 bayt kazandılar! Eğer ⁵ değerini ³ olarak değiştirirsem, 3125 girişinde çalıştı, ancak sadece önemli bir gecikmeden sonra. Daha iyi (ve daha kısa) bir yol olup olmadığını biliyor musunuz ya da benim yaklaşımım (zaman karmaşıklığı açısından kesinlikle en hızlı olmadığını biliyorum) alacağı kadar iyi mi?
Harry

1
Sanırım _¬$üzerinde çalışmalıyız’¹¬?
dylnan

1
o-daha da kısadır.
user202729

@dylnan Teşekkür ederim - Ben µsadece 2 bayt kurtardı olmadan kullanabileceğim için fark ettim $! Ama sonra fark ettim o-ki µtamamen atlayabilirim ve 3 bayt kurtarabilirim!
Harry

1

Yakut (100)

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

0

Python 2 , 89 bayt

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)

Çevrimiçi deneyin!

Henüz Python yanıtı olmadığı için. String ve int arasında örtük tip dönüşümünün olmaması gerçekten acı vericidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.