桁の積


10

与えられた正の整数Nに対して、Mの数字の積がNに等しくなるような最小の自然Mを見つける完全なプログラムを作成します。Nは1,000,000,000未満です。Mが存在しない場合は、-1を出力します。どのような場合でも、コードは10秒を超えてはなりません。

Sample Inputs
1
3
15
10 
123456789
32
432
1296

Sample Outputs
1
3
35
25
-1
48
689
2899

4
1与えること1は重要なテストケースです。
Peter Taylor

1
以下で使用した3つのように、より複雑なケースを追加する必要があります。32、432、1296。コーダーの演習として残さない限り。
mellamokb

@ s-mark 26、ええ。最小数。
fR0DDY 2011

明らかな387420489(9 ^ 9)と1000000000もテストする必要があると思います。
asoundmove 2011

2
これは古い質問であり、OPは非アクティブであるため、これは今後の投稿へのメモにすぎません。「10秒」は現在の標準(どのマシン上か)に応じて不明確です
user202729

回答:


4

Golfscript、45 43 40文字

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

小さな素数をパワーにグループ化しなかったバージョンを置き換え、その間8文字節約します。注:12 = floor(9 log 10 / log 5)。

謝辞:@mellamokbのトリックをニックにすることで保存された2つのキャラクター。3 @Nabbからのヒントで保存されました。


1
何!それをテストせずにGolfscriptを書くことができますか?+1、123456789を除いて正常に見えますが、私のマシンで1分以上かかり、プロセスを強制終了しました。12345私に-1を与えてください123456789。もし私が十分に長く待つことができれば、それもうまくいくはずです。
YOU

@ S.Mark、ありがとう。素朴な因数分解アルゴリズムではうまくいかないようです。
Peter Taylor、

@ピーター:より複雑なケースでは間違った答えを出します。32-> 22222、48にする必要があります。432-> 2222333、689にする必要があります。1296-> 22223333、2899にする必要があります。など
mellamokb

@mellamokb、良い点。書き直してテストする必要があると思います。
Peter Taylor、

すごい、17文字少ない。もっと良いアルゴリズムが必要です、笑!
mellamokb 2011

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/

編集:他のソリューションから入力/出力のアイデアを借用し、出力ロジックを短くしました。

編集2:forループ内の不要な中括弧を削除して2文字を保存しました。

編集3:whileループをでifステートメントとして書き換えて、2文字を保存しましたi++

編集4:を移動して操作を減らすことで、2文字を節約i

編集5: ifステートメントを3進形式に変換して、さらに2文字を節約します。

編集6:i-- 3項の真の部分に移動して2文字を節約し、を削除し++iます。


関数だけの文字を数えました。これは完全なプログラムですか?ここで実行できますかideone.com
fR0DDY

1
彼がリンクしたideoneにspidermonkeyを持つjavascriptに同様の入力があるようです-ideone.com/samples#sample_lang_112
YOU

@ fR0DDY:OK、今では完全なプログラムになっています:)
mellamokb '29

ようやく私のキャラクターを69文字に減らしましたが、今でも同じようなアイデアとことでそれを行うことができますprompt
Ry- 2011

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

4

JavaScript、88 72 78 74 69 68

for(s = ''、i = 2、m = n = prompt(); i <m; i ++)while(!(n%i)){if(i> 9){alert(-1); E( )} n / = i; s + = i}アラート
4文字長くなりますが、実際には(関数ではなく)実行可能なスクリプトです。

編集:他のJavaScriptのアイデアを使用して、これを次のように減らすことができます。

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

最後に!69文字のソリューション、1 forループのみを使用します;)

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

さて、カンマを1つ削ります。

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

GolfScriptソリューションと同じ問題。入力32、432、および1296で失敗します。9から開始して後方に移動し、左ではなく右から連結するのには理由があります。
mellamokb 2011

また、持っているが、1を処理するために、特別なケースを作るために、入力1で失敗した
mellamokb

変更された「最小限の」部分を逃しました。
Ry- 2011

