Si recuerdas tus años de escuela, tal vez recuerdes haber aprendido sobre las Tablas de la verdad . Parecían aburridos, pero son la base de la lógica y (algunos argumentarían) toda la informática ...
Problema
Su misión, si elige aceptarla, es escribir un programa, función o widget de código que pueda generar una entrada de tabla de verdad.
Entrada
La entrada será una cadena (como la estructura de datos) que contiene la declaración lógica para hacer la tabla de verdad. Por ejemplo:
p ∧ q
Esto significa p and q
(conjunción lógica) y generará:
p q p ∧ q
T T T
T F F
F T F
F F F
Observe el espaciado: el elemento de la columna está en el centro del encabezado
Caracteres
Puntuación a través de caracteres, no bytes Los caracteres de comparación lógica son especiales y no siempre se ven como son. Usa estos personajes:
Conjunción Lógica (Y): ∧
U + 2227
Disyunción lógica (OR): ∨
U + 2228
Negación lógica (NO) ~
o ¬
U + 7e y U + ac respectivamente
Bonos
Todos estos bonos son opcionales, pero eliminarán puntos de su puntaje. Elige cualquiera.
Negación Lógica
La negación lógica es un operador unario en las tablas de verdad. Es el equivalente de !
en la mayoría de los lenguajes basados en C. Hace false
=> true
y viceversa. Se anota con un ¬
o ~
(debe admitir ambos). Apoyar esto eliminará el 10% de su puntaje. Sin embargo, debe agregar una columna adicional para mostrar sus resultados: Por ejemplo:
~p ∧ q
dará salida:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
Impresión bonita
La notación de tabla normal es aburrida. ¡Hagámoslo bonito! El formato de impresión bonito es el siguiente, ya que p ∧ q
es el siguiente:
+---+---+-------+
| p | q | p ∧ q |
+---+---+-------+
| T | T | T |
+---+---+-------+
| T | F | F |
+---+---+-------+
| F | T | F |
+---+---+-------+
| F | F | F |
+---+---+-------+
Detalles especiales para una bonita impresión:
- Hay un espacio de 1 espacio en cada celda
- Los valores de celda aún están centrados
Si imprime bien sus tablas, desde su código y luego multiplique por 0.6. Use esta función para este bono:
score = 0.6 * code
Ejemplos
p ∧ q
:
p q p ∧ q
T T T
T F F
F T F
F F F
p ∨ q
:
p q p ∨ q
T T T
T F T
F T T
F F F
~p ∧ q
:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
~p ∨ q
:
p ~p q ~p ∧ q
T F T T
T F F F
F T T T
F T F T
Reglas
- Se aplican lagunas estándar
- Sin recursos externos
- Si vas a romper las reglas, sé inteligente;)
El código más corto (en caracteres) gana. ¡Buena suerte!
fuente
p
yq
. A menos que siempre tengan estos nombres, es posible que desee mostrar algunas opciones diferentes en los ejemplos de prueba. ¿Son siempre una sola letra?score = 0.6 * (code - 15)
=.6 * code - 9
p
q
yr
en una tabla de verdad;)Respuestas:
JavaScript (ES6), 141
Función simple, sin bonificación, 141 caracteres. (140 uft8, 1 ancho unicode)
Manejo de funciones complejas ~ o ¬, 254 caracteres (253 utf, 1 unicode de ancho), puntaje 229
Podría ahorrar 6 bytes usando en
alert
lugar deconsole.log
, peroalert
es particularmente inadecuado para mostrar tablas.Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 (probado con Firefox. No funcionará en Chrome ya que Chrome no es compatible
...
. Además, la versión de bonificación utiliza una extensiónsplit
específica de Firefox).fuente
Plantilla MediaWiki - 2347 caracteres
MediaWiki tiene una función de plantilla integrada llamada
{{#expr}}
que puede manejar expresiones lógicas. ¡Este debe ser el desafío perfecto para las plantillas de MediaWiki! Sin embargo, características como variables, bucles y una sintaxis legible habrían ayudado un poco. Además, el hecho de que no haya un operador NOT para la función expr la hizo un poco más compleja.Prueba:
Resultado:
Supongo que MediaWiki> = 1.18, donde las extensiones ParserFunctions vienen incluidas con el software.
fuente
¬
/~
; si lo agrega, calificará para un10%
bono.Python: 288 caracteres (+10 de penalización porque no pude hacer que Unicode funcione: c)
Sin bonificaciones Esta es mi primera respuesta codegolf.
i
es la entradaEDITAR: se eliminaron algunos espacios y ahora utiliza argumentos de función como entrada.
fuente
Dyalog APL ,
5848 caracteresRequiere
⎕IO←0
, que es el predeterminado en muchos sistemas. Toma una cuerda como argumento.Sin bonificaciones, pero en el lado positivo, cualquier operador trabaja.
⍳4
primeros cuatro índices (0 1 2 3)⌽
reversa (3 2 1 0)2 2⊤
tabla booleana de dos bits↓
dividido en una lista de dos elementos de listas (bits altos, bits bajos)p q←
almacenar como p y q≢
contarlos (2) *9⍴
remodelar cíclicamente a la longitud 9 (2 2 2 2 2 2 2 2 2)324⊤⍨
codificar 324 de este modo, es decir, como binario de 12 bits (1 0 1 0 0 0 1 0 0)\⍨
use eso para expandir (inserte un espacio para cada 0) ...'FT '[
...]
la cadena "FT", indexada por⍎⍵
el argumento ejecutado (válido ya que p y q ahora tienen valores)⍪
convertir eso en una matriz de columnasq,
anteponer una columna que consta de q (1 1 0 0)q,
anteponer una columna que consta de p (1 0 1 0)(
...)⍪
inserte una fila arriba, que consiste en⍵
el argumento'p q ',
antepuesto con la cadena "p q"* Destaque este problema si ve
≢
como≢
y no como̸≡
.fuente
Julia, 161 bytes
Sin bonificaciones
Sin golf:
fuente
Mathematica, 129 Bytes
Golfizado:
Sin golf:
No soy un experto en Mathematica, pero esto me pareció bastante elegante en comparación con tener que hacer una comparación directa de personajes.
Tenía una solución que funcionaba para la negación, pero era más larga de lo que despegaría la reducción de puntaje.
Dependiendo de lo que califica para una impresión bonita, podría intentar ese bono. Siento que generar ASCII en Mathematica sería demasiado costoso para compensar la reducción de puntaje, pero si las dos características principales son un borde punteado y un relleno especificado dentro de las celdas, eso es solo un par de opciones en Grid.
Con una bonita impresión, 171 * 0.6 = 102.6 Bytes
fuente
Python3,
145139120119 BytesSin bonificación (con bonificación al final)
Necesitar Python3 para soporte Unicode fuera de la caja.
Basado en el código Python de DJgamer98, descubrir que su mesa no está bien.
Edit1: división en variables distintas y omisión de la variable de cadena del operador
Edit2: (ab) usando F y T como variables y caracteres de cadena
Edit3: Ahorrando un espacio gracias a NoOneIsHere
Con Bonus, 215 * 0.6 = 129
fuente
q in c:
.C / C ++ 302 bytes
335 caracteres menos 10% para manejar la negación. Formateo incompleto pero envío antes de ver cuál es el impacto de la finalización.
Marcado como C / C ++ porque mi gcc y g ++ lo aceptan con -permisivo y me parece mucho más C que C ++.
Estoy seguro de que probablemente haya algunos ajustes que podrían aplicarse. De hecho, manejar los nots agrega más de lo que elimina el 10% de bonificación.
Esto supone que el formato de entrada es el indicado, es decir, 2 valores de entrada (p y q), con o sin el prefijo not y nada más, y todos los tokens delimitados por un solo espacio.
Sin golf:
y las pruebas:
fuente
Mathematica, 128 caracteres
es el personaje de uso privadoU+F3C7
representa\[Transpose]
.Afortunadamente para nosotros los golfistas de Mathematica,
∧
y∨
ya representamosAnd
yOr
, así que todo lo que tenemos que hacer es convertir la cadena de entrada en una expresión de Mathematica y podemos hacer operaciones lógicas simbólicas en ella.Tenga en cuenta que esta solución también manejará
Not
(¬
),Implies
(
),Equivalent
(⧦
),Xor
(⊻
),Nand
(⊼
),Xor
(⊻
) yNor
(⊽
), pero no recibe la bonificación porque~p
es un error de sintaxis en Mathematica. MehExplicación
Convierte la cadena de entrada en una expresión de Mathematica y la almacena
b
.Esta es una lista de todas las subexpresiones posibles de la entrada. Cada uno recibirá su propia columna.
Esta es una lista de todas las variables que aparecen en la entrada.
Función pura que toma una expresión de entrada
#
y devuelve una lista de valores de verdad para todas las combinaciones posibles de valores de verdad para las variables.Antecede la expresión misma a esta lista.
Aplica esta función a cada subexpresión de la entrada.
Luego reemplace true (
0<1
) con "T" y false (0>1
) con "F".Intercambiar filas y columnas.
Mostrar el resultado como a
Grid
.Convierta el
Grid
formato tradicional para que use los símbolos elegantes.fuente