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


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.