디캔팅 문제


23

C 0 ... C N-1 리터 (0 < C <50)와 목표 G 리터를 담을 수있는 N 디켄터 (0 < N <10)가 주어진 경우, 다음 조치 :

  • 디캔터 채우기
  • 디캔터 비우기
  • 붓는 것이 가득 찼거나 붓는 것이 비워 질 때까지 한 디캔터에서 다른 데칸 타로 붓습니다.

목표량 G 는 끝에있는 용기 중 하나에있는 물의 양이어야합니다. '출력 디캔터'를 가질 수 없습니다.

N : 2
C 0 : 5
C 1 : 12
G : 1
결과 : 예

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
결과 : 아니오

힌트 : 가능한지 계산하려면 G 가 용량의 GCD로 나눌 수 있는지 확인하십시오 . 또한 컨테이너에 맞는지 확인하십시오.

이것은 이므로 바이트 수가 가장 적은 코드가 우선합니다.

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes



"출력 디캔터"가 있습니까? 일명, 크기 1의 디캔터가 있으면 용량이 있습니까?
Nathan Merrill

@MartinEnder Ahh. 결정된.
Oliver Ni

@NathanMerrill "출력 디캔터"가 없습니다. 주어진 디캔터 중 하나에서 얻을 수 있어야합니다.
Oliver Ni

9
이 같은 도전은 샌드 박스진행되고 있었습니다 .
xnor

답변:


5

젤리 , 9 8 7 바이트

@Dennis 덕분에 -1 바이트 ( :보다 작지 않은 정수 나누기 사용 )

Ṁ:a⁸g/ḍ

TryItOnline

방법?

Ṁ:a⁸g/ḍ - Main link: capacities, goal
Ṁ       - maximum capacity
 :      - integer division with goal (effectively not less than goal since non-0 is True)
  a     - and
   ⁸    - left argument (capacities)
    g/  - gcd reduce over list (gcd of capacities)
      ḍ - divides

17

하스켈, 35 바이트

l%n=n`mod`foldr1 gcd l<1&&any(>=n)l

이 문서 는 문제를 크게 단순화 한 결과를 보여줍니다. 발의안 제 1 호는

둘 다인 경우 정확하게 목표를 달성 할 수 있습니다.

  • 용량의 최대 공약수 (gcd)의 배수
  • 최대 용량

이 두 가지가 모두 필요한 이유는 분명합니다. 모든 양은 gcd의 배수로 유지되며 목표는 용기에 맞아야합니다. 결과의 핵심은 이러한 조건에 맞는 목표 금액을 생성하는 알고리즘입니다.

%처럼 연산자를 호출하십시오 [3,6,12]%9.

37 바이트 대안 :

l%n=elem n[0,foldr1 gcd l..maximum l]

나는 그 목표가 디캔터 중 하나 에 맞아야한다고 생각한다 . 이것은 가장 큰 디캔터의 양보다 적어야한다 (@Oliver의 코멘트 "주어진 디캔터 중 하나에서 얻을 수 있어야한다").
m-chrzan

편리하게도, 그것은 실제로 논문에서 사용 된 정의이고 잘못 읽었으므로 쉽게 고칠 수 있습니다.
xnor

6

05AB1E , 9 8 9 바이트

CP-1252 인코딩을 사용합니다.

ZU¿%²X>‹‹

설명

          # true if
   %      # target size modulo
ZU¿       # gcd of decanter sizes
        ‹ # is smaller than
    ²X>‹  # target size is less than or equal to max decanter size

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

Luis Mendo의 MATL 답변 에서보다 적은 트릭을 사용하여 1 바이트를 절약했습니다.


1
내가 데니스에서 배운 적은 트릭을 활용 :-)
Luis Mendo

실제 답변은 여전히 ​​9 바이트입니다 ;-)
ETHproductions

@ETHproductions 죄송합니다! 실제 코드가 아닌 설명과 TIO 링크 만 업데이트 한 것 같습니다. 감사합니다 :)
Emigna


5

엑셀 : 43 바이트

=AND(MOD(A10,GCD(A1:A9))=0,A10<=MAX(A1:A9))

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

