하나의 표현, 많은 가치


26

친숙한 수학적 기호 인 +, x, 괄호 및 모든 유리수를 사용하면 원하는 숫자로 평가되는 표현식을 쉽게 만들 수 있습니다. 예를 들어 1+(2x3)=7, (1+2)+(3x6.5)=22.5과에 이렇게. 지루 해요

이 도전에서 우리는 새로운 연산자를 사용할 것입니다 : ±. 의 사용은 ±표현의 수단 당신은 대체하여 식을 계산할 필요 ±에 의해 '들 +또는 -모든 가능한 방법으로, 모든 가능한 값의 집합을 반환합니다. 예를 들면 다음과 같습니다.

  • 1±2±3 = {-4,0,2,6}, 및 값 1±2±3중 하나 1+2+3일 수 있기 때문 입니다. 1+2-31-2+31-2-36,0,2,-4
  • (±2)x(2±3) = {-10,-2,2,10} 비슷한 이유로.

이 밝혀 이제 별개의 실제 숫자의 세트가 지정되면 (자), 그와 식을 만들 수있어 +, x, (, ), ±, 및 실제 숫자가 지정된 세트에 평가합니다.

태스크

당신의 작업은의 (목록 / 배열 / 편리한 형식) 시퀀스를 취 사용자가 선택한 언어로 프로그램이나 함수를 작성하는 것입니다 정수 로 구성된 (문자열로) 식을 출력하고 +, x, (, ), ±,와 유리수 주어진 숫자 세트로 평가됩니다.

  • 정확한 특성 ±은 중요하지 않습니다. 사용중인 다른 문자와 구별되는 한 원하는 다른 문자를 사용할 수 있습니다. 그러나 제출시 어떤 캐릭터를 사용하고 있는지 언급해야합니다.
  • 입력은 사용 된 유리수의 10 진수 근사값 (합리적인 정확도까지)으로 구성 될 수 있습니다.
  • 모든 표준 방식으로 입력 및 출력을 수행 할 수 있습니다.
  • 표준 허점은 금지되어 있습니다.
  • 주어진 정수가 고유하고 증가하는 순서로 제공된다고 가정 할 수 있습니다.
  • 출력에는 공백과 줄 바꿈이 포함될 수 있습니다.

승리 기준

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

입력 | 가능한 출력
------------- + -----------------------------
[1,2,3] | 2 ± 0.5 ± 0.5                   
[-7, -3,1,21] | (1 ± 2) x (3 ± 4)

Tournament of Towns, 2015 가을의 질문에서 얻은 아이디어 .


5
PPCG에 오신 것을 환영합니다! 좋은 첫 도전! 나는 이것이 다른 방법이라면 (표현이 주어진 세트를 찾으면) 더 많은 답을 얻을 것이라고 생각합니다. 왜냐하면 이것이 까다로운 도전 인 것처럼 보입니다. 그럼에도 불구하고 좋은 도전!
HyperNeutrino

다시 오신 것을 환영합니다! @HyperNeutrino에 추가하면 일부 세트에 대한 여러 가지 솔루션이있을 수 있습니다. 결정 요인이 간결하지 않은 경우 어떤 질문이 "최고"를 결정할 때 문제가 될 수 있습니다.
David Archibald

@HyperNeutrino 감사합니다! 나는 이것이 조금 어려워 질지 알았지 만 여기서 골퍼의 뛰어난 능력을 완전히 믿습니다. 그것이 어떻게 나타나는지 봅시다. :)
Ankoganit

3
예. 이 사이트의 일부 골퍼에게는 놀라운 초능력이 있으며, 심지어 일부는 골프 봇이라고 생각합니다.> _> : D
HyperNeutrino

@DavidArchibald 예, 의도 된 출력은 작동 하는 솔루션입니다.
Ankoganit

답변:


11

파이썬 2 , 56 바이트

f=lambda h,*t:t and"(.5?.5)*(%s+%%s)+"%f(*t)%-h+`h`or`h`

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

?약자입니다 ±. 사용법 예 :

f(-3,5,20) ->
(.5?.5)*((.5?.5)*(20+-5)+5+3)+-3

아이디어는을 수행하여 표현식을 가져 와서 Eh세트에 새로운 값 을 연결할 수 있다는 것 (.5±.5)*(E+-h)+h입니다.


+-h, 그리고 단지 -h? 즉, 현재 프로그램에 있는 +a를 -만들고 제거 하지 않는 이유는 -무엇입니까?
isaacg

