이 값을 고유 한 동전이나 메모로 만들 수 있습니까?


29

입력 된 통화 값을 정수로 동전과 메모의 고유 한 조합으로 표현할 수 있는지 계산하는 프로그램을 작성하십시오. 즉, 동일한 동전 / 메모를 두 번 이상 사용할 수 없습니다.

프로그램은 입력 값을 가져와야하며 입력 또는 언어의 해당 배열을 통해 코인 / 노트 값 목록을 사용할 수 있습니다. 코인 / 노트 목록은 변경 될 수 있어야합니다. 상수를 사용하는 경우 이것이 정의 된 곳이 분명해야합니다.

프로그램은 진실 / 거짓 값을 각각 출력해야합니다.

값을 구성하는 코인 / 노트 목록을 출력 할 필요 는 없습니다 .

영국 파운드 사용 (£ 1.00 = 100 및 £ 420.69 = 42069)

coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]

다음은 true를 출력합니다.

6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)

다음은 false를 출력합니다.

4
209
8889
4242424242
[ANYTHING ABOVE 8888]

대체 테스트 데이터 (미국 달러)

coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]

행운을 빕니다!


4
나는 당신과 같은 더 새로운 이민자를 원합니다 ...
Leaky Nun


2
다른 동전 세트를 사용하여 일부 테스트 케이스를 추가해야합니다
Leaky Nun

2
나는 사용되지 않은 가장 큰 동전, 즉 남은 값을 취하는 탐욕적 휴리스틱으로 해결할 수없는 테스트 사례를 추가 할 것을 제안합니다. 입력이 정렬되지 않고 값을 여러 가지 방법으로 만들 수있는 항목을 갖는 것도 좋습니다. 일반적으로 테스트 케이스에는 누군가가 모든 것에 옳지 않고 테스트 케이스에 적합한 문제를 합리적으로 시도 할 가능성을 피하는 것이 좋습니다.
xnor

2
관련 . 또한 관련 . 이전 질문은 아마도 복제본이지만,이 질문은 더 잘 디자인 된 IMO이며, 중복으로 닫으려면 이전 질문을 닫을 것입니다.

답변:


13

Brachylog 2 (TIO Nexus), 2 바이트

⊇+

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

표준 입력을 통해 또는 프로그램의 시작 부분에 배열 리터럴로 추가하여 동전 목록을 가져옵니다 (작동 할 것이므로 "보다 합법적"이라고 느끼는 것은 귀하에게 달려 있습니다. 전자는 기본적으로 허용됩니다. PPCG 규칙, 후자는 질문에 의해 구체적으로 허용됨); 명령 행 인수로 생성 할 값을 가져옵니다.

설명

이 프로그램은 Brachylog 기능을 위해 TIO Nexus의 래퍼 방식에 대한 구현 세부 사항을 사용합니다. 특히, 출력을 통해 입력을 제공하는 명령 줄 인수를 제공 할 수 있습니다. (이것은 Brachylog의 원래 디자인에서는 구상되지 않았지만 언어는 PPCG에서의 구현에 의해 정의되며 구현이 이루어지면 필요한 것을 수행 할 수 있으므로 이점을 활용할 수 있습니다.) 프로그램은 다음과 같습니다

⊇+
⊇   Some subset of {standard input}
 +  sums to {the first command-line argument}

전체 프로그램으로서 부울 값을 리턴합니다. true.프로그램의 모든 어설 션이 동시에 만족 될 수 있거나 false.그렇지 않은 경우

(알아 두거나 이미 모르는 사람들을 위해 : Brachylog 2는 1 바이트 길이 의 자체 문자 인코딩을 사용합니다 .)


Brachylog에서 ⊇는 단일 바이트라고 말 했으므로 여기에 바이트를 붙여 넣지 마십시오. 나는 그것에 대한 이유가 있다고 생각합니다. 나는 단지 관심있는 문자 인코딩 덩어리입니다.
theonlygusti

1
그들은 디스크 08 2B에 인코딩되어 있습니다 (여기 에서 인코딩을 볼 수 있습니다 ). 특정 인코딩을 나열하지 않은 이유는 관련이 없기 때문입니다. Brachylog는 256 개 이하의 고유 문자를 사용하므로 각각 단일 바이트로 표현할 수 있습니다. 이것은 코드를 더 읽기 쉽게 만들기 위해 골프 언어에 의해 일반적으로 수행됩니다. 대신 코드 페이지 437과 같은 인코딩을 사용할 수 있지만 그렇게하면 아무도 읽을 수 없습니다 .

10

05AB1E , 4 바이트

æOså

설명:

æ      Calculate the powerset of the first input
 O     Sum each element
  s    Put the second input at the top of the stack
   å   Check whether the input is in the powerset sum.

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


