Temukan jumlah angka x-digit yang produk digitnya adalah N


8

Diberi dua angka N dan x, cari jumlah angka x-digit yang produk digitnya adalah N

limits: N(<10^6) and x(<12)

Sample Input:
8 3
Sample Output:
10

Panjang kode terpendek atau runtime terpendek? Tampaknya untuk yang ini, runtime terpendek dengan codelength? <1000 (katakanlah) akan menjadi target yang lebih bermakna.
smci

Saya tidak mengerti: 2 digit x dan N, x = 8, N = 3 berarti 8 digit di mana produk tersebut adalah 3. Karena 3 adalah prima, maka hanya 3111 ... 1, 1311 ... 1, 113 ... - 8 kemungkinan. Apa yang saya lewatkan?
pengguna tidak dikenal

@ penggunaunknown Ini sebaliknya: tiga digit di mana produk itu delapan. (222, 811, 181, 118, dan enam cara untuk mengatur 1,2,4, saya percaya.)
kotak roti

@breadbox: Sementara itu saya mengenali itu, tetapi deskripsi harus diperbaiki. Jika saya memberikan dua angka N dan x, tidak boleh diklaim bahwa saya diberi dua angka x dan N (yang merupakan urutan dalam informasi utama juga).
pengguna tidak diketahui

Jawaban:


3

Python 208 karakter

def dec(num, num_dig):
    if num_dig==0:
        return int(num==1)
    else:
        return sum(dec(num/i, num_dig-1) for i in range(1,10) if num/i*i==num)

if __name__ == "__main__":    
    print dec(8,3)

3

Golfscript 42 31

~10\?.10/\,>{10base{*}*1$=},,\;

Input: Mengharapkan angka Ndan xsebagai argumen baris perintah (dipisahkan oleh spasi).

Program dapat diuji di sini .


Saya menguji dan mendapat Code took longer than 5 seconds to run, so it was aborted.dengan parameter terbalik. :)
pengguna tidak diketahui

@ penggunaunknown Anda benar. Kode ini sangat tidak efisien ketika xberjalan di atas 4. Misalnya, jika saya menjalankannya di mesin saya dengan parameter 3 5saya mendapatkan hasilnya setelah 30+ detik. Jadi, 3 8kurasa itu bisa berjam-jam ...
Cristian Lupascu

Saya tidak pernah melihat naskah Golf ini. Apakah ini hampir selalu lambat?
pengguna tidak diketahui

Tujuan @userunknown Golfscript bukanlah kecepatan dan itu diketahui agak lambat. Namun, dalam hal ini algoritma yang sangat tidak efisien. Tetapi kodenya pendek :)
Cristian Lupascu

1
@userunknown, GolfScript ditafsirkan dalam Ruby. Juga, semua nilai tidak berubah, jadi ada banyak penyalinan yang terlibat. Itu tidak cenderung cepat, dan sering dapat menambahkan satu atau dua dari n ke runtime algoritma asimptotik yang biasanya dianalisis dalam model RAM.
Peter Taylor

2

Brachylog (2), 13 byte, tantangan tanggal bahasa

{h.&t~lℕẹ≜×}ᶜ

Cobalah online!

Penjelasan

{h.&t~lℕẹ≜×}ᶜ
{          }ᶜ   Count the number of
         ≜      values at this point
   &t           formed via taking the last element of the input,
       ℕ        generating an integer
     ~l         of that length,
        ẹ       and splitting it into digits
          ×     such that the product of those digits
 h.             is the first element of {the input}

Salah satu trik golf rapi yang digunakan di sini adalah tidak seperti hampir semua metapredicate, tidak peduli sama sekali tentang nilai aktual .(yang biasanya digunakan untuk membangun output untuk metapredicate); dengan demikian, .dapat digunakan seperti variabel lain (menyimpan byte karena itu muncul secara implisit sebelumnya }). Tidak ada labelisasi implisit di mana pun di sini, jadi saya harus menambahkan labelisasi eksplisit menggunakan untuk memberikan sesuatu untuk dihitung.


1

Scala 107:

