Учитывая непустой список неотрицательных целых чисел, рассмотрите переписывание его как арифметическую задачу, где:
- Знак плюс (
+
) вставляется между парами чисел, которые увеличиваются слева направо (то есть от начала списка до конца). - Знак минус (
-
) вставляется между парами чисел, которые уменьшаются слева направо. - Знак умножения (
*
) вставляется между парами чисел, которые равны.
Сказано иначе: любой подсписок a,b
становится a+b
if a<b
, a-b
if a>b
и a*b
if a==b
.
Например, список
[12, 0, 7, 7, 29, 10, 2, 2, 1]
станет выражением
12 - 0 + 7*7 + 29 - 10 - 2*2 - 1
который оценивает 75
.
Напишите программу или функцию, которая берет такой список и оценивает его, печатая или возвращая результат.
- Порядок операций имеет значение. Умножение должно быть сделано перед любым сложением или вычитанием.
- Если у входного списка есть одно число, это должно быть то, к чему он оценивает. например
[64]
должен дать64
. - Использование
eval
илиexec
или подобных конструкций не допускается.
Вот несколько дополнительных примеров:
[list]
expression
value
[0]
0
0
[1]
1
1
[78557]
78557
78557
[0,0]
0*0
0
[1,1]
1*1
1
[2,2]
2*2
4
[0,1]
0+1
1
[1,0]
1-0
1
[1,2]
1+2
3
[2,1]
2-1
1
[15,4,4]
15-4*4
-1
[9,8,1]
9-8-1
0
[4,2,2,4]
4-2*2+4
4
[10,9,9,12]
10-9*9+12
-59
[1,1,2,2,3,3]
1*1+2*2+3*3
14
[5,5,4,4,3,3]
5*5-4*4-3*3
0
[3,1,4,1,5,9,2,6,5,3,5,9]
3-1+4-1+5+9-2+6-5-3+5+9
29
[7637,388,389,388,387,12,0,0,34,35,35,27,27,2]
7637-388+389-388-387-12-0*0+34+35*35-27*27-2
7379
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
code-golf
math
number
arithmetic
Кальвин Хобби
источник
источник
Ответы:
Python 2, 63 байта
Создает и
eval
выражает строку выражения. Арифметический символ выбирается путем сравнения предыдущего числаp
с текущимx
. После символа добавляется текущий номер.Первый номер обрабатывается умным трюком из Sp3000. Начальное значение
p
устанавливается в строку, которая больше любого числа и поэтому вызывает-
перед первым числом. Но,s
инициализируетсяprint-
в то же самое время, что и результат, начинающийся сprint--
(спасибо xsot за сохранение 2 байтов путем инициализации сprint
.)источник
print
в строку и использоватьexec
вместоeval
.Pyth,
312619171615 байтВыражения с
*
не будут оцениваться в Интернете, но теоретически они будут работать.2 байта благодаря Maltysen.
Тестовый пакет (с оценкой).
Другие случаи (без оценки).
история
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
M+G@"*-+"->GH<GHv+sgVQtQ\x60e
vtssVm@"*-+"->Zd<~Z
vtssVm@"*-+"._-~Z
vssVm@"*-+"._-~k
vsm+@"*-+"._-~k
источник
+
и-
онлайн)--safe
переключатель, который заменяетсяeval
наast.literal_eval
.Желе ,
18161514 байтНе использует встроенный Eval. Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
eval
как атом ...MATL , 12 байт
Здесь используется очень хорошая идея @ aditsu о кодировании длин серий.
Попробуйте онлайн!
объяснение
источник
CJam, 20
Попробуйте онлайн
Объяснение:
источник
JavaScript (ES6), 54
eval
получает список выражений через запятую и возвращает значение последнего.Тест
источник
Юлия,
7657 байтЯ впервые играю в гольф с Джулией, так что, возможно, есть очевидные улучшения. Попробуйте онлайн!
Деннис сэкономил тонну байтов.
источник
!
.Пиф -
232220 байтКак и в случае с Кенни, умножение не работает онлайн.
Тестовый набор, не делая eval .
источник
R, 92 байта
Скорее всего, здесь еще есть хороший гольф.
Ungolfed:
источник
Брахилог ,
3432 байтаПопробуйте онлайн!
источник
TI-BASIC, 146 байтов
Я буду хорошо отформатировать, когда не на мобильном телефоне. Сон ускользает от меня, так что вы получите это. Наслаждаться.
источник
Javascript ES6,
6462 символаисточник
a
параметром?a[i+1]...a[i+1]
=>a[++i]...a[i]
- на 2 символа короче, но я по ошибке заменил весь сброс кодаa=>
).Java, 384 байта
Ungolfed попробуйте онлайн
источник
int a=l.length
,&&
=>&
, поставитьint i=0
на одной и той же «линии» , какint n=l[0],m
.if(i<l.length-2&&l[i+1]!=l[i+2])n+=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n+=m;
, вы можете просто заменить это содержимое внутриelse
блока.Javascript ES6, 79 символов
источник
Perl, 49 байт
Код 48 байтов + 1 для
-p
использование
Заметки
Здесь я узнал, что вы можете запечатлеть взгляд в PCRE, хотя он немного не интуитивен (
(?=(\d+))
вместо((?=\d+))
). Это имеет смысл после прочтения, так как вы будете захватывать совпадение нулевой длины (прогноз) с последним, а вместо этого захватывать совпадение с первым).Спасибо @ninjalj за сохранение 8 байтов!
источник
-e
бесплатно, добавив, чтоp
создание-pe
было +1 ? Будет обновляться сейчас, но если бы вы могли найти источник, который я мог бы процитировать / ссылку для продвижения вперед, это было бы здорово!$&.qw(* - +)[$&<=>$1]
в замещающей частиs///
оператора.На самом деле, 30 байтов
К сожалению, потому что Eval (
≡
) оценивает литералы только на TIO, эта программа не работает на TIO.Объяснение:
источник
R ,
12044 байтаПопробуйте онлайн!
Алгоритм похож на этот ответ , но я понял это только после написания своего ответа. Гораздо лучше, чем мой оригинальный ответ, который использовал
eval(parse)
.Полностью использует векторизованные операции R -
*
сначала делает операцию, используяrle(x)$values ^ rle(x)$lenghts
иsign( diff( rle(x)$values ) )
расставляет точки на этот вектор (с префиксом1
).источник
05AB1E (legacy) ,
171615 байтов-2 байта благодаря @Emigna .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
>
, переместившись+
в конец строки.Ć
и¨
, если вы используете‚ζ
вместоø
‚ζ
это идеальный альтернативный обходной путь, так как пространство игнорируется в eval. Еще раз спасибо. :)PHP, 103 байта
Аккуратный вызов. Это дольше, чем ожидалось. Я думаю, что использование
array_map
или подобное не улучшит число байтов, так как анонимные функции все еще дороги в PHP.Запускается из командной строки, запрашивает список через запятую, например:
источник
PowerShell v2 +, 62 байта
Принимает ввод как разделенные пробелами аргументы командной строки, которые преобразуются в автоматический массив
$args
. Перебираем каждый элемент, используя вспомогательную переменную$o
каждую итерацию, чтобы вспомнить, какой была наша предыдущая запись. Мы используем индексированную строку, чтобы вытащить соответствующий оператор, выполняя математические операции с неявно преобразованными логическими значениями (например, если предыдущая запись меньше,[]
вычисление1+2*0
так'*+-'[1]
означает, что+
выбран).Связанные строки остаются на конвейере. Мы собираем все эти фрагменты вместе (например,
3-
,1+
,4-
и т.д.) с-join
работой, можно сцепить на конечном числе (неявно преобразуется в строку), а также через канал,iex
(псевдоним дляInvoke-Expression
и подобногоeval
).источник
Japt , 25 байт
Хотелось бы сократить это, но я не мог заставить работать версию без Eval.
Попробуйте онлайн!
источник
Japt
-x
,2119 байтПопытайся
объяснение
источник