一种表达,多种价值


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()±,和有理数计算得出给定数字的集合。

  • 请注意,确切的字符±无关紧要;您可以使用您选择的任何其他字符,只要它可以与您使用的其他字符区分开即可。但是您必须在提交中提及正在使用的字符。
  • 输入允许由所用有理数的十进制近似值(最高合理精度)组成。
  • 输入和输出可以采用任何标准方式进行。
  • 禁止出现标准漏洞。
  • 您可以假设给定的整数将是不同的,并以递增的顺序提供。
  • 输出中可能包含空格和换行符。

获奖标准

这是,因此以字节为单位的最短代码获胜。

例子

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

想法来自城镇锦标赛,2015年秋季


5
欢迎来到PPCG!不错的第一个挑战!我认为如果相反(这会给表达式指定集合),它将吸引更多答案,因为这似乎是一个棘手的挑战。尽管如此,还是很好的挑战!
HyperNeutrino

再次欢迎!加上@HyperNeutrino,对于某些集合可能会有多种解决方案,当决定哪个问题是“最佳”问题时可能会有问题,除非决定因素是简洁性
David Archibald

@HyperNeutrino谢谢!我确实意识到这可能会有些困难,但是我完全相信这里的高尔夫球手的卓越能力。让我们看看结果如何。:)
Ankoganit

3
是。此站点上的某些高尔夫球手具有惊人的超能力,我们甚至怀疑有些高尔夫球场机器人> _>:D
HyperNeutrino

@DavidArchibald是的,预期的输出是任何可行的解决方案。
Ankoganit

Answers:


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 '17

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)))

该功能shows可以实现shows a b=(show a)++b,这是我从Lynn中学到的技巧。

shows 12 "abc" ->
"12abc"

5

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

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的公式。@代表±

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.