주어진 양의 정수 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 = 층 (9 log 10 / log 5).
감사의 말 : @mellamokb에서 속임수를 써서 두 문자를 절약했습니다. 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-- 삼항의 실제 부분 으로 이동 하여 2 개의 문자를 저장 하고 제거하십시오 ++i.
prompt일로 도 그렇게 할 수 있습니다 .
m?m:1=>m||1
for (s = '', i = 2, m = n = 프롬프트 (); i <m; i ++) ({(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(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)
$ d = shift; map {$ m = $ _. $ m, $ d / = $ _ until $ d % $ _} 역 2..9; print $ d-1? -1 : $ m || 1
mellamokb의 자바 스크립트 코드에서 영감을 얻었습니다. 매개 변수로 실행되어야 함
~[{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+\9>[-1]@if$
~{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+$\9>-1@if
편집하다
좋아, 나는이 버전이 모든 경우에 올바른 출력을 제공한다고 생각한다 :-)
편집 2
@Peter의 제안에 따라 3 문자를 줄였습니다.
1주는 1것이 중요한 테스트 사례 라고 위에서 언급 한 이유 는 그것이 불쾌한 특수 사례이기 때문에 숫자 1가 출력에 나타나는 유일한 숫자이기 때문 입니다. 그리고 코드가 손상됩니다.
[- 당신이없는 경우 [스택에 당신이 평가하는 경우 ]는 스택에 모든 것을합니다. 그리고 -1배열을 감싸지 않고 final을 이동하여 끝 부분에 두 문자를 저장할 수 있습니다 $.
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 초 미만
×⁵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 바이트 입니다.
$ƊƲµ. (2) 출력시 문자열 -1과 숫자 -1가 동일하므로 숫자를 사용하면 2 바이트가 절약됩니다. (3) P은 축약 형입니다 ×/. (4) 입력에 실패했습니다 3125.
_¬$해결해야 한다고 생각 한다’¹¬?
o-더 짧습니다.
µ난 그냥 사용할 수 _¬를 빼고 $있는 2 바이트를 저장! 그러나 나는 완전히 o-생략하고 µ3 바이트를 절약 할 수 있음을 깨달았습니다 !
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)
아직 파이썬 답변이 없기 때문에. 문자열과 int 사이의 암시 적 유형 변환이 부족한 것은 정말 고통 스럽습니다.
1주는1것은 중요한 테스트 사례입니다.