Étant donné une liste non vide d’entiers non négatifs, envisagez de la récrire en tant que problème arithmétique, dans lequel:
- Un signe plus (
+
) est inséré entre des paires de nombres qui augmentent de gauche à droite (du début à la fin de la liste). - Un signe moins (
-
) est inséré entre des paires de nombres qui diminuent de gauche à droite. - Un signe de multiplication (
*
) est inséré entre des paires de nombres égaux.
Dit autrement: toute sous-liste a,b
devient a+b
si a<b
, a-b
si a>b
et a*b
si a==b
.
Par exemple, la liste
[12, 0, 7, 7, 29, 10, 2, 2, 1]
deviendrait l'expression
12 - 0 + 7*7 + 29 - 10 - 2*2 - 1
qui évalue à 75
.
Ecrivez un programme ou une fonction qui prend une telle liste et l'évalue, imprimant ou renvoyant le résultat.
- L'ordre des opérations est important. Les multiplications doivent être effectuées avant toute addition ou soustraction.
- Si la liste d'entrée a un numéro, ce doit être ce à quoi elle est évaluée. par exemple
[64]
devrait donner64
. - L'utilisation de
eval
ou deexec
constructions similaires est autorisée.
Voici quelques exemples supplémentaires:
[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
Le code le plus court en octets gagne. Tiebreaker est une réponse plus tôt.
code-golf
math
number
arithmetic
Les passe-temps de Calvin
la source
la source
Réponses:
Python 2, 63 octets
Construit et
eval
s la chaîne d'expression. Le symbole arithmétique est choisi en comparant le nombre précédent au nombrep
actuelx
. Le symbole est ajouté suivi du numéro actuel.Le premier numéro est traité avec une astuce intelligente de Sp3000. La valeur initiale de
p
est définie sur une chaîne, qui est supérieure à tout nombre et entraîne donc un-
avant le premier nombre. Mais,s
s’initialise enprint-
même temps que le résultat commence parprint--
(merci à xsot d’avoir économisé 2 octets en initialisant avecprint
.)la source
print
dans la chaîne et utiliser à laexec
place deeval
.Pyth,
312619171615 octetsLes expressions avec
*
n'évaluent pas en ligne, mais elles fonctionnent théoriquement.2 octets grâce à Maltysen.
Suite de tests (avec évaluation).
Les autres cas (sans évaluation).
Histoire
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
M+G@"*-+"->GH<GHv+sgVQtQ\x60e
vtssVm@"*-+"->Zd<~Z
vtssVm@"*-+"._-~Z
vssVm@"*-+"._-~k
vsm+@"*-+"._-~k
la source
+
and-
online)--safe
switch, which replaceseval
withast.literal_eval
.Jelly,
18161514 bytesUses no built-in eval. Try it online! or verify all test cases.
How it works
la source
eval
as an atom...MATL, 12 bytes
This uses @aditsu's very nice idea of run-length encoding.
Try it online!
Explanation
la source
CJam, 20
Try it online
Explanation:
la source
JavaScript (ES6), 54
eval
receives a comma separated list of expressions and returns the value of the last one.Test
la source
Julia,
7657 bytesMy first time golfing Julia, so maybe there are obvious improvements. Try it online!
Dennis saved a ton of bytes.
la source
!
.Pyth -
232220 bytesAs with Kenny's, multiplication doesn't work online.
Test Suite without doing eval.
la source
R, 92 bytes
There's likely still some good golfing that can be done here.
Ungolfed:
la source
Brachylog,
3432 bytesTry it online!
la source
TI-BASIC, 146 bytes
I'll format it nicely when not on mobile. Sleep escapes me, so you get this. Enjoy.
la source
Javascript ES6,
6462 charsla source
a
a parameter?a[i+1]...a[i+1]
=>a[++i]...a[i]
- 2 chars shorter, but I mistakenly replaced the whole code droppinga=>
).Java, 384 bytes
Ungolfed try online
la source
int a=l.length
,&&
=>&
, put theint i=0
on the same "line" asint 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;
, you can just replace this with the content inside theelse
block.Javascript ES6, 79 chars
la source
Perl, 49 bytes
48 bytes code + 1 for
-p
Usage
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!
la source
-e
for free, adding ap
making it-pe
was +1? Will update for now, but if you could find a source I could quote/link to going forward, that'd be awesome!$&.qw(* - +)[$&<=>$1]
in the replacement part of thes///
operator.Actually, 30 bytes
Unfortunately, because the eval (
≡
) command only evaluates literals on TIO, this program does not work on TIO.Explanation:
la source
R,
12044 bytesTry it online!
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 usingrle(x)$values ^ rle(x)$lenghts
and dot-products this vector withsign( diff( rle(x)$values ) )
(predended with1
).la source
05AB1E (legacy),
171615 bytes-2 bytes thanks to @Emigna.
Try it online or verify all test cases.
Explanation:
la source
>
by moving+
to the end of the string.Ć
and¨
, if you use‚ζ
instead ofø
‚ζ
is a perfect alternative work-around, since the space is ignore in the eval. Thanks again. :)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.Runs from command line, will prompt for a comma separated list, like:
la source
PowerShell v2+, 62 bytes
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 to1+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 toiex
(alias forInvoke-Expression
and similar toeval
).la source
Japt, 25 bytes
Would like to cut it shorter, but I couldn't make an eval-less version work.
Try it online!
la source
Japt
-x
,2119 bytesTry it
Explanation
la source