Одне вираз, багато цінностей


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 Дякую! Я розумів, що це може виявитися трохи важким, але я повністю вірю в чудові можливості гольфістів тут; подивимося, як виходить. :)
Ankoganit

3
Так. У деяких гольфістів на цьому сайті є дивовижні суперсили, і ми навіть підозрюємо, що деякі є ботами для гольфу> _>: D
HyperNeutrino

@DavidArchibald Так, призначений вихід - це будь-яке рішення, яке працює.
Ankoganit

Відповіді:


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? Тобто, чому б не зробити +а -та не видалити те, -що наразі є у програмі?
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)))

Функція showsробить shows a b=(show a)++b, трюк я дізнався від Лінн.

shows 12 "abc" ->
"12abc"

5

Хаскелл , 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 байт, які використовуються для налаштування, тут є великими витратами.


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 @розшифровується ±.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.