O código morto fica lá, sem fazer nada, olhando para nós sabendo que nunca será executado ... mas hoje podemos nos vingar.
Especificação
A entrada será uma sequência multilinha.
Cada linha pode ser uma atribuição ou uma expressão .
Tarefa
Uma atribuição é da forma em <name> = number
que nome é uma sequência de letras, sublinhados e números, mas não começa com um número.
As variáveis podem ser atribuídas qualquer número de vezes.
Expressão
Uma expressão é da forma <var_name OR number> <operation> <var_name OR number> ...
Uma expressão pode ser qualquer combinação de:
- Variáveis já definidas
- Operadores aritméticos básicos
+-*/
- Números (inteiros)
Saída esperada
Você deve saída a corda com redundantes atribuições , tarefas que nunca são usadas por qualquer das expressões que se lhe segue, removidos. Observe que as atribuições também podem ser redundantes se uma atribuição adicional para a mesma variável for realizada antes de uma expressão usando a variável seja executada.
Casos de teste
em
a = 10
a * 3
Fora
a = 10
a * 3
em
foo = 8
2 - 1
a = 18
Fora
2 - 1
em
a = 10
a = 8
b = 4
ab = 72
b / 6
b + 1
Fora
b = 4
b / 6
b + 1
em
a = 1
a = 2
a + 1
Fora
a = 2
a + 1
em
FooBar1 = 0
Fuz__ = 8
Fuz__ / 1
Fora
Fuz__ = 8
Fuz__ / 1
em
a = 1
a + 1
a = 2
a + 1
Fora
a = 1
a + 1
a = 2
a + 1
em
a = 1
1 / 5 * 8 + 4
Fora
1 / 5 * 8 + 4
em
a = 1
a + 1
a = 1
a + 1
Fora
a = 1
a + 1
a = 1
a + 1
em
a = 7
5 / a
Fora
a = 7
5 / a
fonte
a = 1; a + 1; a = 1; a + 1;
:? Onde o segundoa = 1
pode ser descartado apenas porquea
foi definido anteriormente com o mesmo valor (1
).Respostas:
PHP - 197 bytes
A função funciona analisando cada linha, na ordem inversa e uma após a outra, e mantendo uma matriz das variáveis usadas.
=
na linha, é uma atribuição.1
,2
...) e operadores (+
,-
...) será adicionado também, mas desde que eles não são nomes de variáveis válidos, não é um problema. É claro que a linha é impressa.Aqui está a versão não destruída:
fonte
Retina , 45 bytes
Para fins de contagem, cada linha entra em um arquivo separado (onde
<empty>
está um arquivo vazio) e\n
deve ser substituída por um feed de linha real (0x0A).Isso pressupõe que a string sempre terminará com um avanço de linha.
Como esse regex não usa nenhum recurso específico do .NET, você pode testá-lo no regex101 .
A idéia é bastante simples: remova todas as atribuições das quais podemos encontrar (pesquisando adiante) outra atribuição para a mesma variável ou o final da string sem passar por outro uso da variável.
fonte
Pitão, 40 bytes
Parece meio longo. Talvez eu possa salvar um ou dois bytes amanhã.
Experimente on-line: Demonstration or Test Suite
Explicação:
_.__.z
fornece todos os pós-correções das linhas de entrada em ordem inversa. Por exemplo, a entradaFooBar1 = 0; Fuz__ = 8; Fuz__ / 1
fornece a lista:Depois, filtro os elementos da lista
T
, nos quais=
não existe o último elemento deT
(expressão) ou (atribuição), o último elementoT
, que contém o nome da variável, é uma expressão. Depois imprima o último elemento de cada um dos elementos restantes em uma linha separada.fonte
.__.
CJam, 49 bytes
Experimente online
A abordagem aqui é que uma lista de variáveis não atribuídas é mantida durante o processamento das linhas de entrada de trás para frente:
Se a linha for uma expressão, todas as variáveis na expressão serão adicionadas à lista. Na verdade, na implementação, todos os tokens são adicionados à lista, pois ele salva código e ter números e operadores na lista não causa nenhum dano.
Se a linha for uma atribuição, ele testa se o nome da variável atribuída está na lista. Se for, a atribuição é aceita e o nome da variável removido da lista. Caso contrário, a atribuição é ignorada.
Explicação:
fonte
Python 2,
270267 bytesO recuo é: 1. Espaço 2. Guia
Guardado 3 bytes graças a @Kamehameha!
fonte
print ''.join
ein
dentroin [n
pode ser removido.tab
vez do espaço duplo após aexcept
linha e salvando um byte.R 144
Onde
L
é uma linha da entrada (a partir da última)W
são os símbolos (variáveis, operadores, números) em uma linhaR
é um vetor de símbolos que serão impressos. Inclui variáveis cuja atribuição é necessária.Q
é o vetor de linhas na saídafonte
scan(what="",sep="\n")
porscan(,"",sep="\n")
. Você também pode substituir osep
argumento nomeado por seu equivalente posicional, mas não me lembro onde as vírgulas iriam para isso.JavaScript (ES6) 164
177Usando cadeias de modelo, todas as novas linhas são significativas e contadas.
Teste a execução do snippet no FireFox (necessário para compatibilidade com o ES6, incluindo funções de seta)
fonte
ungolfed
parte é apenas para explicação. ATEST
parte é ... uhm apenas adivinhar ...JavaScript ES6,
7975118 bytesDiga-me se isso não funcionar em um caso. Todas as idéias para o golfe são bem-vindas.
Explicação
Testado no Safari Nightly. Versão amigável do Firefox:
Você pode entrar no babeljs para obter uma versão do ES5.
fonte
Haskell, 187 bytes
Use
d
.fonte