Dada una lista no vacía de enteros no negativos, considere reescribirlo como un problema aritmético donde:
- Se
+
inserta un signo más ( ) entre pares de números que aumentan de izquierda a derecha (también conocido desde el principio de la lista hasta el final). - Se
-
inserta un signo menos ( ) entre pares de números que disminuyen de izquierda a derecha. - Se
*
inserta un signo de multiplicación ( ) entre pares de números que son iguales.
Dicho de otra manera: cualquier sublista se a,b
convierte en a+b
if a<b
, a-b
if a>b
y a*b
if a==b
.
Por ejemplo, la lista
[12, 0, 7, 7, 29, 10, 2, 2, 1]
se convertiría en la expresión
12 - 0 + 7*7 + 29 - 10 - 2*2 - 1
que evalúa a 75
.
Escriba un programa o función que tome esa lista y la evalúe, imprimiendo o devolviendo el resultado.
- El orden de las operaciones importa. Las multiplicaciones deben hacerse antes de cualquier suma o resta.
- Si la lista de entrada tiene un número, eso debería ser lo que evalúa. Por ejemplo,
[64]
debería dar64
. - El uso de
eval
oexec
se permite o similares constructos.
Aquí hay algunos ejemplos adicionales:
[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
El código más corto en bytes gana. Tiebreaker es la respuesta anterior.
code-golf
math
number
arithmetic
Pasatiempos de Calvin
fuente
fuente
Respuestas:
Python 2, 63 bytes
Construye y
eval
s la cadena de expresión. El símbolo aritmético se elige comparando el número anteriorp
con el actualx
. El símbolo se agrega seguido del número actual.El primer número se maneja con un ingenioso truco de Sp3000. El valor inicial de
p
se establece en una cadena, que es más grande que cualquier número y, por lo tanto, causa un-
antes del primer número. Pero,s
se inicializa alprint-
mismo tiempo que hace que el resultado comience conprint--
(gracias a xsot por guardar 2 bytes al inicializar conprint
).fuente
print
a la cadena y usar enexec
lugar deeval
.Pyth,
312619171615 bytesLas expresiones con
*
no se evaluarán en línea, pero teóricamente funcionarían.2 bytes gracias a Maltysen.
Conjunto de pruebas (con evaluación).
Los otros casos (sin evaluación).
Historia
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
M+G@"*-+"->GH<GHv+sgVQtQ\x60e
vtssVm@"*-+"->Zd<~Z
vtssVm@"*-+"._-~Z
vssVm@"*-+"._-~k
vsm+@"*-+"._-~k
fuente
+
y en-
línea)--safe
interruptor, que reemplazaeval
conast.literal_eval
.Jalea ,
18161514 bytesNo utiliza evaluaciones integradas. Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
eval
como un átomo ...MATL , 12 bytes
Esto utiliza la muy buena idea de @ aditsu de codificación de longitud de ejecución.
Pruébalo en línea!
Explicación
fuente
CJam, 20
Pruébalo en línea
Explicación:
fuente
JavaScript (ES6), 54
eval
recibe una lista de expresiones separadas por comas y devuelve el valor de la última.Prueba
fuente
Julia,
7657 bytesMi primera vez jugando al golf con Julia, así que quizás haya mejoras obvias. Pruébalo en línea!
Dennis ahorró una tonelada de bytes.
fuente
!
.Pyth -
232220 bytesAl igual que con Kenny's, la multiplicación no funciona en línea.
Test Suite sin hacer eval .
fuente
R, 92 bytes
Es probable que todavía se pueda hacer un buen golf aquí.
Sin golf:
fuente
Brachylog ,
3432 bytesPruébalo en línea!
fuente
TI-BASIC, 146 bytes
Lo formatearé bien cuando no esté en el móvil. El sueño se me escapa, así que entiendes esto. Disfrutar.
fuente
Javascript ES6,
6462 caracteresfuente
a
un parámetro?a[i+1]...a[i+1]
=>a[++i]...a[i]
- 2 caracteres más cortos, pero reemplacé por error la caída completa del códigoa=>
).Java, 384 bytes
Intente sin golf en línea
fuente
int a=l.length
,&&
=>&
, poner elint i=0
en la misma "línea" comoint 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;
, puede reemplazar esto con el contenido dentro delelse
bloque.Javascript ES6, 79 caracteres
fuente
Perl, 49 bytes
48 bytes código + 1 para
-p
Uso
Notas
Aprendí aquí que puedes capturar un lookahead en PCRE, aunque es un poco intuitivo (en
(?=(\d+))
lugar de((?=\d+))
). Sin embargo, tiene sentido después de leer, ya que capturaría una coincidencia de longitud cero (la búsqueda anticipada) con la última, y en su lugar capturará la coincidencia con la primera).¡Gracias a @ninjalj por guardar 8 bytes!
fuente
-e
gratis, agregué un resultadop
que-pe
fue +1 ? Se actualizará por ahora, pero si pudieras encontrar una fuente que pudiera citar / vincular para seguir adelante, ¡sería increíble!$&.qw(* - +)[$&<=>$1]
en la parte de reemplazo dels///
operador.En realidad, 30 bytes
Desafortunadamente, porque el eval (
≡
comando ) solo evalúa literales en TIO, este programa no funciona en TIO.Explicación:
fuente
R ,
12044 bytesPruébalo en línea!
El algoritmo es similar a esta respuesta , pero solo me di cuenta después de codificar mi respuesta. Mucho mejor que mi respuesta original que estaba usando
eval(parse)
.Aprovecha al máximo las operaciones vectorizadas de R:
*
primero realiza la operaciónrle(x)$values ^ rle(x)$lenghts
y utiliza productos de punto con este vectorsign( diff( rle(x)$values ) )
(precedido por1
).fuente
05AB1E (heredado) ,
171615 bytes-2 bytes gracias a @Emigna .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
>
moviéndose+
al final de la cadena.Ć
y¨
, si lo usa en‚ζ
lugar deø
‚ζ
es una alternativa perfecta, ya que el espacio se ignora en la evaluación. Gracias de nuevo. :)PHP, 103 bytes
Buen desafío. Esto se hizo más largo de lo esperado. Creo que usando
array_map
o similar no mejorará el recuento de bytes, ya que las funciones anónimas siguen siendo caras en PHP.Se ejecuta desde la línea de comandos, solicitará una lista separada por comas, como:
fuente
PowerShell v2 +, 62 bytes
Toma datos como argumentos de línea de comandos separados por espacios, que se convierten en una matriz automática
$args
. Realizamos iteraciones a través de cada elemento, utilizando la variable auxiliar$o
cada iteración para recordar cuál fue nuestra entrada anterior. Usamos una cadena indexada para extraer el operador apropiado, que se realiza mediante la matemática de los valores booleanos convertidos implícitamente (p. Ej., Si la entrada anterior es más pequeña, la[]
evaluación1+2*0
también'*+-'[1]
significa que+
está seleccionada).Las cadenas concatenadas se dejan en la tubería. Recopilamos todos esos fragmentos entre sí (por ejemplo,
3-
,1+
,4-
, etc.) con una-join
operación de concatenación del número final (implícitamente convertido en cadena), y el tubo de TIiex
(alias paraInvoke-Expression
y similares aeval
).fuente
Japt , 25 bytes
Me gustaría acortarlo, pero no pude hacer que una versión sin evaluación funcione.
Pruébalo en línea!
fuente
Japt
-x
,2119 bytesIntentalo
Explicación
fuente