포 포즈 퍼즐뿐만 아니라


11

의이 변형에서 네 발로 퍼즐 까지 사용해야합니다 귀하의 x x's경우 (그리고 다른 번호) 및 운영의 정의 된 세트가 100 0에서 모든 수에 도달하지 않으려면 x = 4다음 4 개까지 사용할 수 있습니다 4s이 문제는 고전적인 네 발로가된다 퍼즐 (단, 정확히 4 개를 사용하지 않고 최대 4 개의 4를 사용할 수 있음). 우리는 가정 1 < x <= 9합니다.

이 버전에서는 다음 연산자 만 허용됩니다.

  • 덧셈 ( +), 뺄셈 ( -), 곱셈 ( *), 나눗셈 ( /). 이것은 실제 구분이므로 유의하십시오 5/2 = 2.5.
  • 일반적으로 수작업으로 작성하는 경우 추가 기호가 필요하지 않으므로 지수화 (예 : 4 ^ 4).
  • 를 연결하여 새로운 정수를 만들 수 있습니다 xs. 예를 들어 정수를 만들 수 있습니다 4, 44, 444, 4444.

연산자의 평가 순서를 제어하기 위해 단순히 괄호를 사용하여 숫자를 그룹화 할 수도 있습니다. 예를 들어에서와 같이 괄호를 연결과 결합 할 수 없습니다 (4/4)(4/4) = (1)(1) = 11.

다른 기호는 사용할 수 없으며 표준 작업 순서가 적용됩니다.

프로그램은 x정의 된 범위와 그 n사이 0100포함 된 경우 해당 입력에 대한 올바른 솔루션이있는 경우이를 생성해야합니다. 그렇지 않으면 코드는 그러한 솔루션이 존재하지 않음을 나타내는 것을 출력해야합니다.

당신의 모든 입력 값을 컴퓨터에 완료에 제출을 실행할 수 있어야합니다 xn허용 범위이다. 이것은 코드 골프이므로 가장 짧은 솔루션이 승리합니다.

이 오래된 관련 질문 은 더 많은 연산자를 사용하므로 4에서 100까지의 모든 숫자를 해결할 수 있으므로이 과제에는 해당되지 않습니다.

입력과 출력

귀하의 코드는 두 개의 정수를 소요 xn입력으로하고 출력해야하는 솔루션 (또는 해결책이없는 표시)를 편리 발견 한 사람이 읽을 수있는 형식이. 4 6예를 들어, 입력 은 "최대 4 개의 4를 사용하여 숫자 6"을 의미합니다. 따라서 입력이 4 6출력이라면이 될 수 있습니다 (4+4)/4+4.



2
Parens를 연결과 결합 할 수 있습니까? 예 :`(4/4) (4/4) = (1) (1) = 11?
디지털 외상

1
괄호를 추가하고 괄호 + 연결을 허용하지 않으면이 작업이 훨씬 어려워집니다
Draconis

2
숫자가 사용되는 횟수에 지수 연산자와 외부 루프를 추가하면 IMO가 codegolf.stackexchange.com/q/82884/194
Peter Taylor

2
@PeterTaylor 괄호는 많은 차이를 만드는 것으로 보입니다. 가능하다면 다시 열겠다고 투표했습니다.
felipa

답변:


4

파이썬 3 , 265 바이트

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

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

작동 모든 의 숫자 참조 엔지니어 토스트로 연결.

x=8tio에서 실행 x=9되며 내 컴퓨터에서 몇 분 정도 걸립니다.


이 함수 g는 최대 x개수의 의 모든 조합 집합을 반환합니다 x. f그런 다음 그것들을 반복하고 숫자로 평가되는 첫 번째를 반환합니다 n.

각각에 대해 가능한 값의 수 x는 다음과 같습니다.

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

모든 번호는 위에서 생성 할 수 있습니다 (a+b), (a-b), (a+b), a*b, a/b, (a/b),와 a^b. a+b그리고 a-b이상의 숫자를 제공하지 않습니다.

a^b 그렇지 않으면 거대한 숫자가 만들어지기 때문에 한 번만 사용됩니다 (위의 참조 문서에서도 확인 됨)


골프가 아닌 해결책을 찾 자마자 단락되는 대체 버전 :

x=7..9모든 숫자를 만들 수 있으므로 훨씬 빠릅니다 .

파이썬 3 , 338 289 바이트

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

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


이것은 매우 좋은 답변입니다! 나는 당신이 항상 정확히 x xs (예 (4/4**(4-4))를 들어)를 사용하고 있다고 생각 4했지만 그렇지 않습니다.
Anush

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