与えられた正の整数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
与えられた正の整数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
回答:
~9{{1$1$%!{\1$/1$}*}12*(}8*>{];-1}*]$1or
小さな素数をパワーにグループ化しなかったバージョンを置き換え、その間8文字節約します。注:12 = floor(9 log 10 / log 5)。
謝辞:@mellamokbのトリックをニックにすることで保存された2つのキャラクター。3 @Nabbからのヒントで保存されました。
12345私に-1を与えてください123456789。もし私が十分に長く待つことができれば、それもうまくいくはずです。
n=prompt(m="");for(i=9;i-1;)n%i?i--:(m=i+m,n/=i);alert(n-1?-1:m?m:1)
編集:他のソリューションから入力/出力のアイデアを借用し、出力ロジックを短くしました。
編集2:forループ内の不要な中括弧を削除して2文字を保存しました。
編集3:whileループをでifステートメントとして書き換えて、2文字を保存しましたi++。
編集4:を移動して操作を減らすことで、2文字を節約i。
編集5: ifステートメントを3進形式に変換して、さらに2文字を節約します。
編集6:i-- 3項の真の部分に移動して2文字を節約し、を削除し++iます。
prompt。
m?m:1=>m||1
for(s = ''、i = 2、m = n = prompt(); i <m; i ++)while(!(n%i)){if(i> 9){alert(-1); E( )} n / = i; s + = i}アラート
編集:他の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)
{for(i=9;i>1;$1%i?i--:($1/=i)<o=i o);print 1<$1?-1:o?o:1}
$ d = shift; map {$ m = $ _。$ m、$ d / = $ _ until $ d%$ _} reverse 2..9; print $ d-1?-1:$ m || 1
mellamokbのJavaScriptコードに触発されました。パラメータ付きで実行することを意図
~[{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+\9>[-1]@if$
~{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+$\9>-1@if
編集する
わかりました、このバージョンは今すべてのケースに対して正しい出力を与えると思います:-)
編集2
@Peterの提案ごとに3文字を削った。
1与えること1が重要なテストケースであると上記でコメントした理由は、それが厄介な特別なケースであるということです-数字1が出力に現れる唯一の数値です。そして、それはあなたのコードを壊します、私は恐れています。
[aがない場合は、スタック上のすべてを取得します。また、配列をラップせずに最後の文字を移動することで、末尾近くの2文字を節約できるでしょう。[]-1$
f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])
(show m)に$show m。
m<-[1..9^9]そうでなければいけません....そうでなければ、それは無限のリストです...だから-1決して発生しません...私が間違っている場合は私を修正してください。
×⁵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バイトになります。
$ƊƲµ。(2)出力時の文字列-1と数値-1は同じであるため、数値を使用すると2バイト節約されます。(3)Pはの省略形です×/。(4)入力に失敗します3125。
_¬$はうまくいくと思います’¹¬?
o-さらに短いです。
µ使用できるため、しかし、私は完全に省略して3バイト節約できることに気づきました!_¬$o-µ
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)
Pythonの答えがまだないからといって。stringとintの間の暗黙の型変換が欠けているのは本当に痛いです。
1与えること1は重要なテストケースです。