@minitech:入力「1」ではまだ機能しません。笑、私たちの答えは、ほぼ正確に同じになるように出てきている:-)
mellamokb

ああ、なんとあなたより2文字短くなりました!:D
Ry- 2011

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}

1つの入力に対してのみプログラムを呼び出しています。正確さを確認するためだけに複数の入力が与えられます。
fR0DDY

3

パール(75)(72)

$ d = shift; map {$ m = $ _。$ m、$ d / = $ _ until $ d%$ _} reverse 2..9; print $ d-1?-1:$ m || 1

mellamokbのJavaScriptコードに触発されました。パラメータ付きで実行することを意図


パラメータの代わりに標準入力を使用した場合、短くなることはありませんか?
asoundmove

3

GolfScript(60 57)

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

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

編集する

わかりました、このバージョンは今すべてのケースに対して正しい出力を与えると思います:-)

編集2

@Peterの提案ごとに3文字を削った。


1与えること1が重要なテストケースであると上記でコメントした理由は、それが厄介な特別なケースであるということです-数字1が出力に現れる唯一の数値です。そして、それはあなたのコードを壊します、私は恐れています。
Peter Taylor、

それは9より大きい素数で割り切れる数字にも休憩
ピーター・テイラー

@ピーター:わかりました、もう一度やり直してください。このバージョンは現在、すべてのテストケースで機能すると思います。
mellamokb 2011

はい、そうです。最初に1文字を削除することで、すぐに1文字を保存できます。評価時にスタックに[aがない場合は、スタック上のすべてを取得します。また、配列をラップせずに最後の文字を移動することで、末尾近くの2文字を節約できるでしょう。[]-1$
Peter Taylor

@ピーター:ありがとう、さらに3文字節約しました!
mellamokb 2011

3

ハスケル

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

変更することで、1つの文字を剃り落とす(show m)$show m
FUZxxl 2011

1
m<-[1..9^9]そうでなければいけません....そうでなければ、それは無限のリストです...だから-1決して発生しません...私が間違っている場合は私を修正してください。
st0le

私は....それは10secs内で動作することができないと思います
st0le

2

Windows PowerShell、87

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

2

パール(68)

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

@mellamokbがネストされたループを回避するためにJavaScriptで使用する素晴らしいトリックのようにperlにうまく変換されるようですが、foreachスタイルループをもう使用できないため、はるかに冗長になります。perlがmapループだと思っていないのも残念ですredo


2

scala 106文字:

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)

テストと呼び出し:

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)

応答時間:直ちに、2Ghz CPUで1秒未満。


2

ゼリー18 13 10バイト

×⁵RDP$€io-

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

13バイトのソリューション:

×⁵RDP$€iµ’¹¬?

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

入力による説明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バイトのソリューション:

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

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

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

最後のリンクは、0(すべてのリストが1インデックスであるので、Jellyのデフォルトの偽の値)を-1に置き換えるだけです。0をOKの偽の値と見なすと、プログラムは8バイトになります


1
注意事項:(1)各補助リンクは1回だけ使用するため、補助リンクを作成する必要はありません。だけを使用してください$ƊƲµ。(2)出力時の文字列-1と数値-1は同じであるため、数値を使用すると2バイト節約されます。(3)Pはの省略形です×/。(4)入力に失敗します3125
user202729 2018年

@ user202729ありがとうございます!(1)、(2)、(3)を実装したところ、6バイト節約されました!⁵を³に変更すると、入力3125で機能しましたが、かなりの遅延が発生しました。より良い(そしてより短い)方法があるのか​​、それとも私のアプローチ(時間の複雑さの点で私が間違いなく最速ではないことを知っています)がそれよりも優れているかどうかを知っていますか?
ハリー

1
_¬$はうまくいくと思います’¹¬?
ディルナン

1
o-さらに短いです。
user202729

@dylnanありがとう-2バイトを節約したなしでµ使用できるため、しかし、私は完全に省略して3バイト節約できることに気づきました!$o-µ
ハリー


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