桁の積がNであるx桁の数を求める


8

2つの数値Nとxを指定して、桁の積がNであるx桁の数値の数を求めます

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

Sample Input:
8 3
Sample Output:
10

最短のコード長または最短のランタイム?これのようで、codelength?<1000(たとえば)の最短ランタイムがより意味のあるターゲットになるでしょう。
smci

わかりません:2桁のxとN、x = 8、N = 3は、製品が3の場合は8桁を意味します。3は素数であるため、3111 ... 1、1311 ... 1、113のみとなります。 ...-8つの可能性。何が欠けていますか?
ユーザー不明

@userunknown逆です。製品が8の場合は3桁です。(
222、811、181、118

@breadbox:その間私はそれを認識しましたが、説明は修正する必要があります。Nとxの2つの数値を指定している場合、xとNの2つの数値を指定していると主張すべきではありません(これも見出しの順序です)。
ユーザー不明

回答:


3

Python 208文字

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$=},,\;

入力:(スペースで区切られた)数値Nxコマンドライン引数として期待されます。

プログラムはここでテストできます


私はテストCode took longer than 5 seconds to run, so it was aborted.し、パラメータを逆にして得ました。:)
ユーザー不明

@userunknownそうですね。コードがx4を超えると、非常に非効率になります。たとえば、パラメーター3 5を指定して自分のマシンで実行すると、30秒以上後に結果が得られます。だから3 8私はそれが数時間かもしれないと思う...
クリスティアンルパスク

私はこのGolfscript-thingyを調べたことはありません。ほとんどいつも遅いですか?
ユーザー不明

@userunknown Golfscriptの目的は速度ではなく、少し遅いことがわかっています。ただし、この場合、非常に非効率なのはアルゴリズムです。しかし、コードは短いです:)
Cristian Lupascu

1
@ userunknown、GolfScriptはRubyで解釈されます。また、すべての値は不変であるため、多くのコピーが含まれます。これは高速である傾向がなく、RAMモデルで通常分析されるアルゴリズムの漸近ランタイムにnの1または2の累乗を追加することがよくあります。
Peter Taylor

2

Brachylog(2)、13バイト、言語のポストデートチャレンジ

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

オンラインでお試しください!

説明

{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}

ここで使用される巧妙なゴルフトリックの1つは、ほとんどすべてのメタ述語とは異なり.(メタ述語の出力を作成するために通常使用される)の実際の値をまったく気にしません。そのため、.他の変数と同様に使用できます(バイトは暗黙的にの前に現れるため、バイトを節約します})。ここには暗黙のラベル付けはありません。そのため何かをカウントするためにを使用して明示的なラベル付けを追加する必要がありました。


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

非ゴルフ、デバッグフレンドリーバージョン:

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
}

デバッグ出力を伴う呼び出し:

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

simplyscala.comでテストしたところ、非常に高速です。パフォーマンスの+1。
クリスティアンルパスク

0

Python(まだ作業中)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);}

このC#メソッドは、x桁の積がである桁数を返しますn。これは、その名前空間を必要とSystemし、System.Linq現在のコンテキストにインポートされます。

オンライン版:http : //ideone.com/0krup


0

Haskell 117文字

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バイト

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

すべてのx数字を生成し、それぞれを基数10に変換してから、各数値の積を求め、各数値が左側と等しいかどうかをテストしてから、各ブール値の合計を求めます。


0

ゼリー、12バイト、言語後日チャレンジ

,’⁵*r/ḊDP€ċƓ

オンラインでお試しください!

コマンドライン引数としてxを取り、標準入力ではNを受け取ります。

説明

,’⁵*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

難しいのは、x桁の数値のリストを生成することです。そのような最小の数は10 x −1であり、最大の数は10 x −1です。ここでの範囲は、最初にペア(xx -1)を生成し、次にそれらの両方の10乗を行い、次にそれらの間の範囲を生成することによって生成されます。範囲には、デフォルトで両方のエンドポイントが含まれます。念のNが 0であることを起こる、我々は(それが「後方」の範囲ですので、最初に来る)レンジ使用の上端を削除する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.