Le code mort est là, ne faisant rien, nous fixant sachant qu'il ne sera jamais exécuté ... mais aujourd'hui, nous pouvons nous venger.
spécification
L'entrée sera une chaîne multiligne.
Chaque ligne peut être soit une affectation, soit une expression .
Affectation
Une affectation prend la forme <name> = number
où nom est une séquence de lettres, de soulignements et de chiffres, mais ne commençant pas par un nombre.
Les variables peuvent être affectées un certain nombre de fois.
Expression
Une expression est de la forme <var_name OR number> <operation> <var_name OR number> ...
Une expression peut être n'importe quelle combinaison de:
- Variables déjà définies
- Opérateurs arithmétiques de base
+-*/
- Nombres (entiers)
Production attendue
Vous devez sortir la chaîne avec des affectations redondantes , affectations qui ne sont jamais utilisées par aucune des expressions qui la suivent, supprimées. Veuillez noter que les affectations peuvent également être redondantes si une affectation supplémentaire à la même variable est effectuée avant l'exécution d'une expression utilisant la variable.
Cas de test
dans
a = 10
a * 3
en dehors
a = 10
a * 3
dans
foo = 8
2 - 1
a = 18
en dehors
2 - 1
dans
a = 10
a = 8
b = 4
ab = 72
b / 6
b + 1
en dehors
b = 4
b / 6
b + 1
dans
a = 1
a = 2
a + 1
en dehors
a = 2
a + 1
dans
FooBar1 = 0
Fuz__ = 8
Fuz__ / 1
en dehors
Fuz__ = 8
Fuz__ / 1
dans
a = 1
a + 1
a = 2
a + 1
en dehors
a = 1
a + 1
a = 2
a + 1
dans
a = 1
1 / 5 * 8 + 4
en dehors
1 / 5 * 8 + 4
dans
a = 1
a + 1
a = 1
a + 1
en dehors
a = 1
a + 1
a = 1
a + 1
dans
a = 7
5 / a
en dehors
a = 7
5 / a
la source
a = 1; a + 1; a = 1; a + 1;
? Où le seconda = 1
peut être ignoré uniquement parce qu'ila
était précédemment défini sur la même valeur (1
).Réponses:
PHP - 197 octets
La fonction fonctionne en analysant chaque ligne, dans l'ordre inverse et l'une après l'autre, et en maintenant un tableau des variables utilisées.
=
dans la ligne, c'est une affectation.1
,2
...) et les opérateurs (+
,-
, ...) seront ajoutés aussi, mais comme ils ne sont pas des noms de variables valides, ce n'est pas un problème. La ligne est alors bien sûr imprimée.Voici la version non golfée:
la source
Rétine , 45 octets
À des fins de comptage, chaque ligne va dans un fichier distinct (où
<empty>
est un fichier vide) et\n
doit être remplacée par un saut de ligne réel (0x0A).Cela suppose que la chaîne se terminera toujours par un saut de ligne.
Comme cette expression régulière n'utilise aucune fonctionnalité spécifique à .NET, vous pouvez la tester sur regex101 .
L'idée est assez simple: supprimez toutes les affectations à partir desquelles nous pouvons trouver (recherche en avant) une autre affectation à la même variable ou à la fin de la chaîne sans passer par une autre utilisation de la variable.
la source
Pyth, 40 octets
Semble un peu long. Peut-être que je peux économiser un ou deux octets demain.
Essayez-le en ligne: démonstration ou suite de tests
Explication:
_.__.z
donne tous les suffixes des lignes d'entrée dans l'ordre inverse. Par exemple, l'entréeFooBar1 = 0; Fuz__ = 8; Fuz__ / 1
donne la liste:Ensuite, je filtre les éléments de liste
T
, dans lesquels il=
ne se trouve pas dans le dernier élément deT
(expression) ou (affectation), le dernier élément dansT
, qui contient le nom de la variable, est une expression. Ensuite, imprimez le dernier élément de chacun des éléments restants sur une ligne distincte.la source
.__.
CJam, 49 octets
Essayez-le en ligne
L'approche ici est qu'une liste de variables non affectées est conservée lors du traitement des lignes d'entrée de l'arrière vers l'avant:
Si la ligne est une expression, toutes les variables de l'expression sont ajoutées à la liste. En fait, dans l'implémentation, tous les jetons sont ajoutés à la liste, car il enregistre le code et le fait d'avoir des numéros et des opérateurs dans la liste ne fait aucun mal.
Si la ligne est une affectation, elle teste si le nom de variable affecté est dans la liste. Si tel est le cas, l'affectation est acceptée et le nom de variable supprimé de la liste. Sinon, l'affectation est ignorée.
Explication:
la source
Python 2,
270267 octetsL'indentation est: 1. Espace 2. Onglet
Sauvegardé 3 octets grâce à @Kamehameha!
la source
print ''.join
etin
enin [n
peut être supprimé.tab
au lieu du double espace après laexcept
ligne et en enregistrant un octet.R 144
où
L
est une ligne de l'entrée (à partir de la dernière)W
sont les symboles (variables, opérateurs, nombres) sur une ligneR
est un vecteur de symboles qui sera imprimé. Il comprend des variables dont l'affectation est nécessaire.Q
est le vecteur de lignes dans la sortiela source
scan(what="",sep="\n")
parscan(,"",sep="\n")
. Vous pouvez également être en mesure de remplacer l'sep
argument nommé par son équivalent positionnel, mais je ne me souviens pas où iraient les virgules pour cela.JavaScript (ES6) 164
177À l'aide de chaînes de modèle, toutes les nouvelles lignes sont importantes et comptées.
Test d'exécution de l'extrait dans FireFox (requis pour la compatibilité ES6, y compris les fonctions fléchées)
la source
ungolfed
partie est à titre explicatif seulement. LaTEST
partie est ... euh juste devinez ...JavaScript ES6,
7975118 octetsDites-moi si cela ne fonctionne pas pour un cas. Toutes les idées de golf sont les bienvenues.
Explication
Testé sur Safari Nightly. Version compatible avec Firefox:
Vous pouvez passer dans babeljs pour obtenir une version ES5.
la source
Haskell, 187 octets
Utilisez
d
.la source