모든 사람들이 공식적으로 목록을 압축하도록 오해 한 것 같습니다; p
Leaky Nun

압축 된 목록을 삭제하고 입력으로 이동하면 답변이 삭제 될 때까지 답변이 삭제됩니다.
Leaky Nun

이 공동체는 천재로 가득합니다.
Tobi

5

Mathematica, 25 바이트

!FreeQ[Tr/@Subsets@#,#2]&

첫번째 인수 및 제 인수 대상의 정수이고, 복귀로 코인 값의 배열을 가지고 순수 함수 TrueFalse.



3

망막 , 52 31 바이트

\d+
$*
^((1+) |1+ )+(?<-2>\2)+$

온라인으로 사용해보십시오! 공백으로 구분 된 동전과 메모 목록으로 원하는 값을 입력합니다. 편집 : 내 코드를 디버깅 한 @ Kobi 덕분에 18 바이트가 절약되었습니다. 설명 : 처음 두 줄은 단순히 십진수에서 단항으로 변환합니다. 그런 다음 세 번째 줄은 동전과 메모 목록을 캡처합니다. 이 변경을 통해 엔진은 역 추적하고 특정 코인 / 노트를 캡처하지 않도록 선택할 수 있습니다. 그런 다음 밸런싱 그룹은 캡처 목록의 모든 접미사에 대해 값을 일치시킵니다 (불필요하지만 골퍼).


두 번째 옵션은 엔진이 길이가 0 인 그룹으로 되돌아 가지 않기 때문에 작동하지 않습니다 (성가신 최적화). 당신은 사용할 수 있습니다 ^((1+) )+(\2?(?<-2>)|){99}$(동전의 수에 제한을 34 바이트), 또는 ^((1+) |1+ )+(\2?(?<-2>))+$(도 34 바이트).
Kobi

1
@Kobi 아름다운! 나는 그것이 (?<-2>\2?)작동하는 것을 잊었 기 때문에 두 대답에서 2 바이트를 저장 하고 더 ?이상 필요하지 않기 때문에 두 번째 대답에서 추가 바이트를 저장했습니다 .
Neil


2

자바 (OpenJDK 8) , 125 바이트

boolean f(int[]c,int n){int l=c.length;if(l<1)return n==0;int[]a=java.util.Arrays.copyOf(c,l-1);return f(a,n-c[l-1])|f(a,n);}

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


람다에서 이것을하면 짧아 질 수 있습니다.
Okx

@Okx 재귀 적이므로 더 길어질 수도 있지만 람다를 더 짧게해도하지 않습니다.
Leaky Nun

1
배열을 복사 할 필요가 없으므로 알고리즘의 반복 버전이 훨씬 짧아집니다 boolean f(int[]c,int n){for(int l=c.length;l-->0;n-=n<c[l]?0:c[l]);return n<1;}(79 바이트). Java 8 및 해당 람다를 사용하면 62 바이트로 더 줄일 수 있습니다. 현재의 답변과 관련 int l=c.length-1하여 l대신 사용 하는 l-1것이 더 짧습니다.
Olivier Grégoire


2

자바 스크립트 (ES6), 81 69 67 64 바이트

동전 목록 c과 목표 금액 a을 카레 구문으로 가져옵니다 (c)(a). 반환 0또는 true.

c=>g=(a,m=1)=>c.map((c,i)=>x-=c*(m>>i&1),x=a)&&!x||x-a&&g(a,m+1)

테스트 사례


동전 목록을 가져갈 수 있습니까?
Leaky Nun

@LeakyNun는 "... 그리고 ... 동전 / 노트 값의 목록이 걸릴 수 있습니다"
마틴 청산

1
그래서 나는 목록을 아무것도 인코딩하지 않았습니다 ...
Leaky Nun

@LeakyNun 그것은 그렇게 보인다
Eddie Hart

2

하스켈 , 28 바이트

연산자 함수 (#)는 정수와 정수 목록 (또는 일반적으로 Traversable숫자 컨테이너)을 가져와 a 를 반환합니다 Bool.

로 사용하십시오 6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000].

c#l=elem c$sum<$>mapM(:[0])l

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

작동 원리

  • c원하는 값과 l코인 값의 목록입니다.
  • mapM(:[0])l에 매핑 (:[0])하고 l각 값을 0과 쌍으로 묶은 다음 직교 곱을 구성하여 각 요소가의 해당 값 l또는 0 인 목록을 제공합니다 .
  • sum<$>각 조합을 합산 하고 결과 목록에 elem c$있는지 확인 c합니다.

2

아르 자형, 88 83 바이트

@Jarko Dubbeldam 덕분에 -5 바이트

익명 함수를 반환합니다. 가능한 모든 코인 조합을 생성하고 ( expand.grid쌍에 사용 T,F) 값이 있는지 확인합니다. R에서 예약어 k이므로 동전 c입니다. 한 번에 여러 값을 확인할 수 있습니다.

function(k,v)v%in%apply(expand.grid(Map(function(x)!0:1,k)),1,function(x)sum(k[x]))

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


당신은 대체 할 수 c(T,F)에 의해 !0:1, 그리고 rep(list(!0:1),length(k))에 의해lapply(k,function(x)!0:1)
JAD

1
실제로,Map(function(x)!0:1,k)
JAD

1

Japt , 7 바이트

à mx èN

온라인으로 사용해보십시오! 출력0거짓에 대한 , 진실에 대한 양의 정수.

설명

à mx èN
          // Implicit: U = input array, V = input integer, N = array of all inputs
à         // Take all combinations of U.
  mx      // Map each combination to its sum.
     è    // Count the number of items in the result which also exist in
      N   //   the array of inputs.
          // This returns 0 if no combination sums to V, a positive integer otherwise.
          // Implicit: output result of last expression


1

루비 , 39 바이트

반환 nilfalsy 값 및 truthy 같은 수를 (모든 숫자는 루비 truthy 있습니다) 구성하는 목록에서 가장 작은 동전 값으로.

f=->c,n{n!=0?c.find{|i|f[c-[i],n-i]}:1}

그러나이 알고리즘은 O(C!)시간이 복잡 C하고 코인리스트의 길이가 어디 인지에 따라 엄청나게 느리다는 점에 유의하십시오 . 결국은 완료되지만 대부분의 테스트 사례는 대부분의 온라인 통역사에서 시간 초과됩니다 f(UK_POUND, 5).

여기에 추가 엔딩 조건을 추가하여 훨씬 빠르게 완료되고 실제로 시간 초과하기가 훨씬 더 어려운 41 바이트 버전이 있습니다.

f=->c,n{n>0?c.find{|i|f[c-[i],n-i]}:n==0}

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


1

배쉬 + GNU 유틸리티, 56 39

printf %$2s|egrep "^ {${1//,/\}? {}}?$"

입력 명칭 목록 (정렬되지 않은)은 쉼표로 구분 된 목록으로 제공됩니다. 입력 목록과 값은 명령 줄 매개 변수로 제공됩니다.

쉘 리턴 코드 형식으로 제공된 출력. echo $?스크립트를 실행 한 후 점검 하십시오. 0진실을 의미합니다1 의미합니다.

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

  • printf %$2s 문자열을 출력합니다 value공백 합니다.
  • "^ {${1//,/\}? {}}?$"는 명칭 목록을 정규 표현식으로 확장하는 쉘 확장입니다 ^ {1}? {2}? {5}? {10}? ... $. 그것은egrep정규식 엔진은 교단의 순서에 관계없이 이와 정확하게 일치 할만 큼 똑똑하다는 .
  • egrep 공백 문자열이 정규식과 일치하는지 확인

1

C, 66 바이트

m;v;f(n){for(m=1e5;m/=10;)for(v=5;n-=n<v*m?0:v*m,v/=2;);return!n;}

여기에서 작동 하는지 확인 하십시오 .

C, 53 바이트

g(c,w,n)int*c;{for(;n-=n<c[--w]?0:c[w],w;);return!n;}

이 변형은 동전 배열을 취하는데, 이것은 간단한 빼기로 귀결되기 때문에이 문제의 목적을 무효화합니다.

첫 번째 인수는 코인 배열이고 두 번째 인수는 코인 수이고 세 번째 인수는 값입니다.

C, 48 바이트

g(c,n)int*c;{for(;n-=n<*c?0:*c,*++c;);return!n;}

이전 변형에 대한 대안. 코인 배열을 반대로하고 0으로 종료 할 수 있다고 가정합니다.



0

CJam , 18 17 바이트

q~_,2\m*\f.*::+#)

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

설명

q~                  e# Read and eval input.
  _,                e# Duplicate the money list and take its length.
    2\m*            e# Take the (length)th Cartesian power of [0 1].
        \f.*        e# Element-wise multiplication of each set of 0's and 1's with the money
                    e#   list. This is essentially the powerset, but with 0s instead of 
                    e#   missing elements.
            ::+     e# Sum each set.
               #    e# Find the index of the desired amount in the list. (-1 if not found)
                )   e# Increment. -1 => 0 (falsy), anything else => nonzero (truthy)



0

옥타브, 39 바이트

 @(L,n)any(cellfun(@sum,powerset(L))==n)

코인-값 배열을 첫 번째 인수로 사용하고 대상 정수를 두 번째 인수로 사용하여 true 또는 false를 반환하는 익명 함수입니다.

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


0

수학, 42 바이트

ListQ@NumberDecompose[#,Sort[#2,Greater]]&

입력

[15, {10,5}]

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