Tarea
Su tarea es escribir una función o un programa en un lenguaje de su elección que analice un par de declaraciones y determine si de esas declaraciones se puede concluir que los cerdos pueden volar.
Entrada
La entrada es una cadena que puede leerse desde STDIN, tomarse como un argumento de función o incluso almacenarse en un archivo. La entrada se puede describir utilizando el siguiente EBNF:
input = statement , {statement};
statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". ";
attribute = [not], ("able to fly" | singleAttribute);
singleAttribute = letter, {letter};
letter = "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z" ;
Entrada de ejemplo (ver más ejemplos a continuación):
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet.
Salida
La función puede devolver el resultado, escribirlo en un archivo o imprimirlo en STDOUT. Hay 5 casos diferentes para ser manejados:
- Las declaraciones dadas son válidas, consistentes y tienen como consecuencia lógica que los cerdos pueden volar. En ese caso, debe generar
Yes
. - Las declaraciones dadas son válidas, consistentes y tienen como consecuencia lógica que los cerdos no pueden volar. En ese caso, debe generar
No
. - No se puede concluir de las declaraciones dadas, válidas y consistentes si los cerdos pueden volar o no. En ese caso, debe generar
Maybe
. - Las declaraciones dadas son válidas, pero no consistentes (es decir, hay una contradicción en las declaraciones dadas). Desde ex falso quodlibet , decidimos dar salida
Yes
en ese caso. - Las declaraciones dadas no son válidas, es decir, no están formateadas de acuerdo con el EBNF dado. En ese caso, puede hacer lo que quiera.
Detalles
- Puede suponer que los atributos dados son independientes entre sí. Entonces, por ejemplo, un cerdo puede ser joven y viejo, verde, rojo y azul al mismo tiempo sin causar ninguna inconsistencia. Sin embargo, un cerdo puede no ser 'verde' y 'no verde' al mismo tiempo, eso es una contradicción y debe manejarse como se describe en (4).
- Para cada atributo, suponga que hay al menos un objeto (no necesariamente un cerdo) en el universo que tiene el atributo dado y un objeto que no lo tiene.
Ejemplo de entradas y salidas
Entrada:
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent.
Salida: como los cerdos son verdes y, por lo tanto, inteligentes, y todo lo que puede volar no es inteligente, los cerdos no pueden volar. La salida es No
.
Entrada:
Pigs are old. Everything that is not able to fly is also not old.
Salida: si los cerdos no pudieron volar, tampoco eran viejos. Pero como son viejos, debes dar salida Yes
.
Entrada:
Everything that is sweet is also not old. Everything that is intelligent is also blue.
Salida: Maybe
.
Entrada:
Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red.
Salida: aunque la primera declaración implica que los cerdos no pueden volar, las siguientes declaraciones se contradicen entre sí y, por lo tanto, la salida debe serlo Yes
.
Entrada:
Pigs are very smart. Pigs are able to fly.
Salida: lo que quieras, ya que la cadena no coincide con los criterios mencionados anteriormente.
Ganador
Este es el código de golf , por lo que gana la respuesta correcta más corta (en bytes). El ganador será elegido una semana después de que se publique la primera respuesta correcta.
fuente
Respuestas:
Perl,
363353350347343297266264Sin golf / Explicación:
fuente
Haskell,
586566547 bytesEscribí esto suponiendo que para cada propiedad P debe existir alguna x e y tal que P (x) sea verdadera y P (y) sea falsa; sin esta suposición, la entrada del cuarto ejemplo no tendría una contradicción y respondería "No".
Esto debe compilarse con la opción de línea de comando ghc "-cpp". La entrada debe ser terminada por EOF (^ D). Puede probarlo en línea en http://melpon.org/wandbox/ , pero no puede configurar las opciones de línea de comandos. En cambio, puede prefijar el programa con la opción de idioma
Funciona recolectando el conjunto de rasgos, luego filtrando el conjunto de rasgos -> valoraciones de verdad usando las implicaciones en la entrada. Luego, el resultado se prueba para garantizar que cada rasgo pueda asignarse de manera válida tanto a Verdadero como a Falso (el caso aquí es el caso de falso falso quodlibet ). Finalmente, busca valoraciones que coincidan con los hechos del cerdo, verificando el valor de "capaz de volar" en cada valoración.
Se perdieron bastantes bytes en el estado de subprocesamiento: el conjunto de rasgos vistos hasta ahora, la función de selector de hechos de cerdo y la función de filtrado determinada por las implicaciones. Probablemente, la misma idea exacta sería mucho más corta en un lenguaje impuro.
Editar: ahorró varios bytes por sugerencia de Haskeller orgulloso, luego un par extra al reemplazar el enlace de z y "u% drop 2 z" con un enlace a "_: _: z" y "u% z", guardando 3.
Edición 2: guardado un poco más. Utilicé el truco (#) = (,) para guardar 2 bytes y aprendí sobre sinónimos de patrones ( https://ghc.haskell.org/trac/ghc/wiki/PatternSynomains ), pero la notación era demasiado detallada para obtener un ahorro de eliminando el resto de los pares en este programa. Exprimió algunos ahorros más al cambiar los patrones que busca el analizador. Por ejemplo: si una oración no comienza con Cerdos y nos queda algo en el estado del analizador, analizamos una oración "Todo lo que es ...". Esto ahorró muchos caracteres en los patrones para X y%.
fuente
u n=(:)<$>[t,f]<*>u(n-1)
(aunque esto requeriría importarc l=(all(==l!!0)l,and l)
Python,
547536525521513509497503501Para cada uno
a -> b
en la entrada, agregamos la cláusula dada y su negaciónnot b -> not a
al conjunto de cláusulas y luego calculamos el conjunto de proposiciones que son->
accesibles desde cualquier proposición usando un bucle de punto fijo. Cada vez que encontramos una contradicción, tiramos (y luego atrapamos) aZeroDivisionError
e imprimimosYes
.Finalmente, verificamos si 'capaz de volar' (y / o su negación) es accesible desde la propuesta 'es cerdo'
''
e imprimimos la respuesta adecuada.EDITAR :
Esto tiene errores, lo está arreglando.Fijo.fuente
try
bloque en la misma línea quetry:
Rubí 1.9.3 (
365 364362)Uso
El código anterior define una función
f
, que tiene un parámetro que representa la entrada textual y vuelveYes
,No
oMaybe
.Por ejemplo:
Prueba en línea: http://ideone.com/fxLemg
El código no protegido (incluidas las pruebas unitarias) está disponible aquí .
fuente