자체 합계


12

숫자를 자릿수로 변환

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

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

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

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

하나 더 예를 들어 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. 두 자리 숫자는 빠르며 입력이 클 때는 엄청나게 느립니다.

이 함수 f는 n0을 필터링하는 동안 입력 번호 를 숫자 목록으로 변환합니다 . 그런 다음이 목록과 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.