자체 합계


12

숫자를 자릿수로 변환

어떤 합계도 아님 : 가장 짧은 합계 가 필요합니다
. 어떤 숫자도 아님 : 숫자의 숫자 만 사용할 수 있습니다


당신은정수로 입력 받을 것입니다n>0

말해 보자 n=27. 당신은 표현이 27A와 합을 사용하여, 단지 숫자를 [2,7] 에, 가장 짧은 가능한 방법. 주어진 숫자의 모든 숫자를 사용할 필요는 없습니다!

그래서 27=2+2+2+7+7+7. 우리는 그 숫자를 가지고 그들을 계산 : [2,2,2,7,7,7].
에 대한 최종 답변 n=276

하나 더 예를 들어 n=195얻기 위하여 짧은 합 우리는 다음과 같은 숫자를 사용할 필요가 :
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]대답 입니다23

도전

integer가 주어지면 이 숫자와 합한 최소 자릿수 ( 숫자에 포함)를 n>0출력하십시오.

테스트 사례

Input->Output

1->1  
2->1  
10->10  
58->8  
874->110  
1259->142  
12347->1765  
123456->20576  
3456789->384088  

이것은 입니다. 바이트 단위의 가장 빠른 답변이 승리합니다!


합산 할 수없는 숫자가 있거나 입력 될 수 있습니까?
Stephen

1
@Stephen 그들은 모두 할 수 있습니다!

7
@Stephen 모든 숫자는 d_0 + 10 * d_1 + 100 * d_2 등으로 표현 될 수 있기 때문에 ...
geokavel

입력을 string, char-array 또는 integer-array로 취할 수 있습니까?
Kevin Cruijssen

1
@ KevinCruijssen 문자열은 괜찮습니다. 문자 배열 또는 정수 배열은 아닙니다.

답변:


4

껍질 , 12 바이트

Lḟo=⁰ΣṁΠḣ∞d⁰

두 자리 숫자를 매우 빠르게 처리합니다. 온라인으로 사용해보십시오!

설명

