Su tarea es tomar una lista de argumentos que sean enteros u operadores, y analizarlos así:
Hay un operador actual, que comienza como +.
Cada vez que se encuentra un operador, el operador actual cambiará a él.
Los operadores posibles son: "+", "-", "*", "/" y "%", que corresponden a sus significados en C y la mayoría de los lenguajes.
Hay una solución en ejecución que comienza en 0.
Cada vez que se encuentra un número entero, la solución se modifica por el número dependiendo del operador; por ejemplo, si el operador es "/", entonces la solución se divide por el número.
Si una operación daría como resultado un número mixto (es decir, con un decimal), debe volver a un número entero (es decir, el decimal debe cortarse).
Salida de la solución final.
Por ejemplo:
Los argumentos 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
darían como resultado:
5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
0 5 13 38 342 2052 4104 4000 1000 142 148 8 -> 8
Las entradas serán como argumentos de línea de comando o función, o un equivalente para su idioma.
¡El código más corto gana!
%
redondea hacia -inf en lugar de 0?Respuestas:
Pyth -
24232220 bytes¡2 bytes guardados gracias a @issacg y 1 gracias a @orlp!
Los usos se reducen con el caso base
0
y se comprueba si'
está en repr para detectar la cadena frente a int.No funciona en línea porque uso eval completo que está deshabilitado en línea por razones de seguridad. Toma de entrada de la entrada estándar en una lista como tal:
5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6
.fuente
?
a.x
, porque solo el bloque else puede lanzar una excepción, y lo hará cada vez. SinK
embargo, ya no puedes usar .u.xsv++GbH&=bHG+\+QZ
específicamente.JavaScript (ES6) 53
Una función que toma una matriz como entrada.
Ejecute el fragmento en Firefox para probar.
fuente
Julia,
8583 bytesEsto crea una función sin nombre que acepta una cadena como entrada y devuelve un entero.
Sin golf:
Problema solucionado y ahorró 2 bytes gracias a Glen O.
fuente
o is not defined
cuando intentas ejecutar la función recién. Intenta ejecutar la función "o = ifloor ..." en Main, en lugar de dentro de la función (ver aquí github.com/JuliaLang/julia/issues/2386 ). ¿Puedo sugerirs->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)
?elisp, 101 bytes
Con los argumentos pasados como una lista citada: ej.
(c '(5 5 * 10))
Versión con nuevas líneas:
fuente
CJam, 24 bytes
Este es un programa completo que lee la entrada como argumentos de línea de comandos.
Para probar el código en línea en el intérprete de CJam (que no admite argumentos de línea de comandos), reemplace
ea
conlS/
para leer desde STDIN simulado.Cómo funciona
fuente
JavaScript, 85 bytes
fuente
o+ +t
? De todos modos, está creando una cadena, no es necesario convertir a número. Además,.forEach
no tiene lugar en Code Golf: use.map
prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)
-> 75 bytes.Lua, 142 bytes
Sin golf:
fuente
Powershell, 57 bytes
sin golf
Si la variable implícita en for-each es un operador en lugar de un número, Invoke-Expression (POSH's
eval()
) fallará y el estado de ejecución$?
será falso.Floor en POSH es difícil de manejar,
$foo=[math]::floor($foo)
y$foo-=$foo%1
fue la alternativa de golf que se me ocurrió.fuente
if
ingiriendo dígitos, pero esencialmente lo mismo. 89 Bytes$o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
GNU Sed (con la extensión eval, + dc), 102
(La puntuación incluye +1 para la opción -r de sed.)
Transforma la expresión de entrada a notación polaca inversa y luego la usa
dc
para evaluarla.Prueba de salida:
fuente
CJam, 34 bytes
Pruébalo en línea
Pensé que esto sería bastante razonable. Pero no fui lo suficientemente rápido para publicarlo como para ser la respuesta más corta de CJam al menos por un momento. :(
fuente
Python 3:
131 bytes129 bytes121 bytes116 bytesGracias a Maltysen por eliminar dos bytes, Beta Decay por eliminar 8 y Steven Rumbalski por eliminar 5.
Estoy tratando de encontrar una manera de reducir la longitud de la declaración if, pero por ahora esto parece lo más complejo posible. Toma la entrada como una lista.
fuente
int
con//1
in
y la cita..split()
.Bash, 69
Esto solo funciona con enteros no negativos: no está claro en la pregunta si está bien o no.
fuente
Groovy, 79 bytes
Manifestación:
Sin golf:
fuente
gcc (con advertencias) 165 (si el final de línea cuenta como 1)
Pero si lo está compilando con mingw32, debe desactivar el globbing (consulte https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) compilando así:
fuente
Perl 5.10+, 52 bytes
Manifestación:
(Tenga en cuenta que
*
se debe escapar en mi shell para que no se interprete como un patrón global).Sin golf:
fuente
C #,
132165168bytesEsta función asume que la entrada es válida. Esto es difícil para C # dado que no hay
eval
equivalente.¡Gracias edc65 por guardar 33 bytes!
Sangrado por claridad.
fuente
?:
->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
Ruby, 59 bytes
Prueba de funcionamiento:
fuente