Antecedentes
Recientemente ha sido contratado por una pequeña empresa de contabilidad. El mundo de la contabilidad es algo extraño para usted, por lo que no está seguro de seguir todas las pautas profesionales. En particular, no sabes cuándo debes redondear todos esos números y en qué dirección, por lo que la mayoría de las veces simplemente lo alejas y esperas lo mejor.
Entrada
Su entrada es una sola cadena que representa un cálculo simple. Contiene cierto número de enteros no negativos delimitados por los caracteres +-*/
. La cadena se lee de izquierda a derecha y se ignoran las reglas de precedencia normales, por lo que "23+1*3/4"
significa "comenzar con 23, sumar 1, multiplicar por 3 y dividir por 4", el resultado es 18. La entrada no contendrá números que comiencen con 0
(excepto en 0
sí mismo), ni una división por cero.
Salida
En cada etapa del cálculo, puede redondear el resultado hacia arriba o hacia abajo al entero más cercano o mantenerlo como está. Finalmente, redondeas hacia arriba o hacia abajo para obtener un resultado entero. Su salida es la lista de enteros que pueden resultar de dicho cálculo, ordenados y sin duplicados.
Reglas
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, que puede fallar si usa números de coma flotante.Respuestas:
J 84 bytes
Comenzando desde una lista de 1 elemento, la función mantiene todos los números intermedios posibles en la lista evaluando la siguiente expresión y agregando sus copias redondeadas hacia arriba y hacia abajo.
Jugará más al golf y agregará una explicación mañana.No puedo encontrar formas obvias de jugar más al golf.Pasa todas las pruebas.
Uso:
Pruébalo aquí.
fuente
x
al final de la lista.Python 2, 220 caracteres
Mantiene una lista de todos los números posibles y, en cada paso, genera tres números para cada número de la lista, incluso si hay duplicados. Por lo tanto, la complejidad del tiempo de ejecución es exponencial. Sin embargo, funciona instantáneamente para estos pequeños ejemplos. Los engaños se eliminan al final.
Se utiliza
fractions.Fraction
para hacer una división exacta, evitando inexactitudes de coma flotante.Agregue 5 caracteres (
r=map(X,g)
->r=set(map(X,g))
) para aumentar drásticamente el rendimiento.fuente
\D
es una clase de caracteres predefinida para emparejar sin dígitosr"(\D)"
o"(\\D)"
. Además, si usa Python 3, puede reemplazar la indexaciónF
con asignación destacada, por ejemplo:,A,B,*F=F
useA
y enB
lugar deF[0]
yF[1]
, y elimineF=F[2:]
."\D"
termina trabajando de todos modos y es más corto. No es una secuencia de escape válida, por lo que Python solo incluye el\
yD
textualmente. Buen consejo de Python3 en realidad, lo comprobaré, aunque tendré que reemplazar los backticksrepr()
y convertir elmap
resultado en una lista. La asignación destacada es algo que desearía que Python 2 tuviera ...Python,
421370354 bytesLo siento, por favor tengan paciencia conmigo. Soy realmente nuevo en Python (solo estaba buscando un lenguaje que admita fractiosn) y utilicé todos los pocos trucos que conocía para acortar el código, pero todavía es un monstruo considerando que hay una solución de Python de casi la mitad del tamaño. Aprendí mucho y pensé en enviarlo de todos modos =)
Nueva versión gracias a @ kirbyfan64sos y @Zgarb
Versión antigua
fuente
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
). Además,[floor(k) for k in n]
puede acortarsemap(floor, n)
y lasn.add
llamadas pueden hacersen.extend([floor(f), ceil(f), f])
.F
solo se usa una vez, por lo que podría hacerfrom fractions import*
y guardar algunos bytes. Lo mismo conmath
. Elimina los espacios alrededor=
, son innecesarios. Además, debe asignar la entrada a ens
lugar de la codificación rígida.s=input()
lugar des = "1/3*9"
, elimine sus comentarios, etc.Mathematica, 134
fuente
MATLAB, 283 caracteres
Sin golf:
Mientras escribía esto, me di cuenta de que hay una forma aún más corta de hacerlo, que agregaré una vez que termine de escribirlo.
fuente
VBA, 347 bytes
fuente