def f(N:Int,x:Int,s:Int=1):Int=if(s==N&&x==0)1 else
if(s>N||x==0)0 else
((1 to 9).map(i=>f(N,x-1,s*i))).sum

ungolfed, versi debugfriendly:

def findProduct (N: Int, sofar: Int, togo:Int, collected:String=""):Int={
  if (sofar == N && togo == 0) {
    println (collected)
    1
  } else
  if (sofar > N || togo == 0) 0 else 
  (1 to 9).map (x=> findProduct (N, sofar*x, togo-1, collected + " " + x)).sum
}

Doa dengan hasil debug:

scala> findProduct (3, 1, 8)
 1 1 1 1 1 1 1 3
 1 1 1 1 1 1 3 1
 1 1 1 1 1 3 1 1
 1 1 1 1 3 1 1 1
 1 1 1 3 1 1 1 1
 1 1 3 1 1 1 1 1
 1 3 1 1 1 1 1 1
 3 1 1 1 1 1 1 1
res175: Int = 8

scala> findProduct (8, 1, 3)
 1 1 8
 1 2 4
 1 4 2
 1 8 1
 2 1 4
 2 2 2
 2 4 1
 4 1 2
 4 2 1
 8 1 1
res176: Int = 10

Saya sudah mengujinya di simplyscala.com dan itu sangat cepat. +1 untuk kinerja.
Cristian Lupascu

0

Python (masih mengerjakannya) 164

from itertools import *
N,x=map(int,raw_input().split())
print len([c for c in product([d for d in range(1,10)if N%d==0],repeat=x) if reduce(lambda x,y:x*y,c)==N])

0

C # 128

int Z(int n,int x){var i=(int)Math.Pow(10,x-1);return Enumerable.Range(i,i*9).Count(j=>(j+"").Aggregate(1,(a,c)=>a*(c-48))==n);}

Metode C # ini mengembalikan jumlah xangka -digit yang produk digitnya adalah n. Ini membutuhkan ruang nama Systemdan System.Linqdiimpor dalam konteks saat ini.

Versi online: http://ideone.com/0krup


0

Haskell 117 karakter

import Data.Char
main = print $ f 3 8
f n t = length[x|x<-[10^(n-1)..(10^n-1)],foldr(*)1(map digitToInt $ show x)==t]

0

K, 49

{+/x=*/'"I"$''${x@&~x in y}.!:'"i"$10 xexp y,y-1}

.

k){+/x=*/'"I"$''${x@&~x in y}.!:'"i"$10 xexp y,y-1}[8;3]
10

0

J, 40 byte

[:+/[=[:*/"1(10#~])#:(10^<:@])}.[:i.10^]

Menghasilkan semua xangka -digit, mengonversi masing-masing ke basis 10, kemudian menemukan produk dari masing-masing angka, dan menguji apakah setiap angka sama dengan sisi kiri, dan kemudian menemukan jumlah masing-masing boolean.


0

Jelly , 12 byte, tantangan tanggal kiriman bahasa

,’⁵*r/ḊDP€ċƓ

Cobalah online!

Mengambil x sebagai argumen baris perintah dan N pada input standar.

Penjelasan

,’⁵*r/ḊDP€ċƓ
,             On {the input} and
 ’            {the input} minus 1
  ⁵*          take 10 to the power of each of those numbers
    r/        then form a range between them
      Ḋ       without its first element;
       D      treat each element as a list of digits,
        P€    take the product of each of those digit lists,
          ċ   then count the number of times
           Ɠ  the value from standard input appears

Bagian yang sulit adalah membuat daftar angka dengan x digit; angka terendah adalah 10 x −1 , tertinggi adalah 10 x −1. Kisaran di sini dihasilkan melalui pertama-tama menghasilkan pasangan ( x , x −1), kemudian mengambil 10 pangkat keduanya, dan kemudian menghasilkan kisaran di antara mereka. Rentang ini mencakup kedua titik akhir secara default; untuk berjaga-jaga jika N adalah 0, kita perlu menghapus ujung atas dari rentang (yang didahulukan karena itu adalah rentang "mundur") menggunakan .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.