숫자의 제품


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것은 중요한 테스트 사례입니다.
피터 테일러

1
32, 432, 1296에서 사용한 3 가지와 같이 더 복잡한 경우를 추가해야합니다. 코더를위한 연습으로 두지 않는 한.
mellamokb

@ s-mark 26, 어. 가장 작은 숫자.
fR0DDY

나는 우리가 재미를 위해 명백한 387420489 (9 ^ 9)와 1000000000을 테스트해야한다고 생각합니다.
asoundmove

2
이 오래된 질문이고, 영업 이익은 비활성이기 때문에,이 미래의 게시물에 대한 단지 참고 사항입니다 : "10 초"현재의 표준에 따라 불분명하다 (이에 기계?)
user202729

답변:


4

골프 스크립트, 45 43 40 자

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

작은 소수를 거듭 제곱하지 않은 버전을 대체하고 그렇게하는 동안 8자를 절약합니다. 참고 : 12 = 층 (9 log 10 / log 5).

감사의 말 : @mellamokb에서 속임수를 써서 두 문자를 절약했습니다. 3 @Nabb의 힌트로 저장되었습니다.


1
뭐! 테스트하지 않고 Golfscript를 작성할 수 있습니까? +1, 123456789를 제외하고는 괜찮아 보입니다. 내 컴퓨터에서 1 분 이상 걸리고 프로세스를 종료했습니다. 12345나에게 -1을주십시오. 그래서 123456789오랫동안 기다릴 수 있다면 그것은 효과가 있을 것입니다.
당신

@ S.Mark, 감사합니다. 순진한 인수 분해 알고리즘으로 벗어날 수없는 것 같습니다.
피터 테일러

@ 피터 : 더 복잡한 경우에 대한 잘못된 답변을 제공합니다. 32-> 22222, 48이어야합니다. 432-> 2222333, 689 여야합니다. 1296-> 22223333, 2899 여야합니다.
mellamokb

@mellamokb, 좋은 지적입니다. 다시 작성하고 테스트해야한다고 생각합니다.
피터 테일러

와우, 17 자 이하 더 나은 알고리즘이 필요합니다, lol!
mellamokb

6

자바 스크립트 ( 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 :whileif문을 루프로 다시 작성하여 2자를 저장 했습니다 i++.

편집 4 : 에서 이동하고 작업을 줄임으로써 2자를 저장했습니다 i.

편집 5 : if 문을 3 자 형식으로 변환하여 2 문자를 더 절약하십시오.

편집 6 :i-- 삼항의 실제 부분 으로 이동 하여 2 개의 문자를 저장 하고 제거하십시오 ++i.


함수에만 문자를 세었습니다. 이것은 완전한 프로그램입니까? 여기에서 실행할 수 있습니까? ideone.com
fR0DDY

1
그는 ideone에서 spidermonkey와 자바 스크립트에 대한 비슷한 입력이있는 것처럼 보입니다 -ideone.com/samples#sample_lang_112
YOU

@ fR0DDY : 자, 이제 완전한 프로그램입니다 :)
mellamokb

나는 마침내 내 캐릭터를 69 자로 줄 였지만 이제는 같은 아이디어와 prompt일로 도 그렇게 할 수 있습니다 .
Ry-

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

4

자바 스크립트, 88 72 78 74 69 68

for (s = '', i = 2, m = n = 프롬프트 (); i <m; i ++) ({(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(s='',i=9,n=prompt();i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s: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

또한 입력 1. 유무 1. 처리하는 특별한 경우 확인에 실패
mellamokb

나는 "최소한"부분을 놓쳤다.
Ry-

@minitech : 여전히 입력 '1'에서 작동하지 않습니다. lol, 우리의 답변은 거의 똑같습니다 :-)
mellamokb

아, 당신보다 2자를 더 짧게 만들었습니다! : 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}

하나의 입력에 대해서만 프로그램을 호출합니다. 정확성을 확인하기 위해 여러 입력이 제공됩니다.
fR0DDY

3

(75) (72)

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

mellamokb의 자바 스크립트 코드에서 영감을 얻었습니다. 매개 변수로 실행되어야 함


매개 변수 대신 stdin을 사용하면 더 짧지 않습니까?
asoundmove

3

골프 스크립트 ( 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가 출력에 나타나는 유일한 숫자이기 때문 입니다. 그리고 코드가 손상됩니다.
피터 테일러

또한 9보다 큰 소수로 나눌 수있는 숫자에 대해서도 깨집니다.
Peter Taylor

@ 피터 : 좋아, 다시 시도하십시오. 이 버전은 현재 모든 테스트 사례에서 작동한다고 생각합니다.
mellamokb

그렇습니다. 당신은 먼저 제거하여 바로 하나 개의 문자를 저장할 수 있습니다 [- 당신이없는 경우 [스택에 당신이 평가하는 경우 ]는 스택에 모든 것을합니다. 그리고 -1배열을 감싸지 않고 final을 이동하여 끝 부분에 두 문자를 저장할 수 있습니다 $.
피터 테일러

@ 피터 : 감사합니다, 3 문자를 더 저장했습니다!
mellamokb

3

하스켈

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

로 변경 (show m)하여 하나의 문자 를 제거하십시오 $show m.
FUZxxl

1
이 안된다 m<-[1..9^9].... 그렇지 않으면 너무 ... 무한 목록의 -1내가 틀렸다면 정정 해줘 .... 발생하지 않습니다.
st0le

나는 그것이 10secs 안에 작동 할 수 있다고 생각하지 않는다 ....
st0le

2

윈도우 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가 사용하는 펄에 잘 번역 할 중첩 된 루프를 방지하기 위해 그 멋진 트릭처럼하지만 당신은 사용할 수 없기 때문에 훨씬 더 자세한 나오면 foreach더 이상 스타일의 루프를. 또한 펄이 map루프 라고 생각하지 않는 것이 유감입니다 redo.


2

스칼라 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 (Jelly의 기본 잘못된 값, 모든 목록이 한 인덱스이므로) 만 -1로 바꿉니다. 0을 잘못된 값으로 간주하면 프로그램은 8 바이트 입니다.


1
참고 사항 : (1) 각 보조 링크를 한 번만 사용하므로 보조 링크를 만들 이유가 없습니다. 를 사용하십시오 $ƊƲµ. (2) 출력시 문자열 -1과 숫자 -1가 동일하므로 숫자를 사용하면 2 바이트가 절약됩니다. (3) P은 축약 형입니다 ×/. (4) 입력에 실패했습니다 3125.
user202729

너무 감사합니다! 나는 (1), (2) 및 (3)을 구현했으며 6 바이트를 절약했습니다! ⁵를 ³로 변경하면 입력 3125에서 작동했지만 상당한 지연 후에 만 ​​작동했습니다. 더 나은 (그리고 더 짧은) 방법이 있는지 또는 나의 접근 방식 (시간 복잡성 측면에서 가장 빠르지는 않다는 것을 알고 있습니까)을 알고 있습니까?
Harry

1
나는 _¬$해결해야 한다고 생각 한다’¹¬?
dylnan

1
o-더 짧습니다.
user202729

@dylnan 주셔서 감사합니다 - 나는 때문에의 발견 µ난 그냥 사용할 수 를 빼고 $있는 2 바이트를 저장! 그러나 나는 완전히 o-생략하고 µ3 바이트를 절약 할 수 있음을 깨달았습니다 !
Harry

1

루비 (100)

n=gets.to_i;(d=1..9).map{|l|[*d].repeated_combination(l){|a|a.reduce(:*)==n&&(puts a*'';exit)}};p -1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.