Мертвый код сидит там, ничего не делая, глядя на нас, зная, что он никогда не будет выполнен ... но сегодня мы можем отомстить.
Спецификация
На входе будет многострочная строка.
Каждая строка может быть либо назначением, либо выражением .
присваивание
Назначение имеет форму, <name> = number
где имя - это последовательность букв, подчеркиваний и цифр, но не начинающаяся с цифры.
Переменные могут быть назначены любое количество раз.
выражение
Выражение имеет форму <var_name OR number> <operation> <var_name OR number> ...
Выражение может быть любой комбинацией:
- Переменные уже определены
- Основные арифметические операторы
+-*/
- Числа (целые числа)
Ожидаемый результат
Вы должны вывести строку с избыточными присваиваниями , присвоения , которые никогда не используются ни одним из следующих за ним выражений , удалены. Обратите внимание, что назначения также можно сделать избыточными, если перед выполнением выражения с использованием этой переменной выполняется дополнительное присвоение той же переменной .
Контрольные примеры
в
a = 10
a * 3
вне
a = 10
a * 3
в
foo = 8
2 - 1
a = 18
вне
2 - 1
в
a = 10
a = 8
b = 4
ab = 72
b / 6
b + 1
вне
b = 4
b / 6
b + 1
в
a = 1
a = 2
a + 1
вне
a = 2
a + 1
в
FooBar1 = 0
Fuz__ = 8
Fuz__ / 1
вне
Fuz__ = 8
Fuz__ / 1
в
a = 1
a + 1
a = 2
a + 1
вне
a = 1
a + 1
a = 2
a + 1
в
a = 1
1 / 5 * 8 + 4
вне
1 / 5 * 8 + 4
в
a = 1
a + 1
a = 1
a + 1
вне
a = 1
a + 1
a = 1
a + 1
в
a = 7
5 / a
вне
a = 7
5 / a
источник
a = 1; a + 1; a = 1; a + 1;
? Где втораяa = 1
может быть отброшена только потому, чтоa
ранее было установлено то же значение (1
).Ответы:
PHP - 197 байт
Функция работает, анализируя каждую строку, в обратном порядке и одну за другой, и поддерживая массив используемых переменных.
=
в строке есть одинаковый символ , это присваивание.1
,2
, ...) и операторы (+
,-
, ...) будут добавлены тоже, но так как они не являются именами действительного переменными, это не проблема. Строка, конечно, печатается.Вот негольфированная версия:
источник
Сетчатка , 45 байт
В целях подсчета каждая строка помещается в отдельный файл (где
<empty>
это пустой файл) и\n
должна быть заменена фактическим переводом строки (0x0A).Это предполагает, что строка всегда будет заканчиваться переводом строки.
Поскольку это регулярное выражение не использует никаких специфических для .NET функций, вы можете протестировать его на регулярном выражении regex101 .
Идея довольно проста: удалить все присваивания, из которых мы можем найти (поиск вперед) другое присваивание той же переменной или конец строки, не передавая другое использование переменной.
источник
Pyth, 40 байт
Кажется, довольно долго. Может быть, я могу сохранить один или два байта завтра.
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
_.__.z
дает все постфиксы строк ввода в обратном порядке. Например, входFooBar1 = 0; Fuz__ = 8; Fuz__ / 1
дает список:Затем я фильтрую элементы списка
T
, в которых=
нет последнего элементаT
(выражения) или (присваивания), последним элементомT
которого, содержащим имя переменной, является выражение. После этого напечатайте последний элемент каждого из оставшихся элементов в отдельной строке.источник
.__.
CJam, 49 байтов
Попробуйте онлайн
Подход здесь заключается в том, что список неназначенных переменных сохраняется при обработке строк ввода задом наперед:
Если строка является выражением, все переменные в выражении добавляются в список. На самом деле, в реализации все токены добавляются в список, поскольку он сохраняет код, а наличие номеров и операторов в списке не причиняет никакого вреда.
Если строка является присвоением, она проверяет, есть ли назначенное имя переменной в списке. Если это так, присвоение принимается, а имя переменной удаляется из списка. В противном случае назначение пропускается.
Пояснение:
источник
Python 2,
270267 байтОтступы: 1. Пробел 2. Вкладка
Сохранено 3 байта благодаря @Kamehameha!
источник
print ''.join
иin
вin [n
может быть удален.tab
вместо двойного пробела послеexcept
строки и сохраняя один байт.R 144
где
L
строка ввода (начиная с последней)W
символы (переменные, операторы, числа) в строкеR
является вектором символов, которые будут напечатаны. Включает переменные, назначение которых необходимо.Q
вектор линий на выходеисточник
scan(what="",sep="\n")
наscan(,"",sep="\n")
. Вы также можете заменить именованныйsep
аргумент его позиционным эквивалентом, но я не могу вспомнить, где для этого использовались бы запятые.JavaScript (ES6) 164
177Используя строки шаблона, все новые строки значимы и подсчитаны.
Тестовый запуск фрагмента в FireFox (необходим для совместимости с ES6, включая функции стрелок)
источник
ungolfed
часть только для объяснения.TEST
Часть ... ммм просто думаю ...JavaScript ES6,
7975118 байтСкажи мне, если это не работает для дела. Любые идеи для игры в гольф приветствуются.
объяснение
Проверено на Safari Nightly. Firefox дружественная версия:
Вы можете зайти в babeljs, чтобы получить версию ES5.
источник
Haskell, 187 байт
Использование
d
.источник