Це питання засноване на тому, що я придумав, щоб відповісти на інше запитання .
Іноді тут задаються питаннями намалювати деяке мистецтво ASCII. Одним із простих способів зберігання даних для рівня техніки є RLE (кодування довжиною запустити) . Тому:
qqqwwwwweeerrrrrtttyyyy
стає:
3q5w3e5r3t4y
Тепер, щоб намалювати велике мистецтво ASCII, можливо, ви отримуєте такі дані (ігноруючи нові символи рядка):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
Символи, які використовуються для мистецтва ASCII, ніколи не будуть малі або великі літери або цифри, лише знаки, позначки та символи, але завжди в наборі символів для друку ASCII.
Ви хочете зберегти простір у цьому рядку, тому ви заміните числа великим набором символів ("A" дорівнює 1, "B" дорівнює 2, поки "Z" дорівнює 26), тому що ви ніколи не збираєтесь отримати більше 26 повторень персонажа. Отже, ви отримуєте:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
І, нарешті, ви помічаєте, що деякі групи (буква + символ) повторюються, тому ви замінюєте групи, які відображаються в рядку 3 рази або більше, набором символів малих літер, у порядку чи в рядку, але зберігаючи в буфері зроблені заміни (у форматі "група + діаграма заміни" для кожної заміни), а решта рядка залишається такою, як є. Отже наступні групи:
S, (3 times)
T (4 times)
K@ (3 times)
стає заміщеним відповідно на 'a', 'b' та 'c', тому що ніколи не буде повторюватися більше 26 груп. Отже, нарешті, ви отримуєте:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Останній крок зберігає лише 1 байт, оскільки групи, які фактично зберігають символи після їх заміни, - це ті, що з’являються 4 рази або більше.]
Змагання
Враховуючи рядок, що містить дані RLE, щоб намалювати ASCII-графіку (із запропонованими обмеженнями), напишіть найкоротшу програму / функцію / метод, який можна для того, щоб стиснути її, як описано. Алгоритм повинен надрукувати / повернути два рядки: перший містить словник, що використовується для стиснення, а другий - результуючий стислий рядок. Ви можете повернути рядки у вигляді кортежу, масиву, списку чи будь-якого іншого в заданому порядку.
Зауважте, що якщо рядок не можна стиснути на кроці 2, алгоритм повинен повернути порожню рядок як перше повернене значення, а результат кроку 1 - як друге повернене значення.
Вам не потрібно включати результат кроку 1 у вихідні значення, я просто включаю їх у приклади з метою уточнення.
Це код-гольф , тому найкоротша відповідь на кожну мову виграє!
Ще один тестовий випадок
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
ймовірно, зберігається як просто S,T K@
без явного іменування символів підстановки, які можна тривіально вивести з цього.