1
@isaacg이 스펙은 -표현식에서 연산자를 허용하지 않습니다 .
xnor

9

하스켈 , 52 바이트

f(h:t)=shows h"+(.5?.5)*("++f[x-h|x<-t]++")"
f e="0"

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

에 사용 ?합니다 ±. 예:

f [1,3,7] ->
1+(.5?.5)*(2+(.5?.5)*(4+(.5?.5)*(0)))

이 기능 showsshows a b=(show a)++bLynn에서 배운 트릭입니다.

shows 12 "abc" ->
"12abc"

5

하스켈 , 58 바이트

바이트가 적기 때문에 #for 사용 ±.

f 정수 목록을 가져 와서 문자열을 반환합니다.

f[x]=show x
f(x:r)=show x++"+(.5#.5)x("++f((-x+)<$>r)++")"

결과는 양식의 형식 n+(.5#.5)x(rest)이며, 여기서 n목록의 첫 번째 요소는 각 요소에서 빼고 rest다른 모든 요소를 나타냅니다 n.

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


5

젤리 , 29 바이트

“(¤)”j.⁾+×j;”(
I;@Ḣj¢;”)ẋ⁸L¤¤

인쇄는 v에 + (0.5¤0.5) × (I (1) + (0.5¤0.5) × ((I (2) + (0.5¤0.5) × ((I N ) ...))) 여기서, V는 제 번호 인 입력 배열과 i n 은 입력 배열 요소 간의 n 번째 증분 차이입니다.

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

방법?

“(¤)”j.⁾+×j;”( - Link 1, adjoining list: no input
“(¤)”          - literal     ['(','¤',')']
      .        - literal     0.5
     j         - join        ['(',0.5,'¤',0.5,')']
       ⁾+×     - literal     ['+','×']
          j    - join        ['+',['(',0.5,'¤',0.5,')'],'×']
            ”( - literal     '('
           ;   - concatenate ['+',['(',0.5,'¤',0.5,')'],'×','(']

I;@Ḣj¢;”)ẋ⁸L¤¤ - Main link: list a               e.g. [-1,5,2]
I              - incremental differences(a)           [6,-3]
   Ḣ           - head(a)                              [-1]
 ;@            - concatenate (rev @rgs)               [-1,6,-3]
     ¢         - last link (1) as a nilad             ['+',['(',0.5,'¤',0.5,')'],'×','(']
    j          - join                                 [-1,['+',['(',0.5,'¤',0.5,')'],'×','('],6,['+',['(',0.5,'¤',0.5,')'],'×','('],-3]
             ¤ - nilad followed by link(s) as a nilad
            ¤  -     nilad followed by link(s) as a nilad
          ⁸    -         link's left argument, a
           L   -         length                       3
       ”)      -     literal ')'
         ẋ     -     repeat                           [')',')',')']
      ;        - concatenate                          [-1,['+',['(',0.5,'¤',0.5,')'],'×','('],6,['+',['(',0.5,'¤',0.5,')'],'×','('],-3,')',')',')']
               - implicit print                       -1+(0.5¤0.5)×(6+(0.5¤0.5)×(-3))

4

05AB1E , 25 바이트

0¸«¥X;D"+(ÿ±ÿ)*("ý¹g<')×J

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

설명

0¸«                        # prepend a 0 to input list
   ¥                       # calculate delta's
    X;D                    # push 0.5 twice
       "+(ÿ±ÿ)*("          # push this string and interpolate 0.5 where "ÿ" is
                 ý         # merge the list of delta's with this string as a separator
                  ¹g<')×J  # add the closing parenthesis

불행히도 오른쪽에서 식을 작성하면 같은 바이트 수로 끝나는 것으로 끝납니다
0¸«¥¤s¨RvX;Dy"ÿ+(ÿ±ÿ)*(ÿ). 설정에 사용 된 8 바이트는 여기서 큰 낭비입니다.


3

하스켈, 54 바이트

f[]="0"
f(x:s)=show x++"+(.5?.5)*("++f(map(-x+)s)++")"

+-부호는 '?'입니다. 예:

f[1,2,3,4] = "1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(0))))"

2

자바 스크립트 (ES6), 56 51 바이트

f=([v,...a],x=v)=>x?x+`+(.5@.5)*(${f(a,a[0]-v)})`:0

@JonathanAllan의 공식을 기반으로합니다. @의 약자 ±.

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