Martwy kod siedzi i nic nie robi, wpatrując się w nas, wiedząc, że nigdy nie zostanie wykonany ... ale dziś możemy się zemścić.
Specyfikacja
Dane wejściowe będą ciągiem wieloliniowym.
Każda linia może być przypisaniem lub wyrażeniem .
Zadanie
Przypisanie ma postać, w <name> = number
której nazwa jest ciągiem liter, znaków podkreślenia i cyfr, ale nie zaczyna się od cyfry.
Zmienne można przypisywać dowolną liczbę razy.
Wyrażenie
Wyrażenie ma formę <var_name OR number> <operation> <var_name OR number> ...
Wyrażenie może być dowolną kombinacją:
- Zmienne już zdefiniowane
- Podstawowe operatory arytmetyczne
+-*/
- Liczby (liczby całkowite)
Oczekiwany wynik
Powinieneś wypisać ciąg z nadmiarowymi przypisaniami , przydziały , które nigdy nie są używane przez następujące po nim wyrażenia , usunięte. Należy pamiętać, że przypisania można również uczynić redundantnymi, jeśli dodatkowe przypisanie do tej samej zmiennej zostanie wykonane przed wykonaniem wyrażenia używającego zmiennej.
Przypadki testowe
w
a = 10
a * 3
na zewnątrz
a = 10
a * 3
w
foo = 8
2 - 1
a = 18
na zewnątrz
2 - 1
w
a = 10
a = 8
b = 4
ab = 72
b / 6
b + 1
na zewnątrz
b = 4
b / 6
b + 1
w
a = 1
a = 2
a + 1
na zewnątrz
a = 2
a + 1
w
FooBar1 = 0
Fuz__ = 8
Fuz__ / 1
na zewnątrz
Fuz__ = 8
Fuz__ / 1
w
a = 1
a + 1
a = 2
a + 1
na zewnątrz
a = 1
a + 1
a = 2
a + 1
w
a = 1
1 / 5 * 8 + 4
na zewnątrz
1 / 5 * 8 + 4
w
a = 1
a + 1
a = 1
a + 1
na zewnątrz
a = 1
a + 1
a = 1
a + 1
w
a = 7
5 / a
na zewnątrz
a = 7
5 / a
źródło
a = 1; a + 1; a = 1; a + 1;
:? Gdzie drugia = 1
można odrzucić tylko dlatego, żea
wcześniej był ustawiony na tę samą wartość (1
).Odpowiedzi:
PHP - 197 bajtów
Funkcja działa poprzez analizowanie każdej linii, w odwrotnej kolejności i jeden po drugim, oraz utrzymywanie tablicy używanych zmiennych.
=
w linii jest równy znak , jest to zadanie.1
,2
...) i operatorzy (+
,-
...) zostaną dodane też, ale ponieważ nie są prawidłowymi nazwami zmiennych, to nie jest problem. Linia jest wtedy oczywiście drukowana.Oto wersja bez golfa:
źródło
Siatkówka , 45 bajtów
Dla celów zliczania, każda linia przechodzi w osobny plik (gdzie
<empty>
jest pusty plik) i\n
powinna zostać zastąpiona rzeczywistym przesunięciem linii (0x0A).Zakłada się, że ciąg zawsze kończy się wierszem.
Ponieważ regex nie korzysta z żadnych funkcji specyficznych dla platformy .NET, możesz go przetestować na regex101 .
Pomysł jest dość prosty: usuń wszystkie przypisania, z których możemy znaleźć (wyszukiwanie do przodu) innego przypisania do tej samej zmiennej lub końca łańcucha bez dalszego użycia tej zmiennej.
źródło
Pyth, 40 bajtów
Wydaje się dość długi. Może jutro mogę zaoszczędzić jeden lub dwa bajty.
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
_.__.z
podaje wszystkie postfiksy linii wejściowych w odwrotnej kolejności. Np. Dane wejścioweFooBar1 = 0; Fuz__ = 8; Fuz__ / 1
dają listę:Następnie filtruję elementy listy
T
, w których=
nie ma ostatniego elementuT
(wyrażenie) lub (przypisanie), ostatni elementT
, który zawiera nazwę zmiennej, jest wyrażeniem. Następnie wydrukuj ostatni element każdego z pozostałych elementów w osobnej linii.źródło
.__.
CJam, 49 bajtów
Wypróbuj online
Podejście polega na tym, że lista nieprzypisanych zmiennych jest utrzymywana podczas przetwarzania linii wejściowych z powrotem do przodu:
Jeśli wiersz jest wyrażeniem, wszystkie zmienne w wyrażeniu są dodawane do listy. W rzeczywistości w implementacji wszystkie tokeny są dodawane do listy, ponieważ zapisuje kod, a umieszczenie liczb i operatorów na liście nie powoduje żadnej szkody.
Jeśli linia jest przypisaniem, sprawdza, czy przypisana nazwa zmiennej znajduje się na liście. Jeśli tak, przypisanie jest akceptowane, a nazwa zmiennej usuwana z listy. W przeciwnym razie przypisanie zostanie pominięte.
Objaśnienie:
źródło
Python 2,
270267 bajtówWcięcie to: 1. Spacja 2. Tab
Zaoszczędź 3 bajty dzięki @Kamehameha!
źródło
print ''.join
iin
na wydrukuin [n
można usunąć.tab
zamiast podwójnej spacji poexcept
wierszu i zapisując jeden bajt.R 144
gdzie
L
to linia od wejścia (zaczynająca się od ostatniej)W
to symbole (zmienne, operatory, liczby) w liniiR
to wektor symboli, które zostaną wydrukowane. Obejmuje zmienne, których przypisanie jest potrzebne.Q
jest wektorem linii na wyjściuźródło
scan(what="",sep="\n")
zscan(,"",sep="\n")
. Być może będziesz w stanie zastąpić nazwanysep
argument jego ekwiwalentem pozycyjnym, ale nie pamiętam, dokąd poszłyby przecinki.JavaScript (ES6) 164
177Za pomocą ciągów szablonów wszystkie znaki nowej linii są znaczące i zliczane.
Przetestuj uruchomienie fragmentu kodu w FireFox (wymagany do zgodności z ES6, w tym funkcji strzałek)
źródło
ungolfed
część służy wyłącznie do wyjaśnienia. Chodzi oTEST
to ... emm tylko zgadnij ...JavaScript ES6,
7975118 bajtówPowiedz mi, czy to nie działa w przypadku. Wszelkie pomysły na golfa są mile widziane.
Wyjaśnienie
Testowane na Safari Nightly. Wersja przyjazna dla Firefoxa:
Możesz wpaść do Babeljs, aby uzyskać wersję ES5.
źródło
Haskell, 187 bajtów
Zastosowanie
d
.źródło