Одно выражение, много значений


26

Используя наши знакомые математические символы: +, x, круглые скобки и любое рациональное число, легко создавать выражения, которые оценивают до некоторого желаемого числа. Например: 1+(2x3)=7, (1+2)+(3x6.5)=22.5и так далее. Достаточно скучно.

В этой проблеме, мы будем использовать новый оператор: ±. Использование ±выражения в выражении означает, что вам нужно вычислить выражение, заменив символы ±'s' +или -всеми возможными способами, и вернуть набор всех возможных значений. Например:

  • 1±2±3 = {-4,0,2,6}потому что 1±2±3может быть любой из 1+2+3, 1+2-3, 1-2+3и 1-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) х (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 -и удалить то, -что в данный момент находится в программе?
Исаак

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, уловка, которую я узнал от Линн.

shows 12 "abc" ->
"12abc"

5

Haskell , 58 байт

Использование #для ±, поскольку это на один байт меньше.

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 байтов, использованных для настройки, являются здесь большими отходами.



2

JavaScript (ES6), 56 51 байт

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

Основано на формуле @ Джонатана Аллана. @обозначает ±.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.