2-0 1-5 퍼즐


13

배경

이 퍼즐은 four fours 퍼즐 의 변형 입니다 (자체는 과거 질문 의 주제 ). 그 퍼즐과 마찬가지로 목표는 네 자리 숫자와 특정 수학 연산자를 사용하여 다른 정수에 대한 수학적 표현을 찾는 것입니다. 그러나이 경우 허용되는 숫자는 단지 2, 0, 1 및 5 입니다. 각각은 솔루션에서 정확하게 한 번 정확하게 나타나야합니다. 놀랍게도 많은 정수가 이런 식으로 표현 될 수 있습니다. 솔버는 이상하게도 즐겁기 때문에 먼저 손으로 해결하는 것이 좋습니다.

규칙

상수는 한 자리 또는 여러 자리로 구성 될 수 있습니다.

  • 정수 : 예 : 2, 0, 15 등
  • 소수점 : 예 : .2, .01, 1.5 등
  • 반복되는 소수점 : 예 : .2 ~ (= 0.222 ...), .15 ~ (= 0.1555 ...), 20.15 ~~ (= 20.1515 ...)

다음과 같은 단항 연산이 허용됩니다.

  • 단항 부정 : -x
  • 제곱근 : sqrt (x)
  • 정수 계승 : x!

다음과 같은 이진 연산이 허용됩니다.

  • 표준 산술 연산자 : x + y, xy, x * y 및 x / y
  • 임의 지수 : x ^ y
  • 임의의 근 : rt [x] (y) (= y의 x'th 근)

직무

프로그램은 가능한 한 0에서 100 사이의 정수에 대한 표현식을 인쇄 한 다음 생성 된 표현식 수를 출력해야합니다.

  • n = [expr] 형식으로 솔루션을 인쇄해야합니다.
  • 표현식은 순서대로 각 숫자 2, 0, 1, 5를 각각 한 번씩 사용해야합니다.
  • 식은 위에서 설명한 표기법을 사용하여 인쇄해야합니다. 공백과 같이 불필요한 괄호는 허용되지만 필수는 아닙니다. 연산자 우선 순위는 단항 부정, 계승, 지수, 곱셈 / 나눗셈 및 덧셈 / 빼기입니다.
  • 프로그램은 모든 숫자에 대한 솔루션을 반환 할 필요는 없습니다. 따라서 단순히 0을 출력하는 프로그램이 유효합니다. 그러나 아래의 점수 섹션을 참조하십시오.
  • 이 프로그램은 최신 컴퓨터에서 15 분 이내에 실행되어야합니다.

프로그램이나 함수를 작성할 수 있습니다. 표현식은 STDOUT (또는 가장 가까운 대안)으로 인쇄해야합니다. 표현식 수는 STDOUT에 인쇄되거나 정수로 리턴 될 수 있습니다. 표준 코드 골프 제한이 적용됩니다.

출력 예

0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4

채점

업데이트 : @orlp는 점수 시스템의 결함을 지적했습니다. 이 문제를 해결해야하는지 여부에 대한 설명은 http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge 를 참조 하십시오 .

솔루션 득점하는 첫번째 그들이 생산 표현의 숫자로와 다음 바이트 자신의 코드 길이에 의해. 따라서 80 개의 결과를 생성하는 1000 바이트 프로그램은 79 개만 생성하는 100 바이트 프로그램을 능가합니다 (단, 누락 된 결과를 포함하도록 쉽게 확장 할 수 있음).

동기 부여 목표를 원하는 사람들을 위해 표현할 수있는 표현의 수에는 하한이 있습니다. 출품작을 제출할 계획이 없으므로 적은 금액으로 이길 수도 있습니다!

더 높을 수도 있지만 적어도 85 (101 개 중).

스코어 보드

추가 인센티브로 여기에 점수 진행에 대한 요약이 있습니다. 당신이 가장 높은 점수를 이길 때마다, 자유롭게 테이블 상단에 자신을 추가하거나 다른 사람에게 요청하십시오.

  • 0 개 표현식, 1 바이트 (Pyth) : 0 만 출력하는 구현

.20이 허용되는 상수입니까?
Luke

1
@Luke : 예. (.2 + 0)으로 표현 될 수도 있지만 표현력을 높이 지 않습니다
Uri Granta

1
@orlp 0보다 큰 선행 0과 분수는 표현력을 추가하지 않습니다 (예 : 015 = 0 + 15 및 1.5 = 1 + .5).
Uri Granta

1
@ mbomb007 너무 복잡합니다. 다음은 내가 작성한 빠른 설명입니다. gist.github.com/orlp/e92b3b7d26ad9b11378e
orlp

2
@UriZarfaty 그렇다면 99 가지의 유용한 상수 세트가 있습니다 : gist.github.com/orlp/eb997e49e41878c76d0a
orlp

답변:


9

85, ~ 2400 바이트

나는 이것이 이전의 모든 노력이 지금 쓸모가 없다고 생각하기 때문에 이것이 코드 골프 도전이라고 조금 슬프다.

  0 = ((2*0)^15)
  1 = ((2^0)^15)
  2 = (2-(0^15))
  3 = (20*.15)
  4 = (20*(1/5))
  5 = (20-15)
  6 = ((.20+1)*5)
  7 = ((20*.1)+5)
  8 = (2*((0-1)+5))
  9 = ((.20/.1~)*5)
 10 = (20/(1/.5))
 11 = ((((2-0)+1))!+5)
 12 = (20*(.1+.5))
 13 = ((-(2)-0)+15)
 14 = (20-(1+5))
 15 = ((2*0)+15)
 16 = ((2^0)+15)
 17 = ((2-0)+15)
 18 = (20-(1/.5))
 19 = (20-(1^5))
 20 = (20^(1^5))
 21 = (20+(1^5))
 22 = (20+(1/.5))
 23 = (((2-0)/.1~)+5)
 24 = ((20-1)+5)
 25 = ((20^1)+5)
 26 = ((20+1)+5)
 27 = (rt[.2](((0)!+1))-5)
 28 = (2*(-((0)!)+15))
 29 = ((((2+(0)!)+1))!+5)
 30 = ((2-0)*15)
 31 = (20+sqrt((1+(5)!)))
 32 = ((20*.1)^5)
 33 = ((.2^-((0)!))/.15~~)
 34 = (2+(((0)!+1)^5))
 35 = (20+15)
 36 = (20*(1/.5~))
 37 = (rt[.2](((0)!+1))+5)
 38 = ((20-1)/.5)
 39 = (-((2^0))+(sqrt(.1~)*(5)!))
 40 = (20*(1/.5))
 41 = (((.2~^-((0)!))/.1~)+.5)
 42 = ((20+1)/.5)
 43 = (-(2)+(((0)!/.1~)*5))
 44 = (20+((-(1)+5))!)
 45 = (20/(1-.5~))
 46 = ((.2+((0)!/.1~))*5)
 47 = (2+(((0)!/.1~)*5))
 48 = (2*(((0-1)+5))!)
 49 = ((((2+(0)!))!/.1~)-5)
 50 = (((2^0)/.1)*5)
 51 = ((.2+((0)!/.1))*5)
 52 = (2+(((0)!/.1)*5))
 54 = (((2+(0)!)/.1)/.5~)
 55 = ((2+((0)!/.1~))*5)
 56 = (((.2-(0)!)+sqrt(.1~))*-((5)!))
 58 = (-(2)+sqrt((((((0)!/sqrt(.1~)))!)!*5)))
 59 = ((((2+(0)!))!/.1~)+5)
 60 = (20/(.1~^.5))
 62 = (2*(-((0)!)+sqrt(rt[-(.1)](.5))))
 64 = ((2-0)^(1+5))
 65 = ((20/sqrt(.1~))+5)
 66 = ((-(((2+(0)!))!)/.1~)+(5)!)
 67 = (((((2+(0)!))!)!*.1)-5)
 69 = ((2^(((0)!/sqrt(.1~)))!)+5)
 70 = (((.2^-((0)!))/-(.1))+(5)!)
 72 = ((2+(0)!)*((-(1)+5))!)
 75 = ((.2^-((0)!))*15)
 76 = (rt[(-(2)^-((0)!))](.1~)-5)
 77 = (((((2+(0)!))!)!*.1)+5)
 78 = (2*(-((0)!)+(sqrt(.1~)*(5)!)))
 80 = (-(20)*(1-5))
 81 = (201-(5)!)
 82 = (2*((0)!+(sqrt(.1~)*(5)!)))
 84 = (((.2-(0)!)+.1)*-((5)!))
 85 = (((((2+(0)!))!)!*.1~)+5)
 86 = (rt[(-(2)^-((0)!))](.1~)+5)
 88 = (rt[.2]((-((0)!)-1))+(5)!)
 90 = ((20/.1~)*.5)
 93 = (((2+(0)!)/-(.1~))+(5)!)
 95 = ((20-1)*5)
 96 = ((.20-1)*-((5)!))
 98 = (-(20)*(.1-5))
 99 = ((-(20)-1)+(5)!)
100 = (20/(1/5))
85

여기부터는 압축 문제 일뿐입니다. 나중에 경쟁 할 수도 있고 그렇지 않을 수도 있습니다. 나를 위해 대부분의 재미는 가장 공식을 찾는 도전에 있었다.

솔버 작성에 어려움을 겪는 사람들을위한 힌트-런타임은 문제가되지 않습니다. 확인할 수식이 너무 많으면 희망없는 솔루션과 복제본을 버릴 수있는 더 나은 휴리스틱이 필요합니다. 위의 코드를 생성하기 위해 작성한 코드는 Python에서 ~ 5 초 안에 실행됩니다.


rt [.1] (-. 5)는 0.1의 -0.5 루트가 아니라 -0.5의 0.1 루트입니다.
Uri Granta

또한 우승자가 압축 된 텍스트 출력 일 수 있다고 생각하기 시작했습니다. 그것을 피하는 더 좋은 방법을 생각해야합니다 :-(
Uri Granta

@UriZarfaty 아, 내 코드에서 수정하고 다시 실행하여 잠시만 기다려주십시오.
orlp

출력이 프로그램 크기에 비해 얼마나 큰지 과대 평가했습니다. 작은 범위의 문자와 불필요한 괄호가 주어지면 솔루션이 실제로 너무 잘 압축 될 것이라고 생각합니다.
Uri Granta

1
@ mbomb007 나는 그것을 정리하려고 시도하지 않았으며 현재 상태의 코드가 손상되었다고 생각합니다 -gist.github.com/orlp/878da16b5b7c650ebd09 .
orlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.