Lḟo=⁰ΣṁΠḣ∞d⁰  Input is n, say n = 13.
          d⁰  Digits of n: [1,3]
         ∞    Repeat infinitely: [[1,3],[1,3],[1,3],[1,3]...
        ḣ     Prefixes: [[],[[1,3]],[[1,3],[1,3]],[[1,3],[1,3],[1,3]],...
      ṁ       Map and concatenate
       Π      Cartesian product: [[],[1],[3],[1,1],[3,1],[1,3],[3,3],[1,1,1],[3,1,1],...
 ḟo           Find the first element
     Σ        whose sum
   =⁰         equals n: [3,3,3,3,1]
L             Return its length: 5

2

Pyth , 12 바이트

lef!-TsM`Q./

온라인으로 사용해보십시오!

불행히도 최대 입력에서 메모리 오류가 발생합니다 58.

설명

lef!-TsM`Q./
          ./    All lists of integers that sum to [the input]
  f             Filter for:
    -TsM`Q           Remove all occurrences of the digits in the input
   !                 Check if falsey (i.e. an empty list)
le              Length of the last occurrence, which is the shortest because all the
                filtered partitions share the same digit pool

설명을 추가 하시겠습니까?
요나

@Jonah 설명이 추가되었습니다.
notjagan

1
감사. Pyth가 근본적으로 문제를 해결하는 기본 요소를 가지고 있다는 것에 흥미를 느낀다../
Jonah

12 바이트 대안 : lef<.{TjQ;./(필터-올바른 하위 집합-입력 숫자)
Mr. Xcoder

2

Mathematica, 78 바이트

(t=1;While[(s=IntegerPartitions[x=#,t,IntegerDigits@x])=={},t++];Tr[1^#&@@s])&  

5 초 안에 마지막 테스트 사례를 찾습니다


조금 더 짧은 :Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
Kuba

2

R , 78 바이트

function(n){while(all(F-n)){F=outer(F,n%/%10^(0:nchar(n))%%10,"+")
T=T+1}
T-1}

온라인으로 사용해보십시오! (골프 버전)

순수한 무차별 대입 알고리즘이므로 실제로 모든 테스트 사례를 해결하지는 못하고 마지막 테스트 사례에 대해 40,000GB를 할당하려고 시도한 것 같습니다.

TR에서는 기본값으로 1돌아가서 반환 단계에서 수정하는 개별 오류가 발생하지만 F어떤 기본 값을 0지불 해야 하는지를 얻 습니다.

풀리지 않은 설명 :

function(n){
 d <- n%/%10^(0:nchar(n))%%10   # digit list with a 0 appended at end
 d <- unique(d[d>0])            # filter zeros (not technically necessary)
                                # and get unique digits
 x <- 0                         # storage for sums
 i <- 0                         # counter for number of sums done
 while(!any(x==n)){             # until we find a combination
  x <- outer(x,d,"+")           # take all sums of x and d, store as x
  i <- i + 1}                   # increment counter
i}                              # return counter

온라인으로 사용해보십시오! (골프 버전이 적음)


2

파이썬 2 168 155 144 바이트

가장 짧지 는 않지만 런타임 측면 에서 가장 좋지는 않지만 실제로는 나쁘지 않습니다 .

n=input()
g=sorted(set(n)-{0})[::-1]
def h(k):
 if k<0:return
 if`k`in g:return 1
 for d in g:
  f=h(k-int(d))
  if f:return 1+f
print h(int(n)) 

filter(None...내가 이것을하는 동안 내가 할 수 배운 숫자로 0을 제거하는 것입니다.

가장 큰 문제는 파이썬 스택 프레임입니다. 실제로 가장 큰 입력에서이를 실행할 수 없습니다. 따라서 올바른 해결책이 아닙니다. 실제로 재난 제한을 늘려서 세그 결함을 일으켰습니다. 이것은 루프와 스택 또는 파이썬에서 작동하기 위해 훨씬 더 영리해야합니다.

편집 : caird와 Chas Brown에게 13 바이트 감사합니다!


input입력을 따옴표로 묶고 사용 하도록 요구할 수 있습니다 .
caird coinheringaahing

2
이론적으로 성공하는 한 물리적 한계로 인해 실패하는 것은 완벽하게 허용됩니다.
Jonathan Allan

로 교체 filter(None,sorted(map(int,set(n)))[::-1])하여 9 바이트를 절약하십시오 sorted(set(map(int,n))-{0})[::-1]( None알아두면 꽤 좋지만).
Chas Brown

@ChasBrown 대부분의 경우 filter(len,...)목록과 문자열, filter(abs,...)정수 및 부동 소수점에 사용할 수 있습니다 .
ovs


0

자바 스크립트 (ES6), 82 바이트

f=(n,l=0,a=n,[c,...b]=a)=>n?1/c?Math.min(!+c|+c>n?1/0:f(n-c,l+1,a),f(n,l,b)):1/0:l
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

입력을 문자열로받습니다.


왜 사용하고 있는지 설명 할 수 있습니까 1/0?
Zacharý

1
@ Zacharý 가장 짧은 합계, 즉 최소 자릿수를 원합니다. 유효하지 않은 솔루션으로 이어지는 시도는 계산하지 않아야하므로 제외하기 위해 Infinity (무한대)로 점수에 영향을 미치지 않습니다.
Neil

오, 그것이 재귀 적이라는 것을 몰랐다.
Zacharý

@ Zacharý 비 f=재귀 람다에 필요하지 않기 때문에 처음에는 큰 실마리가됩니다.
Neil

0

루비 , 70 바이트

->n{w,s=n.digits,0;s+=1while !w.product(*[w]*s).find{|x|x.sum==n};s+1}

매우 느리게, 가능한 모든 조합을 시도하여 솔루션에 도달 할 때까지 크기를 늘리십시오.

TIO의 Ruby 2.4 감사합니다.

온라인으로 사용해보십시오!


0

젤리 , 23 바이트

D;0ṗµḟ€0
ÇS€=µT
Çị1ĿL€Ṃ

온라인으로 사용해보십시오!

시간이 너무 길어서 TIO에서 세 번째 사례 이후 테스트 사례에 대해 실행되지 않도록 너무 비효율적입니다.> _ <

모든 골프 팁을 환영합니다!


0

파이썬 (2) , 183 (176) 172 166 161 바이트

def f(n,D=0,p=0,b=0):
	D=D or set(map(int,`n`))-{0}
	d=min(D);c=0;D=D-{d}
	q=[p+n/d,b][n%d>0]
	while c<min(D or{0}):q=b=f(n-c*d,D,p+c,b);c+=1
	return[q,b][q>b>0]

온라인으로 사용해보십시오!

다른 Python 답변보다 987654321길지만 TIO에서 1 초 이내에 모든 테스트 사례를 결합하여 수행합니다 .

d1<d2숫자 인 경우 d2-1 d1합계 에 최대 개수가 필요 하다는 사실을 이용합니다 ( d2인스턴스를 더 짧은 합계의 인스턴스 d1로 대체 할 수 있으므로 ). 따라서 숫자를 오름차순으로 정렬하면 고려할 수 있는 최대 합계 가 "단지"입니다 . 최대 재귀 깊이는 (의 값에 관계없이 )입니다.d1d29! = 3628809n


0

하스켈 , 91 바이트

f n=[read[c]|c<-show n,c>'0']#n!!0
s#n|n>0,x:m<-(s#).(n-)=<<s=[1+minimum(x:m)]|1<3=[0|n==0]

온라인으로 사용해보십시오! 사용법 예 : f 58yields 8. 두 자리 숫자는 빠르며 입력이 클 때는 엄청나게 느립니다.

이 함수 fn0을 필터링하는 동안 입력 번호 를 숫자 목록으로 변환합니다 . 그런 다음이 목록과 n그 자체가 (#)함수 로 전달되어 단일 목록을 반환합니다. !!0이 싱글 톤리스트의 요소를 돌려줍니다.

(#)옵션 유형으로 싱글 톤 및 빈 목록을 사용합니다. 의 입력을 감안 n=58하고 s=[5,8], 아이디어는 모든 숫자를 빼기하는 것입니다 s에서 n다음 재귀 적으로 적용 (#)하고 자리 단계 및 반환 하나의 최소 숫자를 더한 결과로이 최소 결과 확인. 첫 번째 부분은로 계산되며 이는와 (s#).(n-)=<<s동일합니다 concat(map(s#)(map(n-)s)). 따라서이 예에서는 먼저 [58-5,58-8]계산 된 후 또는 [[5,8]#53,[5,8]#50]결과 가 계산됩니다 . 결과는 패턴 에 일치 하여 목록에 하나 이상의 요소가 있는지 확인하고 ( 그렇지 않으면 실패) 단일 항목 목록에 1을 더한 결과의 최소값이 다시 조정됩니다. 만약[[7],[7]][7,7]concatx:mminimumn0이 작거나 재귀 호출이 빈 목록을 반환하면 검색의 실패한 분기에 있고 빈 목록이 반환됩니다. 경우 n==0분기가 성공되고 [0]반환됩니다.


하스켈 , 101 바이트

f n=[d|d<-[9,8..1],show d!!0`elem`show n]#n!!0
s@(d:r)#n|n>=d,[x]<-s#(n-d)=[x+1]|1<3=r#n
s#n=[0|n==0]

온라인으로 사용해보십시오! 보다 효율적인 방법은 모든 테스트 사례를 1 초 안에 확인합니다.

이번에는 입력의 자릿수 목록이 내림차순으로 계산 (#)되어 가능한 한 자주 가장 큰 자릿수를 사용한 다음 두 번째로 큰 숫자를 사용하여 솔루션을 찾을 수 있습니다. 이 방법으로 찾은 첫 번째 솔루션은 가장 작은 솔루션이기도합니다.

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