El código muerto se queda allí sin hacer nada, mirándonos sabiendo que nunca se ejecutará ... pero hoy podemos vengarnos.
Especificación
La entrada será una cadena multilínea.
Cada línea puede ser una asignación o una expresión .
Asignación
Una asignación es de la forma <name> = number
en que nombre es una secuencia de letras, guiones bajos y números, pero no comienza con un número.
Las variables se pueden asignar cualquier cantidad de veces.
Expresión
Una expresión es de la forma <var_name OR number> <operation> <var_name OR number> ...
Una expresión puede ser cualquier combinación de:
- Variables ya definidas
- Operadores aritméticos básicos
+-*/
- Números (enteros)
Rendimiento esperado
Debe generar la cadena con asignaciones redundantes , asignaciones que nunca son utilizadas por ninguna de las expresiones que le siguen, eliminadas. Tenga en cuenta que las asignaciones también pueden hacerse redundantes si se realiza una asignación adicional a la misma variable antes de que se ejecute una expresión usando la variable.
Casos de prueba
en
a = 10
a * 3
fuera
a = 10
a * 3
en
foo = 8
2 - 1
a = 18
fuera
2 - 1
en
a = 10
a = 8
b = 4
ab = 72
b / 6
b + 1
fuera
b = 4
b / 6
b + 1
en
a = 1
a = 2
a + 1
fuera
a = 2
a + 1
en
FooBar1 = 0
Fuz__ = 8
Fuz__ / 1
fuera
Fuz__ = 8
Fuz__ / 1
en
a = 1
a + 1
a = 2
a + 1
fuera
a = 1
a + 1
a = 2
a + 1
en
a = 1
1 / 5 * 8 + 4
fuera
1 / 5 * 8 + 4
en
a = 1
a + 1
a = 1
a + 1
fuera
a = 1
a + 1
a = 1
a + 1
en
a = 7
5 / a
fuera
a = 7
5 / a
fuente
a = 1; a + 1; a = 1; a + 1;
:? Donde el segundoa = 1
se puede descartar solo porquea
se estableció previamente en el mismo valor (1
).Respuestas:
PHP - 197 bytes
La función funciona analizando cada línea, en el orden inverso y una después de la otra, y manteniendo una matriz de las variables utilizadas.
=
en la línea, es una tarea.1
,2
, ...) y operadores (+
,-
, ...) se añadirán también, pero ya que no son nombres de variables válidas, no es un problema. La línea es, por supuesto, impresa.Aquí está la versión sin golf:
fuente
Retina , 45 bytes
Para fines de conteo, cada línea va en un archivo separado (donde
<empty>
es un archivo vacío) y\n
debe reemplazarse con un avance de línea real (0x0A).Esto supone que la cadena siempre terminará con un avance de línea.
Como esta expresión regular no utiliza ninguna característica específica de .NET, puede probarla en regex101 .
La idea es bastante simple: eliminar todas las asignaciones de las cuales podemos encontrar (buscando hacia adelante) otra asignación a la misma variable o al final de la cadena sin pasar otro uso de la variable.
fuente
Pyth, 40 bytes
Parece un poco largo. Tal vez pueda guardar uno o dos bytes mañana.
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
_.__.z
da todos los postfixes de las líneas de entrada en orden inverso. Por ejemplo, la entradaFooBar1 = 0; Fuz__ = 8; Fuz__ / 1
da la lista:Luego filtro por elementos de la lista
T
, en los que=
no está en el último elemento deT
(expresión) o (asignación) el último elementoT
, que contiene el nombre de la variable, es una expresión. Luego imprima el último elemento de cada uno de los elementos restantes en una línea separada.fuente
.__.
CJam, 49 bytes
Pruébalo en línea
El enfoque aquí es que se mantiene una lista de variables no asignadas mientras se procesan las líneas de entrada de atrás hacia adelante:
Si la línea es una expresión, todas las variables en la expresión se agregan a la lista. En realidad, en la implementación, todos los tokens se agregan a la lista, ya que ahorra código y tener números y operadores en la lista no hace ningún daño.
Si la línea es una asignación, prueba si el nombre de la variable asignada está en la lista. Si es así, la asignación se acepta y el nombre de la variable se elimina de la lista. De lo contrario, se omite la asignación.
Explicacion:
fuente
Python 2,
270267 bytesLa sangría es: 1. Espacio 2. Pestaña
¡Guardado 3 bytes gracias a @Kamehameha!
fuente
print ''.join
yin
adentroin [n
.tab
lugar del doble espacio después de laexcept
línea y guardando un byte.R 144
dónde
L
es una línea de la entrada (a partir de la última)W
son los símbolos (variables, operadores, números) en una líneaR
es un vector de símbolos que se imprimirán. Incluye variables cuya asignación es necesaria.Q
es el vector de líneas en la salidafuente
scan(what="",sep="\n")
conscan(,"",sep="\n")
. También puede reemplazar elsep
argumento nombrado con su equivalente posicional, pero no recuerdo dónde irían las comas para eso.JavaScript (ES6) 164
177Usando cadenas de plantilla, todas las nuevas líneas son significativas y contadas.
Pruebe a ejecutar el fragmento en FireFox (requerido para la compatibilidad con ES6, incluidas las funciones de flecha)
fuente
ungolfed
parte es solo para explicación. LaTEST
parte es ... uhm solo adivina ...JavaScript ES6,
7975118 bytesDime si esto no funciona para un caso. Cualquier idea para jugar al golf es bienvenida.
Explicación
Probado en Safari Nightly. Versión amigable de Firefox:
Puede ingresar en babeljs para obtener una versión ES5.
fuente
Haskell, 187 bytes
Uso
d
.fuente