Escriba código para evaluar si una cadena de desigualdades es verdadera o falsa. Un ejemplo de entrada es la cadena
3<=4!=9>3==3
Esto es cierto porque cada uno de sus componentes es verdadero:
(3<=4) and (4!=9) and (9>3) and (3==3)
Entrada:
Una cadena que representa una cadena de una o más desigualdades. Los operadores de comparación permitidos son
== equals
!= does not equal
> is greater than
>= is greater than or equal to
< is less than
<= is less than or equal to
Los números permitidos son números de un solo dígito 0
hasta 9
. No habrá espacios, paréntesis u otros símbolos.
Salida:
La corrección de la desigualdad como un valor consistente de Verdad o Falsey . Consistente significa que cada salida de Truthy es igual y cada salida de Falsey es igual.
Restricción:
La intención de este desafío es que usted escriba código que procese las desigualdades, en lugar de hacer que las evalúen como código, incluso para una única desigualdad en la cadena. Como tal, los métodos como Python eval
y exec
que evalúan o ejecutan código están prohibidos. También lo son las funciones que buscan un método u operador dado su nombre como una cadena. Tampoco está permitido iniciar procesos o programas para hacer la evaluación por usted.
Casos de prueba:
3<=4!=9>3==3
True
3<=4!=4
False
5>5
False
8==8<9>0!=2>=1
True
Respuestas:
Rubí, 71 + 1 = 72
Con el indicador de línea de comando
-n
, ejecuteGenera todas las posibles expresiones regulares que fallan y comprueba si la cadena de entrada coincide con alguna de ellas. Salidas
true
si ninguna lo hace, de lo contrariofalse
. Toma datos a través de STDIN, separados por nuevas líneas.Trucos:
a<=>b
, que devuelve -1,0, o 1 por menos de, igual o mayor. Todos estos se dividen en diferentes elementos de una matriz de tres cadenas, encontrando la expresión regular para las comparaciones que no coinciden.fuente
Perl, 82
Imprime 1 cuando es verdadero y una línea en blanco cuando es falso, ya que la cadena vacía es el principal valor de falsey de Perl.
El bucle while pasa sobre la cadena que coincide con la expresión regular
\d(.)(=?)
. Luego las variables$1
y$2
corresponden a los caracteres del operador, y las variables especiales$&
y$'
se comportarán como los dos operandos en un contexto numérico. Los operandos se comparan con<=>
y el resultado el primer carácter del operador. Entonces la igualdad y la desigualdad se tratan especialmente.fuente
CJam, 60 bytes
Este código parece un poco feo y potencialmente no está completamente optimizado, pero es el mejor que tengo hasta ahora.
Pruébalo en línea.
Explicación
fuente
JavaScript (ES6) 110
116Directo: cadena de escaneo, c es el dígito actual, l es el último dígito, o es el operador.
Prueba en la consola Firefox / FireBug
fuente
Haskell, 156 bytes
Ejemplo de uso:
Versión sin golf:
eval
toma dos argumentos: la cadena para analizar (comenzando siempre con un operador de comparación) y un númeroi
que es el argumento izquierdo para la comparación (y fue el argumento correcto en la ronda anterior). El operador se devuelvelookup2
si es un operador de dos caracteres (marque solo el primer carácter, porque el segundo siempre es=
) ylookup1
si es solo un carácter.eval
se llama recursivamente y combina todos los valores de retorno con lógico y&&
.fuente
Lisp común
300185169165Ejemplo
Explicación
ppcre:split
se divide en dígitos; por ejemplo:Observe la primera cadena vacía, que se descarta usando
cdr
La asignación
read-from-string
a esta lista llama a laread
función para cada cadena, que devuelve símbolos y números.loop for (a op b) on '(3 < 5 > 2) by #'cddr
itera sobre la lista en un paso de 2 y, por lo tantoa
, se une ,op
y de lab
siguiente manera, para cada pase sucesivo.always
comprueba si la siguiente expresión es siempre verdadera: el operador esnil
(ver arriba) o el resultado de las retenciones de comparación (ver abajo).los
case
selecciona una función de comparación Common-Lisp, de acuerdo con el símbolo leído anteriormente; Dado que algunos operadores son idénticos en Lisp y en el idioma dado, simplemente podemos regresaro
en el caso predeterminado.fuente
Python 2,
95102El bucle es un paso directo a través de la cadena de un carácter a la vez. La
t&=...
parte es donde sucede la magia. Básicamente, hash el operador junto con el valor decmp(lhs,rhs)
(-1, 0 o 1 dependiendo de silhs
es menor, igual o mayor querhs
). El resultado es una clave en una tabla de búsqueda que da 0 o 1 dependiendo de si los números se comparan correctamente dado ese operador. ¿Qué tabla de búsqueda, preguntas? Es el número 627 =0001001110011
en binario. Los operadores bit a bit hacen el resto.Esto funciona en los cuatro casos de prueba dados; avíseme si encuentra un error para otro caso. No lo he probado muy rigurosamente.
fuente
a
como entrada.Javascript 101 bytes
un enfoque diferente de la solución js publicada aquí
fuente
Java 8, 283 bytes
Explicación:
Pruébalo aquí
fuente