sed, 367 (байты исходного кода) + 532 (количество спичек для исходного кода) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
Попробуйте онлайн
Многострочная версия:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
Объяснение:
Вышеуказанный скрипт построчно считывает стандартный ввод (в пространство шаблона - обычный «способ sed») и для каждой строки выводит количество спичек, необходимых для представления всех представляемых спичками символов в этой строке. Вычисления для каждой строки ввода выполняются следующим образом:
s/[^0-9a-jln-suxyz]//Ig
Сначала мы удаляем каждый символ, для которого у нас нет соответствующего представления спички (как указано в вопросе) из пространства образца. То есть мы удаляем каждый символ, который не является ни цифрой от «0» до «9», ни буквой от «а» до «j», от «n» до «s», «l», «u», «х», «у» или «г». Прописные и строчные буквы обрабатываются одинаково.
/^$/{s/.*/0/;b}
Если мы получим пустое пространство шаблона, мы печатаем 0 (автоматически следует новая строка, как всегда делает sed, если вы не передаете ему специальный флаг), пропускаете все задние строки сценария и переходите к следующему «циклу sed» ( т. е. читать следующую строку ввода и повторять обработку заново, начиная с первой команды, пока не останется больше строк ввода для обработки).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
В противном случае, если пространство шаблона не является пустым, мы теперь разделяем его на два «подпространства», разделенных точкой с запятой: сначала идет пространство ввода , которое первоначально формируется всеми символами, которые не были удалены из пространства шаблона после исполнение строки 1; Далее следует точка с запятой, а после нее - пространство карты .
Пространство карты говорит нам, сколько спичек рядом с 1 необходимо для представления каждого соответствующего буквенно-цифрового символа. Если мы хотим узнать, сколько совпадений необходимо для представления любого алфавитно-цифрового символа в пространстве карты, мы ищем первую последовательность смежных% слева от этого символа, и ответом будет число% в эта последовательность плюс 1. Так, например, количество спичек, необходимых для представления «b», равно 4 + 1 = 5; представлять «4», 3 + 1 = 4, представлять «y», 3 + 1 = 4; и так далее.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Это петля. Теперь мы заменим каждый символ во входном пространстве на (завершенную) последовательность%, число которой указывает необходимое количество спичек для представления этого символа, и последуем за этой последовательностью символом пробела (опять же, заглавные и строчные буквы дано такое же лечение). Критерий определения того, должен ли цикл завершиться, заключается в проверке наличия символа пробела в левой части точки с запятой в пространстве шаблона: если это условие выполняется, мы завершаем цикл и переходим к следующей строке.
s/;.+//
s/^/,;/
Эти две строки удаляют точку с запятой и все после нее из пространства шаблона, а затем вставляют запятую и точку с запятой в начало пространства шаблона. Теперь у нас есть пространство шаблонов, разделенное еще раз на два новых подпространства: пространство аналоговых результатов перед точкой с запятой и пространство аналоговых входов после него.
Пространство аналогового ввода - это то, что мы ранее называли «пространством ввода», но в другой форме: теперь оно содержит последовательности%, разделенных пробелом. Общее количество таких% в пространстве аналогового ввода равно количеству спичек, необходимых для представления исходной строки входных символов, т. Е. Это число является результатом. Но мы должны напечатать этот результат в десятичной записи, а не как последовательность знаков процента. Цель аналогового результата пространства , чтобы провести аналоговое представление каждой цифры результата , пока мы вычислить , что результат путем суммирования каждой непрерывной последовательности% 'S в пространстве аналогового входа по одному. Следующий цикл выполняет эту сумму:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Сначала после ярлыка 2 мы перемещаем следующую смежную последовательность% после точки с запятой из пространства аналогового ввода в непосредственную левую точку с запятой в пространстве аналоговых результатов;
Далее, мы вступаем в под-цикл (метка 3 ), который выполняет следующие вычисления:
Если в аналоговой области результатов есть непрерывная последовательность из десяти% после запятой, мы удаляем эти% и помещаем один% непосредственно слева от запятой. Проще говоря, это означает, что одно из десятичных разрядов в результате получило более 9 единиц, поэтому мы убираем 10 единиц из этого десятичного разряда и добавляем 1 единицу к следующему большему десятичному разряду;
Если «%» является первым символом в пространстве шаблона, мы вставляем новую запятую непосредственно перед ним. Это указывает на то, что сумма достигла значения, у которого десятичное представление имеет еще один десятичный знак слева от предыдущего значения;
Если в аналоговом результирующем пространстве все еще есть какая-то непрерывная последовательность из десяти%, мы возвращаемся к метке 3 и повторяем этот процесс. В противном случае мы выходим из этого под-цикла и переходим на следующую строку.
Теперь, если все еще есть «%» в пространстве аналогового ввода (то есть после точки с запятой), это означает, что к общей сумме еще нужно добавить некоторое количество спичек - поэтому мы возвращаемся к метке 2 .
Как только сумма будет завершена, мы переходим к последнему циклу кода:
:4
s/,[;,]/,0,/
/,[;,]/b4
Здесь мы проверяем каждую пару символов, образованную запятой слева и точкой с запятой или запятой справа. Мы заменяем все такие пары символов на «0» внутри двух запятых.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
Приведенный выше фрагмент кода довольно прост: мы заменяем каждую смежную последовательность% в пространстве аналоговых результатов символом десятичной цифры, который соответствует числу% в каждой конкретной последовательности.
s/[^0-9]//g
Наконец, мы удаляем каждый нечисловой символ из пространства образца, и остается только конечный результат в знакомой десятичной записи. Это значение печатается на стандартном выводе, и начинается следующий цикл sed, если есть еще входные строки для обработки.
|_\n|_
(строчные буквыt
)