Debe evaluar una cadena escrita en notación polaca inversa y generar el resultado.
El programa debe aceptar una entrada y devolver la salida. Para los lenguajes de programación que no tienen funciones para recibir entrada / salida, puede asumir funciones como readLine / print.
No está permitido utilizar ningún tipo de "evaluación" en el programa.
Los números y operadores están separados por uno o más espacios.
Debe admitir al menos los operadores +, -, * y /.
Debe agregar soporte a los números negativos (por ejemplo, -4
no es lo mismo que 0 4 -
) y los números de coma flotante.
Puede suponer que la entrada es válida y sigue las reglas anteriores
Casos de prueba
Entrada:
-4 5 +
Salida:
1
Entrada:
5 2 /
Salida:
2.5
Entrada:
5 2.5 /
Salida:
2
Entrada:
5 1 2 + 4 * 3 - +
Salida:
14
Entrada:
4 2 5 * + 1 3 2 * + /
Salida:
2
~
. :-Peval
para analizar números? Suena bastante roto. (GolfScript es uno de esos lenguajes, que yo sepa. Creo que también está roto.)eval(s)
es mejor quefloat(s)
Respuestas:
Ruby -
9577 caracteresToma entrada en stdin.
Código de prueba
da
A diferencia de la versión C, esto devuelve el último resultado válido si hay números adicionales agregados a la entrada que parece.
fuente
Python - 124 caracteres
Python - 133 caracteres
fuente
0
como segundo operando ...[a/b]
debe reemplazarseb and[a/b]
para que pueda tener 0 como segundo operando.Esquema, 162 caracteres
(Se agregaron saltos de línea para mayor claridad; todos son opcionales).
Versión completamente formateada (sin golf):
Comentario seleccionado
`(,foo ,@bar)
es lo mismo que(cons foo bar)
(es decir, (efectivamente † ) devuelve una nueva lista confoo
antepuesto abar
), excepto que es un carácter más corto si comprime todos los espacios.Por lo tanto, puede leer las cláusulas de iteración como
(loop (cons token stack))
y(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
si eso es más fácil para usted.`((+ ,+) (- ,-) (* ,*) (/ ,/))
crea una lista de asociación con el símbolo+
emparejado con el procedimiento+
, y del mismo modo con los otros operadores. Por lo tanto, se trata de una simple tabla de búsqueda de símbolos (las palabras simples aparecen(read)
como símbolos, por lo que notoken
es necesario seguir procesando ). Las listas de asociación tienen búsqueda O (n), y por lo tanto solo son adecuadas para listas cortas, como es el caso aquí. :-PAGS† Esto no es técnicamente exacto, pero, para los programadores que no son de Lisp, tiene una idea bastante correcta.
fuente
lambda (ass)
+1 para la elección del nombre de la variable: Pc - 424 caracteres necesarios
Asume que tiene una libc lo suficientemente nueva como para incluirla
getdelim
en stdio.h. El enfoque es directo, toda la entrada se lee en un búfer, luego se tokeniza constrsep
y usamos la longitud y el carácter inicial para determinar la clase de cada uno. No hay protección contra malas entradas. Aliméntalo "+ - * / + - ...", y felizmente sacará cosas de la memoria "debajo" de la pila hasta que falle. Todos los no operadores se interpretan como flotantes, loatof
que significa un valor cero si no parecen números.Legible y comentado:
Validación:
Je! Tengo que citar cualquier cosa que contenga
*
...y mi propio caso de prueba
fuente
case
con un makro.Haskell (155)
fuente
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
ahorraría 14 caracteres.MATLAB -
158, 147(la entrada se lee desde la entrada del usuario, la salida se imprime).
A continuación se muestra el código prettificado y comentado, prácticamente implementa el algoritmo de postfix descrito (con el supuesto de que las expresiones son válidas):
Prima:
En el código anterior, suponemos que los operadores son siempre binario (
+
,-
,*
,/
). Podemos generalizarlo usandonargin(f)
para determinar la cantidad de argumentos que requiere el operando / función, y extraer la cantidad correcta de valores de la pila en consecuencia, como en:De esa manera podemos evaluar expresiones como:
donde
mean_of_three
es una función definida por el usuario con tres entradas:fuente
Perl (134)
La próxima vez, voy a usar la cosa de expresión regular recursiva.
Sin golf:
Pensé que F # es el único lenguaje de programación de mis sueños ...
fuente
Windows PowerShell, 152
181192En forma legible, porque ahora son solo dos líneas sin posibilidad de separarlas:
30-01-2010 11:07 (192) - Primer intento.
2010-01-30 11:09 (170) - Convertir la función en un bloque de script resuelve los problemas de alcance. Solo hace que cada invocación sea dos bytes más larga.
30-01-2010 11:19 (188) - No resolvió el problema del alcance, el caso de prueba simplemente lo enmascaró. Sin embargo, se eliminó el índice de la salida final y se eliminó un salto de línea superfluo. Y cambió el doble a
float
.30-01-2010 11:19 (181) - Ni siquiera puedo recordar mi propio consejo. La conversión a un tipo numérico se puede hacer en un solo carácter.
30-01-2010 11:39 (152) - Gran reducción al usar la coincidencia de expresiones regulares en
switch
. Resuelve completamente los problemas de alcance anteriores con el acceso a la pila para reventarla.fuente
Raqueta 131:
Saltos de línea opcionales.
Basado en la solución de Chris Jester-Young para Scheme.
fuente
Python, 166 caracteres
fuente
raw_input()
código de uso no se divide en varias líneas.from operator import*
y reemplazaro.div
condiv
.Python 3, 119 bytes
Entrada:
5 1 1 - -7 0 * + - 2 /
Salida:
2.5
(Puede encontrar una versión de Python 2 de 128 caracteres en el historial de edición).
fuente
/
en la cadena.ZeroDivisionError
cuando el segundo operando es 0 (por ejemplo5 0 +
).ord(x) - 42
métodoJavaScript (157)
Este código supone que existen estas dos funciones: readLine e print
fuente
prompt()
lugar dereadLine()
(y talalert()
vez en lugar deprint()
coincidirprompt()
).Perl, 128
Esto no es realmente competitivo al lado de la otra respuesta de Perl, pero explora una ruta diferente (subóptima).
Los caracteres cuentan como diff a una simple
perl -e ''
invocación.fuente
Python, 161 caracteres:
fuente
PHP,
439265263262244240 caracteresEste código debería funcionar con stdin, aunque no se ha probado con stdin.
Se ha probado en todos los casos, la salida (y el código) para el último está aquí:
http://codepad.viper-7.com/fGbnv6
Ungolfed,
314330326 caracteresfuente
flex - 157
Si no está familiarizado, compile con
flex rpn.l && gcc -lfl lex.yy.c
fuente
Python, 130 caracteres
Serían 124 caracteres si lo dejamos caer
b and
(que faltan algunas de las respuestas de Python). ¡Y incorpora 42!fuente
Python 3,
126132 caracteresYa ha habido mejores soluciones, pero ahora que lo había escrito (sin haber leído las presentaciones anteriores, por supuesto, aunque tengo que admitir que mi código parece haberlas pegado), quería compartirlo, también.
fuente
b/a
debe reemplazarse cona and b/a
, de lo contrario, esta solución no funcionará si el segundo operando es 0 (por ejemplo4 0 -
).c99 gcc 235
Esto funciona para mí (con advertencias):
Pero si lo está compilando con mingw32, debe desactivar el globbing (consulte https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) compilando así:
Si no lo hace *, el CRT de mingw32 lo expande automáticamente.
¿Alguien sabe cómo convertirse
break;case'*':s[--d]*=s[d+1];
en una macro que acepte el carácter + como parámetro porque entonces los cuatro casos seríanO(+)O(-)O(*)O(/)
fuente
C,
232229 bytesDiversión con recursividad.
Sin golf:
Casos de prueba:
fuente
JavaScript ES7, 119 bytes
Tengo un error con la comprensión de la matriz, así que he usado
.map
Pruébelo en línea en ESFiddle
fuente
PHP - 259 caracteres
Asumiendo entrada en la variable POST i .
fuente
C # - 392 caracteres
Sin embargo, si se pueden usar argumentos en lugar de una entrada estándar, podemos reducirlo a
C # - 366 caracteres
fuente
Scala
412 376 349 335312:fuente
Python - 206
Versión sin golf:
Entrada del argumento de la línea de comandos; salida en salida estándar.
fuente
ECMAScript 6 (131)
Solo escribí juntos en unos pocos segundos, por lo que probablemente se pueda jugar más golf o tal vez incluso abordarlo mejor. Podría volver a visitarlo mañana:
fuente
C # -
323284241Editar: reemplazar la pila con una matriz es mucho más corto
Edit2: reemplazó los ifs con una expresión ternaria
fuente
string[] i
=>string[]i
.Python 2
He probado algunos enfoques diferentes a los publicados hasta ahora. Ninguno de estos es tan corto como las mejores soluciones de Python, pero pueden ser interesantes para algunos de ustedes.
Usando recursividad, 146
Usando la manipulación de listas, 149
Usando
reduce()
, 145fuente
Matlab, 228
Sin golf:
fuente
;
. Así que creo que el número de bytes es el mismocr+lf
una nueva línea, que tiene 2 caracteres. Mi bloc de notas ++ contó 230 caracteres en su versión de 3 líneas, pero solo 128 si pego todo en una línea (eliminé 2 * 2 = 4 caracteres de las 2 líneas nuevas y agregué dos;
). Pruébelo usted mismo;)K5, 70 bytes
No estoy seguro de cuándo se lanzó K5, por lo que esto podría no contar. ¡Sigue siendo increíble!
fuente