Produk Digit

10

Untuk bilangan bulat positif N yang diberikan, tulislah program lengkap untuk menemukan M natural minimal sehingga produk digit M sama dengan N. N kurang dari 1.000.000.000. Jika tidak ada M, cetak -1. Kode Anda tidak boleh lebih dari 10 detik untuk kasus apa pun.

Sample Inputs
1
3
15
10 
123456789
32
432
1296

Sample Outputs
1
3
35
25
-1
48
689
2899
fR0DDY
sumber
4
1memberi 1adalah ujian yang penting.
Peter Taylor
1
Anda harus menambahkan kasing yang lebih rumit, seperti tiga yang saya gunakan di bawah: 32, 432, 1296. Kecuali Anda membiarkannya sebagai latihan untuk pembuat kode.
mellamokb
@ s-tandai 26, eh. Angka terkecil.
fR0DDY
Saya percaya kita juga harus menguji 387420489 (9 ^ 9) dan 10.00000000 untuk bersenang-senang.
asoundmove
2
Karena ini adalah pertanyaan lama dan OP tidak aktif, ini hanya catatan untuk posting mendatang: "10 detik" tidak jelas sesuai dengan standar saat ini (di mesin mana?)
user202729

Jawaban:

4

Golfscript, 45 43 40 karakter

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

Mengganti versi yang tidak mengelompokkan bilangan prima kecil menjadi kekuatan dan menyimpan 8 karakter saat melakukannya. Catatan: 12 = lantai (9 log 10 / log 5).

Ucapan Terima Kasih: dua karakter disimpan dengan membuat trik dari @mellamokb; 3 disimpan dengan petunjuk dari @Nabb.

Peter Taylor
sumber
1
Apa! Anda dapat menulis Golfscript tanpa mengujinya? +1, Kelihatannya baik-baik saja, kecuali 123456789, butuh lebih dari 1 menit pada mesin saya dan saya telah membunuh prosesnya. 12345beri saya -1, jadi mungkin itu harus berfungsi 123456789juga jika saya bisa menunggu cukup lama.
KAMU
@ S.Mark, terima kasih. Sepertinya saya tidak bisa lolos dengan algoritma factorisation naif.
Peter Taylor
@ Peter: Memberikan jawaban yang salah untuk kasus yang lebih kompleks. 32 -> 22222, harus 48. 432 -> 2222333, harus 689. 1296 -> 22223333, harus 2899. dll.
mellamokb
@ellamokb, poin bagus. Saya pikir saya harus menulis ulang dan menguji.
Peter Taylor
Wow, 17 karakter lebih sedikit. Saya perlu algoritma yang lebih baik, 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/

Sunting: Gagasan input / output yang dipinjam dari solusi lain, dan logika output yang lebih pendek.

Sunting 2: Disimpan 2 karakter dengan menghapus kawat gigi yang tidak dibutuhkan dalam forlingkaran.

Sunting 3: Disimpan 2 karakter dengan menulis ulang whilelingkaran sebagai ifpernyataan dengan i++.

Sunting 4: Disimpan 2 karakter dengan bergerak di sekitar dan mengurangi operasi i.

Sunting 5: Konversikan jika pernyataan ke format terner menyimpan 2 karakter lagi.

Sunting 6: Simpan 2 karakter dengan pindah i--ke bagian terner yang sebenarnya, hapus ++i.

mellamokb
sumber
Anda telah menghitung karakter hanya untuk fungsi. Apakah ini program yang lengkap? Anda dapat mengeksekusi sini ideone.com
fR0DDY
1
sepertinya ada input serupa untuk javascript dengan spidermonkey di ideone yang ditautkannya - ideone.com/samples#sample_lang_112
YOU
@ fR0DDY: Oke, sekarang ini adalah program yang lengkap :)
mellamokb
Saya akhirnya mengurangi karakter saya menjadi 69 karakter, tetapi Anda dapat melakukannya sekarang juga dengan jenis ide dan prompthal yang sama.
Ry-
m?m:1=>m||1
l4m2
4

JavaScript, 88 72 78 74 69 68

untuk (s = '', i = 2, m = n = prompt (); i <m; i ++) sementara (! (n% i)) {if (i> 9) {alert (-1); E ( )} n / = i; s + = i} lansiran
4 karakter lebih panjang, tetapi sebenarnya skrip yang dapat dieksekusi (sebagai lawan dari fungsi).

Sunting: Menggunakan ide dari JavaScript lain, saya dapat menguranginya menjadi ini:

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

Akhirnya! Solusi 69 karakter, hanya menggunakan 1 untuk loop;)

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

Oke, mencukur satu koma.

for(i=9,n=prompt(s='');i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)
Ry-
sumber
Masalah yang sama dengan solusi GolfScript. Gagal pada input 32, 432, dan 1296. Ada alasan mengapa saya mulai pada 9 dan mundur, dan menyatukan dari kanan, bukan dari kiri.
mellamokb
Juga gagal untuk input 1. Harus membuat kasus khusus untuk menangani 1.
mellamokb
Saya melewatkan bagian "minimal", berubah.
Ry-
@minitech: Masih tidak berfungsi untuk input '1'. haha, jawaban kami hampir sama persis :-)
mellamokb
Ah, berhasil membuatnya 2 karakter lebih pendek dari milikmu! : 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}
pindahkan
sumber
Kami memanggil program hanya untuk satu input. Beragam input diberikan hanya untuk memeriksa kebenaran.
fR0DDY
3