사용 방법 :
이 공식을 A1-A10을 제외한 모든 곳에 두십시오.
그런 다음 디 캔트 보유 볼륨이 고정되어 있기 때문에 A1 : A9 셀에 디 캔트 보유 볼륨과 A10의 목표를 입력하십시오. 디캔터가없는 셀은 비워 두어야합니다. 당신이 수식을 넣을 때마다 결과가 포함됩니다. 목표를 달성 할 수 있으면 TRUE이고, 달성 할 수 없으면 FALSE입니다.


5

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

(n,a)=>a.some(e=>n<=e)&n%a.reduce(g=(d,e)=>d?g(e%d,d):e)<1

@xnor의 답변의 또 다른 포트. 예, reduce다시 사용할 수 있습니다 !


3
대체 하위 기능 : e=>n<=e시각 회문;)
ETHproductions

4

망막 , 39 바이트

\d+
$*
^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

입력은 쉼표로 구분 된 디캔터 목록, 세미콜론, 대상 볼륨이되어야합니다. 예 :

6,9,21;5

출력이 0(거짓) 또는 1(거친)입니다.

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.

설명

\d+
$*

이것은 입력을 단항으로 변환합니다. 그런 다음 유효한 입력을 단일 정규식과 일치시킵니다.

^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

내부 부품 (?>...)이 GCD를 찾습니다. 1+모든 디캔터와 일치 할 수 있는 가장 큰 하위 문자열 을 찾아서이를 수행합니다 ( ,GCD와 완전히 일치 한 후에 만 선택 사항 허용 ). 원자 그룹 ((?>...) ) 자체는 대상 볼륨을 일치시킬 수없는 경우 정규식 엔진이 GCD의 제수로 역 추적하지 않도록합니다 (그렇지 않으면 그룹 1이 어느 시점에서 단일 일치로 축소 1되고 모든 입력이 진실됨) .

GCD를 찾았 으면 대상 볼륨을 배수로 여러 개 일치 시키려고 시도합니다. (\1+)$ .

마지막으로을 사용하여 디캔터 내에서 볼륨을 일치시킬 수 있는지 확인하여 대상 볼륨이 최대 디캔터 용량보다 크지 않은지 확인합니다 (?<=\3.+).



2

파리 / GP , 31 바이트

매우 간단합니다. 최대 ( vecmax)를 확인하는 것은 비용이 많이 듭니다. 더 잘 할 수 있는지 궁금합니다.

f(c,g)=g%gcd(c)<1&&vecmax(c)>=g

2

펄, 47 바이트

에 +2 포함 -ap

STDIN의 첫 번째 행에서 jar 크기로 실행하고 두 번째 행에서 대상 jar을 실행하십시오.

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

#!/usr/bin/perl -p
$_=($_<@G)>$_%$=;$=--while@G[@F]=grep$_%$=,@F

이 솔루션은 한 줄씩 입력을 처리하고 각각에 대해 무언가를 출력한다는 점에서 특이합니다. 첫 번째 줄의 출력은 비어 있도록 설계되었으며 두 번째 줄은 솔루션을 인쇄합니다. 두 바이트에 손실 ()때문에 <>펄에서 비 연관 될 수 있도록 설계되어있다.

정규식 솔루션도 훌륭하지만 49 바이트입니다.

#!/usr/bin/perl -p
s/\d+/1x$&/eg;$_=/^(?>(1+)( |\1)*:)(\1+)$/&/$3./

(Retina 솔루션에서 도난당한 일부 부품)

이를 위해 STDIN에 공백으로 구분 된 항아리로 입력하고 a :다음에 대상을 지정하십시오 .

decanter.pl <<< "2 5 12:1"

내장 언어 gcd(21 바이트)와 max(7 바이트) 로 언어를 이기기가 어렵습니다 ...


0

스칼라, 90 53 바이트

def h(g:Int,a:BigInt*)=a.max>g&&a.reduce(_ gcd _)%g<1

기본적으로 다른 답변과 동일하게 작동 하지만 scala에는 내장 gcd 기능이 없습니다. 스칼라에는 내장 gcd 기능이 있지만 BigInt 전용입니다.

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