Кількість байтів передбачає кодування ISO 8859-1.
O$#`.(?<=(.+))|¶
$.1
!`(?<=(¶)+.*)(?<-1>.)+
Провідна передача ліній є значною. Введення та виведення - це списки, що закінчуються підведенням ліній до друкованих рядків ASCII (зауважте, що обидва мають один зворотний податок рядків).
Спробуйте в Інтернеті!
Я деякий час знав, що перенесення прямокутних блоків буде болем у Сітківці (тоді як перенесення квадратів не надто погано), але ніколи насправді не намагався. Перше рішення справді було колосальним в 110 байт, але після декількох істотних змін у підході, отримані 45 байт далеко не такі погані, як я підозрював (але все ж ...). Пояснення будуть наступними завтра.
Пояснення
1 етап: Сортування
O$#`.(?<=(.+))|¶
$.1
Це виконує основну роботу щодо переупорядкування символів у вхідних даних, але це закінчує змішання поділу на рядки. Цікаво, що якщо ми видалимо |¶, ми отримаємо код, необхідний для перенесення квадратного вводу.
Етапи сортування (позначені символом O) працюють так: вони знаходять усі збіги заданого регулярного виразу (річ після цього `), а потім сортують ці сірники і знову вставляють їх у місця, де знайдено збіги. Як це буває, цей регулярний вирівнювання відповідає кожному символу: нелінійна передача через .(?<=(.*))альтернативу та лінійна передача через ¶. Отже, вона сортує всі символи вхідних даних. Більш цікава частина це те , що вони сортуються по .
$Опція активує «сортування по» режимі, де кожен матч замінюється з шаблоном підстановки на другій лінії, яка потім використовується для порівняння збігів. Крім того, #вказує Retina перетворити результат підстановки в ціле число і порівняти ці цілі числа (замість того, щоб трактувати їх як рядки).
Отже, нарешті, нам потрібно переглянути регекс та заміну. Якщо перші альтернативні збіги (тобто ми зіставили будь-який символ в одному з рядків), то (?<=(.*))фіксує все, що відповідає цьому символу, на цій лінії в групу 1. У $.1шаблоні заміщення це замінює довжину групи 1. Отже, перший символ у кожному рядку стає 1, другий стає 2, третій стає 3і так далі. Тепер має бути зрозуміло, як це переносить квадратний вхід: усі перші символи рядків надходять першими, і всі вони закінчуються в самому верхньому рядку, потім всі другі символи закінчуються у другому рядку тощо. Але для цих прямокутних входів ми також узгоджуємо стрічки ліній. З групи1не використовується в цьому випадку, заміна порожня, але для цілей #опції це враховується 0. Це означає, що всі канали ліній сортуються вперед.
Отже, тепер у нас є символи в першому порядку (перший символ кожного рядка, другий символ кожного рядка тощо) та всі стрічки передач на початку.
2 етап: Матч
!`(?<=(¶)+.*)(?<-1>.)+
Тепер нам потрібно розділити символи на рядки правильної довжини. Ця довжина відповідає кількості рядків у вихідному введенні, що відповідає кількості каналів рядків у нас на початку рядка.
Розщеплення тут проводиться за допомогою етапу відповідності, який просто знаходить усі збіги заданого регулярного виразів і використовує !опцію для друку цих збігів (за замовчуванням було б замість них рахувати). Таким чином, мета регулярного вираження - збігатися по одному рядку.
Почнемо з "підрахунку" числа з огляду (?<=(¶)*.*). Це генерує одне захоплення в групі 1для кожної стрічки на фронті.
Потім для кожного з цих захоплень ми узгоджуємо одного персонажа (?<-1>.)+.