Perl (75) (72)

$ d = shift; peta {$ m = $ _. $ m, $ d / = $ _ hingga $ d% $ _} terbalik 2..9; cetak $ d-1? -1: $ m || 1

terinspirasi oleh kode javascript mellamokb; dimaksudkan untuk dijalankan dengan parameter

perl Cina goth
sumber
Bukankah lebih pendek jika Anda menggunakan stdin daripada parameter?
asoundmove
3

GolfScript ( 60 57)

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

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

Edit

Ok, saya pikir versi ini memberikan output yang benar untuk setiap kasus sekarang :-)

Edit 2

Mencukur 3 karakter per saran dari Peter.

mellamokb
sumber
Alasan saya berkomentar di atas bahwa 1memberi 1adalah kasus ujian yang penting adalah bahwa itu adalah kasus khusus yang tidak menyenangkan - satu-satunya angka di mana angka 1muncul di output. Dan itu merusak kode Anda, saya khawatir.
Peter Taylor
Juga terputus untuk angka yang dapat dibagi oleh bilangan prima lebih besar dari 9.
Peter Taylor
@ Peter: Oke, coba lagi. Saya pikir versi ini berfungsi untuk semua kasus uji sekarang.
mellamokb
Sepertinya, ya. Anda dapat menyimpan satu karakter langsung dengan menghapusnya terlebih dahulu [- jika Anda tidak memiliki [di stack ketika Anda mengevaluasi ]itu mengambil semua yang ada di stack. Dan Anda mungkin dapat menyimpan dua karakter di dekat akhir dengan tidak membungkus -1dalam array dan memindahkan final $.
Peter Taylor
@ Peter: Terima kasih, menyimpan 3 karakter lagi!
mellamokb
3

Haskell

f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])
Ming-Tang
sumber
Cukur satu char dengan mengganti (show m)ke $show m.
FUZxxl
1
bukankah seharusnya m<-[1..9^9].... kalau tidak itu adalah daftar yang tak terbatas ... jadi -1tidak akan pernah terjadi .... koreksi saya jika saya salah.
st0le
Saya tidak berpikir itu bisa bekerja dalam 10secs ....
st0le
2

Windows PowerShell, 87

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

Perl (68)

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

Ini tampaknya seperti trik mengagumkan yang menggunakan @mellamokb di javascript untuk menghindari loop bersarang akan menerjemahkan dengan baik untuk perl tetapi keluar jauh lebih verbose karena Anda tidak dapat menggunakan foreachgaya lingkaran lagi. Sayang sekali bahwa perl tidak berpikir mapbahwa loop lain redoakan berguna.

Jasvir
sumber
2

scala 106 chars:

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)

Tes & Doa:

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)

Waktu respons: segera, <1dt pada 2Ghz CPU.

Pengguna tidak diketahui
sumber
2

Jelly , 18 13 10 byte

×⁵RDP$€io-

Cobalah online!

Solusi 13-byte:

×⁵RDP$€iµ’¹¬?

Cobalah online!

Penjelasan dengan input 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

Solusi 18-byte:

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

Cobalah online!

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

Tautan terakhir hanya untuk mengganti 0 (nilai falsey default Jelly, karena semua daftar diindeks satu) dengan -1. Jika Anda menganggap 0 nilai falsey OK, programnya adalah 8 byte .

Harry
sumber
1
Beberapa catatan: (1) Anda menggunakan setiap tautan bantu sekali saja, jadi tidak ada alasan untuk membuat tautan pembantu. Cukup gunakan $ƊƲµ. (2) Karena string -1dan angka -1identik saat output, menggunakan nomor menyimpan 2 byte. (3) Padalah singkatan ×/. (4) Gagal input 3125.
user202729
@ user202729 Terima kasih banyak! Saya menerapkan (1), (2), dan (3) dan mereka menyelamatkan 6 byte! Jika saya mengubah ⁵ menjadi ³, itu berfungsi pada input 3125 tetapi hanya setelah penundaan yang cukup lama. Apakah Anda tahu apakah ada cara yang lebih baik (dan lebih pendek), atau apakah pendekatan saya (yang saya tahu pasti bukan yang tercepat dalam hal kompleksitas waktu) sebaik yang didapat?
Harry
1
Saya pikir _¬$harus bekerja lebih’¹¬?
dylnan
1
o-bahkan lebih pendek.
user202729
@ Dylnan Terima kasih - Saya perhatikan bahwa karena µsaya hanya bisa menggunakan tanpa $yang disimpan 2 byte! Tapi kemudian saya sadar bahwa o-saya bisa menghilangkan µseluruhnya dan menghemat 3 byte!
Harry
1

Ruby (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
sumber
0

Python 2 , 89 byte

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)

Cobalah online!

Hanya karena belum ada jawaban Python. Benar-benar menyakitkan karena tidak memiliki konversi tipe implisit antara string dan int.

Bubbler
sumber