1つの式、多くの値


26

使い慣れた数学記号:+、x、括弧、および任意の有理数を使用して、希望する数に評価される式を簡単に作成できます。例:1+(2x3)=7など(1+2)+(3x6.5)=22.5。十分に退屈。

この課題では、新しい演算子を使用します±。使用±あなたは置き換えることにより、式を評価する必要がある表現手段で±でさんの+か、-すべての可能な方法で、すべての可能な値のセットを返します。例えば:

  • 1±2±3 = {-4,0,2,6}理由1±2±3のいずれかとすることができる1+2+31+2-31-2+31-2-3、その値は6,0,2,-4それぞれ。
  • (±2)x(2±3) = {-10,-2,2,10} 同様の理由で。

さて、それは明確な実数の任意のセットを考えると、結局のところ、それが持つ式を作成することが可能だ+x()±、および実数評価される指定されたセットに。

仕事

あなたの仕事はのシーケンスを取り、お好みの言語でプログラムや機能、(リスト/配列/任意の便利な形式)書くことである整数から成る(文字列として)の発現と出力を+x()±、および有理数与えられた数のセットに評価されます。

  • 正確な文字±は重要ではないことに注意してください。使用している他の文字と区別できる限り、他の任意の文字を使用できます。ただし、提出に使用しているキャラクターに言及する必要があります。
  • 入力は、使用される有理数の小数近似(妥当な精度まで)で構成されることが許可されます。
  • 入力と出力は、標準的な方法で取得できます。
  • 標準的な抜け穴は禁止されています。
  • 指定された整数は明確であり、昇順で提供されると想定できます。
  • 出力にはスペースと改行が含まれる場合があります。

受賞基準

これはなので、バイト単位の最短コードが優先されます。

入力| 可能な出力
------------- + -----------------------------
[1,2,3] | 2±0.5±0.5                   
[-7、-3,1,21] | (1±2)x(3±4)

トーナメントオブタウンズ、2015年秋の質問からのアイデア。


5
PPCGへようこそ!素敵な最初の挑戦!これが逆の場合(式が与えられたセットを見つける)、これはかなり難しい挑戦であるように見えるので、これはより多くの答えを引き付けると思います。それにもかかわらず、良い挑戦です!
HyperNeutrino

再びようこそ!決め手は簡潔でない限り、どの質問「最高」さを決定する際@HyperNeutrino上への追加、おそらく、問題になる可能性のセットの一部に複数のソリューションがあるでしょう
デヴィッド・アーチボルド

@HyperNeutrinoありがとう!私はこれが少し難しいかもしれないことを理解しましたが、私はここでゴルファーの優れた能力を完全に信じています。それがどうなるか見てみましょう。:)
アンコガニット

3
はい。このサイトのゴルファーの何人かは驚くべき超大国を持っています、そして私たちはゴルフボットであると疑っています> _>:D
HyperNeutrino

@DavidArchibaldはい、意図した出力は機能するソリューションです。
アンコガニット

回答:


11

Python 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

考え方は、式を実行しE、を実行することで新しい値hをその値セットに隣接させることができるということ(.5±.5)*(E+-h)+hです。


なぜ+-h、とだけではなく-h?つまり、+a -を作成して、-現在プログラムにあるものを削除してみませんか?
isaacg

1
@isaacg仕様では-、式に演算子を使用できません。
XNOR

9

Haskell、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)++b、私がリンから学んだトリックです。

shows 12 "abc" ->
"12abc"


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

Haskell、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

JavaScript(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.