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", а буквою від "a" до "j", "n" до "s", "l", "u", "x", "y" або "z". Великі і малі літери трактуються однаково.
/^$/{s/.*/0/;b}
Якщо ми закінчимося порожнім простором шаблону, ми надрукуємо 0 (автоматично супроводжується новим рядком, як це завжди робиться sed, якщо ви не передасте йому спеціальний прапор), пропустимо всі задні рядки сценарію та переходимо до наступного «циклу sed» ( тобто прочитайте наступний рядок введення та повторіть обробку заново з першої команди, поки не буде більше рядків введення для обробки).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
В іншому випадку, якщо простір шаблону не порожній, ми тепер ділимо його на два "підпробіли", розділені крапкою з комою: спочатку надходить простір введення , який спочатку формується всіма символами, які не були вилучені з простору шаблону після виконання рядка 1; далі йде крапка з комою, а за нею - пробіл карт .
Простір на карті повідомляє нам, скільки сірників поруч із 1 потрібно для відображення кожного відповідного буквено-цифрового символу. Якщо ми хочемо знати, скільки сірників потрібно для відображення будь-якого буквено-цифрового символу в просторі карти, ми шукаємо першу послідовність суміжних% s зліва від цього символу, і відповідь буде числом% s у що послідовність плюс 1. Так, наприклад, кількість сірників, необхідних для представлення "b", становить 4 + 1 = 5; представляти "4", 3 + 1 = 4, представляти "y", 3 + 1 = 4; і так далі.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Це петля. Тепер ми замінимо кожен символ у вхідному просторі на (повну) послідовність% s, кількість яких вказує на необхідну кількість відповідних позначень для представлення цього символу, і послідуємо за цією послідовністю символом пробілу (знову ж, великі та малі літери - це призначається однакове лікування). Критерієм для визначення того, чи повинен цикл закінчуватися, слід перевірити, чи є символ білого пробілу зліва від крапки з комою в просторі шаблону: якщо ця умова виконується, ми припиняємо цикл і продовжуємо переходити до наступного рядка.
s/;.+//
s/^/,;/
Ці два рядки видаляють крапку з комою та все, що знаходиться після неї, з простору шаблону, а потім вставляють кому та крапку з комою в початок простору візерунка. Тепер у нас простір шаблонів ще раз розділено на два нові підпростори: аналоговий простір результатів перед крапкою з комою та аналоговий вхідний простір після нього.
Аналоговий вхідний простір - це саме те, що ми раніше називали "вхідним простором", але в іншій формі: тепер він містить послідовності% s, розділені пробілом. Загальна кількість таких% в аналоговому вхідному просторі є такою ж кількістю контрольних рядків, необхідних для представлення початкового рядка вхідних символів, тобто це число є результатом. Але ми повинні надрукувати цей результат у десятковій нотації, а не як послідовність знаків відсотків. Метою аналогового простору результатів є проведення аналогового подання кожної цифри результату, тоді як ми обчислюємо цей результат шляхом підсумовування кожної суміжної послідовності% s в аналоговому вхідному просторі по черзі. Наступний цикл виконує цю суму:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
По-перше, після мітки 2 , ми переміщуємо наступну суміжну послідовність% s після крапки з комою з аналогового вхідного простору в ліву частину крапки з комою, в аналоговий простір результатів;
Далі ми переходимо до суб-циклу (мітка 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 в аналоговому просторі результатами на десятковий цифр, який відповідає кількості% s у кожній конкретній послідовності.
s/[^0-9]//g
Нарешті, ми видаляємо кожен нечисловий символ із простору шаблону, а останнє - кінцевий результат у знайомому десятковому позначенні. Це значення друкується на стандартному виході і починається наступний цикл sed, якщо є ще якісь вхідні рядки для обробки.
|_\n|_
(маліt
)