| Bytes | Lang | Time | Link |
|---|---|---|---|
| 015 | Japt x | 180824T152157Z | Shaggy |
| 032 | Brachylog | 180822T223644Z | Kroppeb |
| 015 | 05AB1E legacy | 180822T151247Z | Kevin Cr |
| 044 | R | 180719T184445Z | JayCe |
| 025 | Japt | 180822T132434Z | Etheryte |
| 092 | R | 161009T120354Z | rturnbul |
| 030 | Actually | 160816T010957Z | user4594 |
| 062 | Javascript ES6 | 160612T131034Z | Qwertiy |
| 049 | Perl | 160612T121540Z | Dom Hast |
| 062 | PowerShell v2+ | 160613T154723Z | AdmBorkB |
| 063 | Python 2 | 160612T043113Z | xnor |
| 146 | TIBASIC | 160612T053532Z | Conor O& |
| 057 | Julia | 160612T151130Z | lynn |
| 103 | PHP | 160612T160611Z | insertus |
| 014 | Jelly | 160612T060407Z | Dennis |
| 012 | MATL | 160612T132942Z | Luis Men |
| 079 | Javascript ES6 | 160612T130721Z | Qwertiy |
| 015 | Pyth | 160612T042347Z | Leaky Nu |
| 054 | JavaScript ES6 | 160612T101239Z | edc65 |
| 384 | Java | 160612T100824Z | Khaled.K |
| 020 | CJam | 160612T091634Z | aditsu q |
| 020 | Pyth | 160612T044015Z | Maltysen |
05AB1E (legacy), 17 16 15 bytes
ü.S…*-+sè‚ζJJ.E
-2 bytes thanks to @Emigna.
Try it online or verify all test cases.
Explanation:
ü # Pair-wise loop over the (implicit) input-list
# i.e. [12,0,7,7] → [[12,0],[0,7],[7,7]]
.S # Calculate the signum of the pair (-1 for a<b; 0 for a==b; 1 for a>b)
# i.e. [[12,0],[0,7],[7,7]] → [1,-1,0]
…*-+sè # Index over "*-+" (with wrap-around)
# i.e. [1,-1,0] → ['-','+','*']
‚ζ # Zip the two lists together (appending the operands to the numbers)
# i.e. [12,0,7,7] and ['-','+','*','+']
# → [[12,'-'],[0,'+'],[7,'*'],[7,' ']]
JJ # Join them together
# [[12,'-'],[0,'+'],[7,'*'],[7,' ']] → '12-0+7*7 '
.E # Evaluate as Python code
# i.e. '12-0+7*7' → 61
R, 120 44 bytes
r=rle(scan());c(1,sign(diff(r$v)))%*%r$v^r$l
The algorithm is similar to this answer's, but I only realized it after coding my answer. Much better than my original answer that was using eval(parse).
Fully leverages R's vectorized operations - does the * operation first using rle(x)$values ^ rle(x)$lenghts and dot-products this vector with sign( diff( rle(x)$values ) ) (predended with 1).
Japt, 25 bytes
Would like to cut it shorter, but I couldn't make an eval-less version work.
S+Uä!- ®"*+-"gZÎì)íU
OxU
R, 92 bytes
There's likely still some good golfing that can be done here.
eval(parse(t=paste(i<-scan(),c(ifelse(d<-diff(i),ifelse(d>0,"+","-"),"*"),""),collapse="")))
Ungolfed:
i = scan() # Read list from stdin
d = diff(i) # Calculate difference between each element of list
s = ifelse(d, # If d!=0
ifelse(d>0, # And if d>1
"+", # Return plus
"-"), # Else return minus
"*") # Else (i.e. d==0) return multiply.
s = c(s,"") # Pad the list s with an empty string, so it's the same
# length as i
p = paste(i,s,collapse="")# Paste the elements of i and s into one long string.
eval(parse(t=p)) # Evaluate the string as a language object.
Actually, 30 bytes
;2@VpXdX`i-su"+*-"E`M' @o♀+εj≡
Unfortunately, because the eval (≡) command only evaluates literals on TIO, this program does not work on TIO.
Explanation:
;2@VpXdX`i-su"+*-"E`M' @o♀+εj≡
; duplicate input
2@V overlapping sublists of length <= 2
pXdX discard first and last element (length-1 sublists)
`i-su"+*-"E`M map: for each pair of elements
i-su flatten, subtract, sign, increment (results in a 0 if b < a, 1 if b == a, and 2 if b > a)
"+*-"E select the correct operation
' @o put a space at the beginning of the list to pad it properly
♀+ pairwise addition (since addition is not defined for strings and integers, this just zips the lists and flattens the result into a single flat list)
εj join with empty string
≡ eval
Javascript ES6, 64 62 chars
a=>eval(a.map((x,i)=>x+('*+-'[x<a[++i]|(x>a[i])*2])).join``+1)
Perl, 49 bytes
48 bytes code + 1 for -p
s/\d+ (?=(\d+))/$&.qw(* - +)[$&<=>$1]/ge;$_=eval
Usage
perl -pe 's/\d+ (?=(\d+))/$&.qw(* - +)[$&<=>$1]/ge;$_=eval' <<< '12 0 7 7 29 10 2 2 1'
75
Notes
I learnt here that you can capture a lookahead in PCRE, although it's a little unintuitive ((?=(\d+)) instead of ((?=\d+))). It does make sense after reading though as you would be capturing a zero-length match (the lookahead) with the latter, and instead capture the match with the former).
Thanks to @ninjalj for saving 8 bytes!
PowerShell v2+, 62 bytes
-join($args|%{"$o"+'*+-'[($o-lt$_)+2*($o-gt$_)];$o=$_})+$o|iex
Takes input as space-separated command-line arguments, which gets converted into automatic array $args. We iterate through each element, using helper variable $o each iteration to remember what our previous entry was. We use a indexed-string to pull out the appropriate operator, done by performing math on the implicitly-converted Boolean values (e.g., if the previous entry is smaller, the [] evaluates to 1+2*0 so '*+-'[1] means the + is selected).
The concatenated strings are left on the pipeline. We collect all of those snippets together (e.g., 3-, 1+, 4-, etc.) with a -join operation, concatenate on the final number (implicitly converted to string), and pipe it to iex (alias for Invoke-Expression and similar to eval).
Python 2, 63 bytes
p=s='print-'
for x in input():s+='*+-'[cmp(x,p)]+`x`;p=x
exec s
Constructs and evals the expression string. The arithmetic symbol is chosen by comparing the previous number p to the current one x. The symbol is appended followed by the current number.
The first number is handled with a clever trick from Sp3000. The initial value of p is set to a string, which is bigger than any number and therefore causes a - before the first number. But, s is initialized to print- at the same time that makes the result start with print-- (thanks to xsot for saving 2 bytes by initializing with print.)
TI-BASIC, 146 bytes
I'll format it nicely when not on mobile. Sleep escapes me, so you get this. Enjoy.
Prompt L₁
"(→Str1
For(A,1,dim(L₁
{0,1→L₂
{0,L₁(A→L₃
LinReg(ax+b) L₁,L₃,Y₁
Equ►String(Y₁,Str2
sub(Str2,1,-1+inString(Str2,"X→Str2
If A>1
Then
L₁(A-1
2+(Ans>L₁(A))-(Ans<L₁(A
Str1+sub("+*-",Ans,1→Str1
End
Str1+Str2→Str2
End
expr(Str1
Julia, 76 57 bytes
!x=[[" ""-*+"[2+sign(diff(x))]...] x]'|>join|>parse|>eval
My first time golfing Julia, so maybe there are obvious improvements. Try it online!
Dennis saved a ton of bytes.
PHP, 103 bytes
Neat challenge. This got longer than expected. I think using array_map or similar won't improve the byte count, as anonymous functions are still expensive in PHP.
foreach(fgetcsv(STDIN)as$v)(0<=$p?$o.=$p.('*-+'[($p>$v)+2*($p<$v)]):_)&&$p=$v;echo eval("return$o$v;");
Runs from command line, will prompt for a comma separated list, like:
php array_to_math.php
12, 0, 7, 7, 29, 10, 2, 2, 1
Jelly, 18 16 15 14 bytes
I0;ð1g×⁹⁸œṗP€S
Uses no built-in eval. Try it online! or verify all test cases.
How it works
I0;ð1g×⁹⁸œṗP€S Main link. Input: A (list)
I Increments; compute the deltas of all adjacent items of A.
0; Prepend a 0.
ð Begin a new, dyadic chain.
Left argument: D (0 plus deltas). Right argument: A
1g Compute the GCD of 1 and each item in D.
This yields 1 for non-negative items, -1 for negative ones.
×⁹ Multiply each 1 or -1 with the corresponding item of A.
This negates every item in A that follows a - sign.
⁸œṗ Partition the result by D. This splits at occurrences of non-zero
values of D, grouping items with identical absolute value.
P€ Take the product of each group.
S Sum; add the results.
MATL, 12 bytes
Y'^l6MdZSh*s
This uses @aditsu's very nice idea of run-length encoding.
Explanation
% Take input vector implicitly
Y' % RLE. Produces two vectors: values and lengths
^ % Rise each value to the number of consecutive times it appears. This
% realizes the product of consecutive equal values
l % Push 1
6M % Push vector of values again
d % Consecutive differences
ZS % Sign function. Gives 1 or -1 (no 0 in this case)
h % Concatenate horizontally with previous 1
* % Multiply. This gives plus or minus depending on increasing character
s % Sum of vector. This realizes the additions or subtractions
% Display implicitly
Javascript ES6, 79 chars
a=>eval(`${a}`.replace(/(\d+),(?=(\d+))/g,(m,a,b)=>a+('*+-'[+a<+b|(+a>+b)*2])))
Pyth, 31 26 19 17 16 15 bytes
Expressions with * won't evaluate online, but they would theoretically work.
2 bytes thanks to Maltysen.
vsm+@"*-+"._-~k
The other cases (without evaluation).
History
- 31 bytes:
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e - 26 bytes:
M+G@"*-+"->GH<GHv+sgVQtQ\x60e - 19 bytes:
vtssVm@"*-+"->Zd<~Z - 17 bytes:
vtssVm@"*-+"._-~Z - 16 bytes:
vssVm@"*-+"._-~k - 15 bytes:
vsm+@"*-+"._-~k
JavaScript (ES6), 54
p=>eval(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))
eval receives a comma separated list of expressions and returns the value of the last one.
Test
f=p=>eval(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))
t=p=>(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))
function Test() {
var a=I.value.match(/\d+/g).map(x=>+x) // convert input to a numeric array
var x=f(a),y=t(a)
O.textContent='Value '+x+'\n(no eval '+y+')'
}
Test()
#I { width:80%}
<input value='12, 0, 7, 7, 29, 10, 2, 2, 1' id=I>
<button onclick='Test()'>Test</button>
<pre id=O></pre>
Java, 384 bytes
int s(int[]l){int n=l[0],m;for(int i=0;i<l.length-1;i++)if(l[i]<l[i+1])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 if(l[i]>l[i+1])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{m=l[i];while(i<l.length-1&&l[i]==l[i+1])m*=l[i++];n+=m;}return n;}
Ungolfed try online
int s(int[] l)
{
int n=l[0], m;
for(int i=0; i<l.length-1; i++)
{
if(l[i] < l[i+1])
{
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 if(l[i] > l[i+1])
{
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
{
m = l[i];
while(i<l.length-1 && l[i]==l[i+1]) m *= l[i++];
n += m;
}
}
return n;
}
CJam, 20
q~e`{~_W-g\:W@#*}%:+
Explanation:
q~ read and evaluate the input (array of numbers)
e` RLE encode, obtaining [count number] pairs
{…}% map each pair
~_ dump the count and number on the stack, and duplicate the number
W- subtract the previous number (W is initially -1 by default)
g get the sign of the result
\ swap with the other copy of the number
:W store it in W (for next iteration)
@# bring the count to the top, and raise the number to that power
* multiply with the sign
:+ add all the results together
Pyth - 23 22 20 bytes
As with Kenny's, multiplication doesn't work online.
vs.i+\+@L"*+-"._M-Vt