Розшифруйте розширений формат Wechsler


18

Цей виклик ґрунтується на публікації пісочниці від користувача48538 . Оскільки він більше не активний на цьому сайті, я взяв на себе це завдання.


apgsearch , розповсюджена програма пошуку супу для гри «Життя життя Конвей» та база даних результатів пошуку, Catagolue використовують apgcodes для класифікації та позначення шаблонів. Самі apgcodes використовують розширений формат Wechsler - розширення позначення шаблону, розроблене Алланом Вексслером у 1992 році.

Наступні приклади та зображення взяті з LifeWiki .

  1. Рядок з n символів у наборі, що відповідає регулярному вираженню, [0-9a-v]позначає смугу в п'ять рядків, шириною n стовпців. Кожен символ позначає п'ять клітин у вертикальній колоні , відповідні bitstrings [ 00000, 10000, 01000... 00010, 10010, 01010, 11010... 11111].

    Наприклад, 27deee6відповідає космічному кораблі важкої ваги :

27deee6

[01100001101111011111100111100000000]
  1. Персонаж zвідокремлює суміжні п'ятирядкові смужки.

    Наприклад, 0ca178b96z69d1d96відповідає 31-бітний натюрморт:

введіть тут опис зображення

введіть тут опис зображення

[000110110001010101010010001011001110000000000011111000100000100101010100011011000000000000]
  1. Символи wі xвикористовуються для скорочення 00і 000, відповідно.

    Так w33z8kqrqk8zzzx33відповідає трансферний бджолиний човник :

введіть тут опис зображення

введіть тут опис зображення

(Пропущено 10 порожніх рядків)

введіть тут опис зображення

[0011000001100000000000000000000000000010000011100010001010111010111110000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000000000000000000]
  1. Нарешті, символи, що відповідають регулярному вираженню, y[0-9a-z]відповідають пробігам між 4 та 39 послідовними 0с.

    Хороший приклад - 31a08zy0123ckoвідповідність корабля на четвірку :

введіть тут опис зображення

введіть тут опис зображення

[1100000000101000000000000000000010100000000000000000001010000000011000000000011000000001010000000011]

Змагання

Напишіть програму або функцію для розбору рядка розширеного формату Wechsler, визначеного вище, і надрукувати (або повернути) шаблон, відповідний цьому рядку.

Ви можете припустити, що рядок не порожній і не починається і не закінчується z.

Ви можете використовувати будь-який розумний вихідний формат, наприклад, рядок, матрицю, 2d масив. Ви можете використовувати будь-які два значення для представлення 0і 1, враховуючи, що ви їх оголосили у відповіді.

Ви можете опустити рядки з остаточними нулями у висновку або додати додаткові лінійки з нульовими кінцевими нулями. Ви також можете додати / пропустити проміжні нулі у кожному рядку, якщо всі рядки мають однакову довжину у висновку.

Ви можете повернути транспозицію масиву, якщо це зручніше.

Це , тому виграє найкоротший код.

Тестові справи

153 => [[1, 1, 1], [0, 0, 1], [0, 1, 0], [0, 0, 0], [0, 0, 0]]
27deee6 => [[0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0]]
0ca178b96z69d1d96 => [[0, 0, 0, 1, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1], [0, 1, 1, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
w33z8kqrqk8zzzx33 => [[0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0], [1, 0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
31a08zy0123cko => [[1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]
o5995ozes88sezw33 => [[0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1], [0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
y3343x6bacy6cab6x343zkk8yy8kkzgo8gywg8ogz0123yw321zzgo4syws4ogzgh1yy1hgz221yy122zy3c2cx6d53y635d6xc2c => [[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Чи zстанеться коли-небудь на самому початку?
Містер Xcoder

@ Mr.Xcoder Сторінка LifeWiki про це нічого не говорить. Але тут можна припустити, що рядок не починається і не закінчується z.
алефальфа

3
Насправді не гра «Життя життя», а просто для розваги:vv99f60vv99f60uv11320uv19rqz33y133y11322310132231
Арнольд

1
"Ви можете повернути перенесення масиву" - якщо це нормально, що з іншими симетріями, такими як догори дном тощо ...?
Джонатан Аллан

1
Два з перших трьох відповідей обов'язково для деяких з них: 1yx1, 1yy1, 1yw1і 1yz1. Можливо, вони повинні бути тестами.
Джонатан Аллан

Відповіді:


2

Вугілля деревне , 50 байт

UB0≔⁺⭆χιββFS¿υ×0⁺⊟υ⌕βι≡ιz×⸿⁵y⊞υ⁴x×0³w¦00«P↓⮌⍘⌕βι²→

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Використання 1та 0. Пояснення:

UB0

Встановіть фон, тобто будь-які недруковані комірки прямокутника, що додають висновок, до 0.

≔⁺⭆χιββ

Префікс цифр до заздалегідь заданого алфавіту малих літер.

FS

Петля над вхідним рядком.

¿υ

Якщо попередньо визначений порожній список не порожній ...

×0⁺⊟υ⌕βι

... потім надрукуйте число 0s, задане сумою числа, що з’явилося зі списку, та індексу поточного символу в цифрах та літерах. Дивіться нижче, що таке число завжди є.

≡ι

Переключіться на поточний символ.

z×⸿⁵

Якщо це - zтоді вихід 5 каретки повертається, переводячи нас до наступної вихідної смуги.

y⊞υ⁴

Якщо це a y, тоді натисніть 4на попередньо визначений порожній список, в результаті чого 4+n 0s вийде наступного разу.

x×0³

Якщо це xтоді вихід 3 0с. (Це робиться за допомогою повторення, щоб уникнути прямого 0дотику xдо наступного прямого або наступного.)

w¦00

Якщо це wтоді вихід 2 0с. ( ¦Потрібно для розділення двох рядкових літералів.)

«P↓⮌⍘⌕βι²→

В іншому випадку проіндексуйте поточний символ у цифрах та літерах, перетворіть у двійкові та виведіть результат спочатку вниз, щонайменше, істотний біт; потім перемістіть курсор праворуч до наступного стовпця.


6

JavaScript (ES8), 197 байт

Вводиться як рядок. Повертає масив рядків з "#" та пробілами. Вихід може містити додаткові (але послідовні) пробіли у кожному рядку.

s=>[x='x',...s.replace(/w|x|y./g,s=>''.padEnd(s<x?2:s>x?P(s[1],36)+4:3),P=parseInt)].map(c=>[!++w,1,2,3,4].map(i=>c<x?o[y+i-5]+=' #'[P(c,36)>>i&1]:o=[...++y&&o,'']),w=y=o=[])&&o.map(r=>r.padEnd(w))

Спробуйте в Інтернеті! (попередньо визначений вихід)

Як?

Глобальні змінні

  • Символ "x"використовується кілька разів, тому варто зберігати його у змінній x .
  • Функція parseIntвикористовується двічі, так що варто зберігати його в змінної P .
  • y - індекс рядка, ініціалізований до 0 .
  • w відстежує верхню межу ширини, яка використовується для накладки кінцевого виводу.
  • o [] - вихідний масив, спочатку порожній.

Попередня обробка повторних нулів

Спочатку замінюємо всі шаблони "w", "x"а "yX"у рядку введення на відповідну кількість пробілів. Ці простори згодом будуть інтерпретовані як "0".

s.replace(
  /w|x|y./g,
  s => ''.padEnd(
    // w --> 2
    s < x ? 2 :
    // yX --> value of X + 4
    s > x ? P(s[1], 36) + 4 :
    // x --> 3
    3
  )
)

Розшифровка

Розбиваємо отриманий рядок, додаємо початковий "x"і повторюємо 5 разів (з i = 0 до 4 ) на кожному символі c :

  • Якщо c нижче "x", ми додаємо відповідний зразок до наступних 5 рядків.

    o[y + i - 5] += ' #'[P(c, 36) >> i & 1]
  • Якщо з більше або дорівнює "x", ми виділяємо 5 нових порожніх рядків в о [] і додати 5 до у . Це ініціюється початком, "x"який був доданий на початку рядка, або будь-яким "z"у вихідному вмісті.

    o = [...++y && o, '']

Прокладки

Нарешті, ми прокладаємо кожну рядок у o [] з пробілами, щоб усі вони мали w символів.

o.map(r => r.padEnd(w))

6

05AB1E , 148 132 98 байт

Я студент середньої школи, і це був мій перший раз для гольфу та використання 05AB1E, тому коментарі оцінені!

„YY¾38×:'Yð:žLRDUsð«#εNĀiDнXsk4+s¦sú]'W¾2×:'X¾3×:J'Z¶:.Bð¾:vNUyvDykDNX‚Š32VY‹iY+b¦RX_i¶ì}‚ˆ]¯{€¦˜J

Спробуйте в Інтернеті!

Спробуйте в Інтернеті!

Спробуйте в Інтернеті!

Приймає введення як великі регістри та виводить транспоновану матрицю у вигляді декількох вихідних рядків 1s та 0s. Може додавати додаткові нулі.

Якщо ви хочете протестувати з малих рядків, додайте uу заголовку TIO.

Якщо ви хочете добре друкувати вихід, додайте '1'█:'0'.:в колонтитул TIO.

Пояснення

(Я називаю "рядки" та "стовпці" навпроти того, що ви можете очікувати, оскільки він генерує транспоновану матрицю)

Основний алгоритм:

  1. Замініть "yy" на 38 0s
  2. Розділіть на "y" і розгорніть 0-прогони.
  3. Замініть "w" і "x"
  4. Визначте найдовший стовпчик (тобто найдовший рядок між z's) та прокладіть усі інші стовпці, щоб вони були такої довжини. (Це необхідно через те, як працює алгоритм нижче)
  5. Розділити на z
  6. У цей момент вхідний рядок - це масив стовпців, де кожен стовпець є рядком [0-9A-V], де кожен стовпець має однакову довжину.
  7. Алгоритм, щоб перевести його у вихідний формат, полягає в
    1. Перетворіть символи в числа за допомогою indexOf у рядку пошуку
    2. Перетворіть символи у двійкові, а потім накладки на довжину 5
    3. Якщо це перший стовпець, додайте рядковий рядок перед двійковим номером
    4. Додайте префікс до початку двійкового рядка, який зберігає рядок, а потім стовпець символу.
    5. Натисніть на двійковий рядок з префіксом до регістру / змінної 05AB1E "глобальний масив"
  8. Сортування глобального масиву. Рядок префікса, який визначає порядок сортування, гарантує, що все закінчується в потрібному порядку, а рядкові перерви знаходяться в потрібних місцях.
  9. Видаліть рядок префікса з кожного елемента глобального масиву
  10. Приєднайте масив до "" та надрукуйте його.

Є кілька інших дрібних деталей, які ви можете побачити нижче в розширеному коді. Все після вкладок у кінці рядка - це коментар і може бути проігноровано. (До речі, ця схема коментарів не є частиною 05AB1E. Я зробив це таким чином, тому що це виглядало приємно.) Рядки, які мають коментарі, починаючи з "@", призначені для налагодження і можуть бути опущені без зміни кінцевого результату.

„YY¾38×:                                        Replace "YY" with 38 0's. (y is the 34th character in the index, so need to add 34+4 = 38). ¾ is initialized to zero, which saves one byte from typing '038
'Yð:                                            Replace "Y" with " "                                
"Replaced input Stage1 = "?D,                   @DEBUG

žLR                                             Pushes [0-9A-Za-z]
DU                                              Set X to [0-9A-Za-z] and leave [0-9A-Za-z] on the stack.
s                                               Swap top two elements. Now the stack is [0-9A-Za-z],input

ð«                                              Append a space so the below splitter works even if there are no other spaces.
#                                               Split input on " ", which "Y" has been replaced with
ε                                               Map. This map replaces the y runs
    "Element = "?D,                             @DEBUG
    "N = "?N,                                   @DEBUG
    NĀi                                         If N != 0   
        "Replacing!",                           @DEBUG
        Dн                                      Get the first letter
        X                                       Push X
        s                                       Swap
        k                                       X (which is [0-9A-Za-z]) .indexOf(firstLetter)
        "indexOf run token = "?D,               @DEBUG
        4+                                      Add 4 to the index, now becoming the number of zeros to add
        s                                       Swap. Now top is the string between runs
        ¦                                       Remove the first character
        s                                       Swap again. Now the top is the number of zeros to add.
        ú                                       Add that many spaces (will be replaced with zeros later) to the start of the element.
        "Element Replaced = "?D,                @DEBUG
]
'W¾2×:                                          Need to do this replacement after the Y replacement so stuff like YW gets parsed properly. Again, ¾ is zero.
'X¾3×:
J                                               Join with ""
"Replaced input Stage2 = "?D,                   @DEBUG
'Z¶:                                            Replace "Z" with "¶".
.B                                              "Squarify" command. Splits on \n and appends spaces to the end of each element so each is the same length. In this case, that is equivalent to adding zeros to the end of each column, which is what we want.
ð¾:                                             Replace spaces (which we used for padding above) with zeros.
"Replaced input Stage3 = "?D,                   @DEBUG
"0 Stack top = "?D,                             @SDEBUG
"0 Stack top-1 = "?sD,s                         @SDEBUG
v                                               pop and loop over top element, which is array of column code
    NU                                          Store the column number in X
    yv                                          Loop over each character in the column              
        "1 Stack top = "?D,                     @SDEBUG
        "1 Stack top = "?D,                     @SDEBUG
        D                                       Duplicate top element (which is now [0-9A-Za-z])
        y                                       Push y (special loop variable)
        "Character = "?D,                       @DEBUG
        k                                       Push indexOf y in [0-9A-Za-z]
        "Index = "?D,                           @DEBUG
        "2.1 Stack top = "?D,                   @SDEBUG
        "2.1 Stack top-1 = "?sD,s               @SDEBUG
        D                                       Duplicate index.
        NX‚                                     Push [rowNumber,columnNumber]. This result is used for sorting.
        Š                                       Triple swap. The top of the stack is now sortPrefix, index, index
        32V                                     Set Y to 32
        Y‹i                                     index < 32. This uses up one copy of index
            Y+                                  Add 32 to the index
            b                                   Push the index in binary. This uses the second copy of index. 
            ¦                                   Remove the first character, which will be a 1 because we added 32. The result is now a padded binary string of length 5
            "Binary = "?D,                      @SDEBUG
            R                                   Reverse the binary string. This gives the proper transposed output. 
            X_i                                 This will only run if X (which is set to the column number) == 0. (Runs !X)
                ¶ì                              Stick a linebreak at the beginning of the binary string
            }
            "2.5 Stack top = "?D,               @SDEBUG
            "2.5 Stack top-1 = "?sD,s           @SDEBUG         
            ‚                                   At this point the top of the stack is sortPrefix,binaryString. This will combine the two into a list.
            "Pushing '"?D?"'",                  @DEBUG
            ˆ                                   Push [[rowNumber,columnNumber],binaryString] to global array
            "2.6 Stack top = "?D,               @SDEBUG
            "2.6 Stack top-1 = "?sD,s           @SDEBUG
        ]                                       Close all blocks
¯                                               Push global array

{                                               Sort global array. 
"Sorted Data = "?D,                             @DEBUG
€¦                                              Remove the sort prefix              
˜                                               Flatten. Before doing this, the array is in the format [[<binary string>],[<binary string>],[<binary string>],...]
J                                               Join with ""
'1'█:'0'.:                                      @DEBUG pretty print 

1
Привіт і ласкаво просимо до PPCG; дуже приємний перший пост! Що стосується підрахунку байтів: ви праві. TIO навіть зручно показує, що 148 символів представлені 148 байтами за допомогою кодової сторінки 05AB1E.
Джонатан Фрех

Одна невелика примітка: Більшість мов для гольфу реалізують неявну друк; Я думаю, ви можете опустити своє останнє ,.
Джонатан Frech

Я переглянув це і зробив деякі вдосконалення. Поведінка буде різною (теоретично) лише для речей з більш ніж 1000 рядками або стовпцями, і тоді менша програма зробить щось несподіване.
kerwizzy

Не найпростіший виклик почати! Хороша робота, я думаю, що деякий з прихильників 05AB1E дасть кілька зручних покажчиків, коли вони пройдуть.
Джонатан Аллан

1
Ласкаво просимо до PPCG та світу 05AB1E. Зараз у мене не так багато часу, і я почав використовувати 05AB1E лише кілька місяців тому, тому я ще не такий великий професіонал, але ось деякі дрібниці для гольфу: "yy"можна „yy(05AB1E має як вбудована двочарова, так і 3-рядова струна). >≠може бути Ā(truthified, в основному 0залишається 0і все інше стає 1). }}може бути ](закрити всі петлі та if-elses). Я впевнений, що деякі із гольфістів Pro 05AB1E здатні грати у більш значні речі, ніж я, можливо навіть удвічі зменшивши кількість байтів.
Кевін Кройсейсен

4

APL (Dyalog Unicode) , 87 80 77 67 63 байт

завдяки H.PWiz за збереження 7 байт та ngn для ще 13 17.

a←⎕D,⎕A⋄,⍉↓⊖(5/2)⊤↑35(≠⊆⊢)a'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}⍞

Спробуйте в Інтернеті!

Примітка: приймає дані як верхній регістр.

З досить друкованим виведенням

Пояснення

a←⎕D,⎕Aa - рядок, що '0123...89ABCD...XYZ'
'Y.|W|X'⎕R{'0'/⍨+/30 36|a⍳2↑⍵.Match}замінює XW і Yx відповідною кількістю '0's (пояснено далі нижче) 35(≠⊆⊢)a⍳перетворює рядок у вектор невідповідностей aі розщеплює 35(тобто) 'Z'створюючи вкладений вектор,
перетворює вкладений вектор в матрицю, підкладка закінчується з 0s
(5/2)⊤перетворює кожен число у бінарному векторі, в результаті чого тривимірна матриця з двійковими векторами вздовж первинної осі
повертається вздовж первинної осі,
зменшує ранг матриці, тому вона двовимірна
,⍉переробляє результат на відповідний вихід

'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}
'Y.|W|X'R                          Regular expression replace. mathing the string.
                        2↑⍵.Match   Takes matching string (either 'X' 'W' or 'Y.') and pads with spaces to length 2
                      a            Returns the indecies of each charactor in a. on the spaces this is 36 (length of a)
                30 36|              Takes the remainders of the indecies when divided by 30 and 36 respectively. Overall 'W' -> 'W ' -> 32 36 -> 2 0, 'Y2' -> 'Y2' -> 34 2 -> 4 2.
           '0'/⍨                    Make vector of repeating '0's with length equal to the sum of the result. '0'/⍨4 2  '000000'

Тут економія 7 байт: a←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞. Захоплення помилок також не здається дуже пристрасним
H.PWiz

Дякую @ H.PWiz. Так, мені теж не подобається помилка помилок, але в іншому випадку я використовував два заміни регулярних виразів.
jslip

@jslip дужки навколо, ⎕Rі його операнди є непотрібними
ngn

2+'WX'⍳⍵->2+'X'=⍵
ngn

{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
ngn

3

Perl 6 ,156 142 байти

14 байт збережено завдяки Джо Кінгу. (Виправлено також помилку з розбором yта додав претифікатор.)

Виправлена ​​помилка розбору y[wxy].

{s:g/y(.)/000{0 x:36(~$0)}/;s:g/x/w0/;s:g/w/00/;s/$/z/;map {
.flatmap:{:32($_).fmt("%05b").flip.comb}},[Z] .split("z").map: (*~0 x.chars).comb}

Спробуйте в Інтернеті!

Розрив рядка існує лише для того, щоб текст помістився на екрані. Це не є частиною програми.

Як це працює

Це анонімна функція, яка займає змінний рядок. (Це робить використання функції трохи своєрідним, оскільки ви можете надати їй лише змінні, а не літерали.) Після деякої роботи він повертає список списків, що містять 0 і 1, з тим самим значенням, що і в початковому дописі.

Рядок введення входить у змінну $_. Ми почнемо з використання серії заяв про підстановку, щоб позбутися всіх цих скорочень для різних чисел нулів. По- перше, ми повинні розібратися в цьому y, так як в разі yxабо yw, то w(або x) не є стенографії сам по собі. Ми шукаємо y(.)( yі один символ, який він запам'ятовує) і замінюємо його 000{"0"x:36(~$0)}: три нулі копіюються дослівно, потім перетворюємо наступний символ з бази 36 в базу 10 ( :36(~$0)) і додаємо ще багато нулів. Тоді ми замінюємо використання w's s:g/w/00/, і x' s s:g/x/000/. Нарешті, з s/$/z/, додамо аzв кінці, додаючи донизу цілу купу порожніх рядків. (Причину ми побачимо пізніше.)

Решта - лише велика карта. Ми відображаємо відображення .split("z").map: (*~0 x.chars).comb}), що представляє собою вхідний рядок (без нульових скорочень), розділений на рядки у z, причому кожен рядок спочатку прошитий 0 x.chars(тоннами нулів, а саме стільки, скільки становить загальна довжина вхідного рядка) праворуч а потім розбивається на список окремих символів ( .comb). Нарешті, ми переносимо його [Z](зменшити на блискавці). Зіпсування закінчується, як тільки найкоротший список вичерпується, в результаті чого всі рядки мають однакову довжину. (Кількість непотрібних кінцевих нулів праворуч дорівнює довжині найкоротшого рядка. Також цей трюк транспозиції не відповідає "матриці" лише з одним рядком. Тому ми насильно додали ще один рядок в кінці раніше.)

Тепер ми просто відображаємо рядки (стовпці вихідної матриці) і замінюємо кожен зібраний символ відповідними 5 бітами. Це робиться за допомогою :32($_)(база 32 до основи 10) .fmt("%05b")(формат у вигляді бітового рядка шириною 5, оббитий нулями) .flip(зворотний рядок, оскільки LSB знаходиться у верхньому рядку, а не в нижньому) .comb(розбийте рядок на список символів). Ми використовували .flatmap, що вирівнює отриманий список (інакше ми отримаємо список списків у кожному стовпчику). Транспонування результату потім неявно повертається.

(Я відчуваю себе трохи погано через те, що зловживають можливістю відключення нулів настільки важко. Але це значно скоротило число рахунків :--).)



@JoKing - О так, дуже дякую!
Раміллі

Невдача 1yx1і1yw1
Джонатан Аллан

@JonathanAllan, ти маєш рацію, дякую. Я виправлю це за мить. (Я спершу чомусь подумав, що це може бути тільки, y[0-9a-v]і коли я виявив, що це не так, я просто додав швидке (і неправильне) виправлення.)
Ramillies

Ви можете замінити заміну 000yx
Джо Кінг

2

Желе , 66 байт

Йоуза!

ØBiⱮ+
Œuœṣ⁾YYj38Żṣ”YµḢç3;)Fṣ”Wj2ṣ”Xj3”0ẋ$¹OƑ?€Fṣ”Zµȯ”0ç31BḊ€UZ)Ẏz0

Монадійне посилання, яке дає перекладену версію як список списків (додати Zв кінці, щоб перенести назад).

Спробуйте в Інтернеті! Або подивіться тестовий набір (з досить друкованим результатом).


2

Сітківка , 203 байти

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #
P`.+

Спробуйте в Інтернеті! Посилання включає тестові випадки. Альтернативне рішення, також 203 байти:

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&
T`g-v`#`¶.+
T`dl` `¶.+
T`g-v`dl
^.+
$&¶$&
T`89l`#`¶.+
T`d` `¶.+
T`89l`d
^.+
$&¶$&
T`d`    #`¶.+
T`4-7`d
^.+
$&¶$&
T`d`  #`¶.+
)T`d` # #
P`.+

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

y(.)
#$1

Спочатку обробіть незручний випадок yкоманди. На жаль, лист після цього дозволено бути yабо навіть а z, тому ми повинні бути обережними тут. Усі магічні ys спочатку перетворюються на #s.

{`#
0#
#0
000
)T`dl`_dl`#.

Потім цикл обробляє #s. По-перше, a 0є попередньо до #. Якщо це #0те, що змінюється, 000яке завершує операцію, інакше символ після знака #зменшується, і цикл повторюється, поки всі #s не будуть оброблені.

w
000
x
00

Виправити значення ws і xs.

z
¶

Розділіться на нові лінії. ( S`zтакож працює для того ж числа байтів.)

%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #

Зробіть 5 копій кожного рядка, потім виконайте бінарне перетворення, зіставляючи букви з відповідним бітом до #та очищаючи цей біт, а інші літери стають пробілами. Біти обробляються в порядку 16, 8, 4, 2, і тоді останній переклад обробляє очищення 2біта і перетворення 1біта одночасно. (Альтернативна версія робить кожну копію індивідуально, що коштує більше байтів, але вони зберігаються, оскільки обробка бітів спрощена.)

P`.+

Прокладіть всі лінії однакової довжини.


1

Python 2 , 249 244 байт

def f(s,Z='0'):
 while'y'in s:i=s.find('y');s=s[:i]+4*Z+Z*int(s[i+1],36)+s[i+2:]
 t=s.replace('w',2*Z).replace('x',3*Z).split('z');return map(''.join,zip(*[[(Z*5+bin(int(c,32))[2:])[:-6:-1]for c in r]+[Z*5]*(max(map(len,t))-len(r))for r in t]))

Спробуйте в Інтернеті!

5 байт, збережених Джонатаном Фрехом .


Тут є зайвий простір while 'y'in. Я думаю, що в підписник [-5:][::-1]можна пограти в гольф [:-6:-1]. Заява про повернення може бути поміщена в попередній рядок.
Джонатан Фрех

1

JavaScript (ES8), 192 байти

s=>[...s,"z"].map(c=>{h=parseInt(c,36);k="wxy".search(c)+1;y?k=h-y--:h-35?y=h>33:m=m.map(P,z+=5,i=k--);for(h=k?0:h;~k--;m[i]=h.toString(2)+P(m[i++]||""));},P=d=>d.padStart(z,0),m=[i=z=y=0])&&m

Повертає транспонтування ..., яке потім відображається по вертикальній осі; дайте мені знати, якщо це визнає недійсним цей запис. Вихід - це масив рядків, що містить 0s і 1s.

Спробуйте в Інтернеті!

Пояснення

Для кожного символу c, має k+1значення кількості рядків , щоб змінити. k = "wxy".search(c) + 1;, де searchметод повертає індекс або -1. kПотім зменшується, поки не досягне -1, перевіряючи ~k--значення truthy.

Якщо поточний символ є "у", встановіть прапор так, щоб значення базового 36 наступного символу - 1 стало значенням для k.

Зустрічаючи "z", рядки колодки зліва, збільшуйте кількість колодки на 5і поверніть індекс масиву до 0.

s =>
    [...s, "z"].map(c => {                  // append a "z" to ensure final output is properly padded
        h = parseInt(c, 36);
        k = "wxy".search(c) + 1;            // note that "y" -> 4 zeroes
        y                                   // if previous char is "y"...
            ? k = h - y--                   //      decrement y after subtracting y=1 since k is decremented to -1 and the previous y already pushed 4 zeroes
        : h - 35                            // else if current char is not "z"...
            ? y = h > 33                    //      set y if current char = "y"
        : m = m.map(P, z += 5, i = k--);    // else if current char is "z", pad
        for (
            h = k ? 0 : h;                  // if k is truthy, push zeroes
            ~k--;
            m[i] = h.toString(2)            // convert to boolean representation
                + P(m[i++] || "")           // prepend to row or to a newly padded row
        );
    },
        P = d => d.padStart(z, 0),
        m = [i = z = y = 0]                 // the logical OR 4 lines above replaces this value with ""
    ) &&
    m

Я думаю, було б більше сенсу не повертати транспонінг вводу.
mbomb007

1

Haskell, 399 байт

Встановити splitпакет:cabal install split

import Data.Char
import Data.List.Split
import Data.List
p=map
r=replicate
a c|47<c&&c<58=c-48|96<c&&c<123=c-87
o=a.ord
m l n|l==0=[]|True=(mod n 2):m(l-1)(div n 2)
t a=p(\l->l++r((maximum$p length a)-length l)'0')a
y s|length s==0=""|h=='y'=(r(4+(o$s!!1))'0')++y(drop 2 s)|h=='w'="00"++y t|h=='x'="000"++y t|True=h:y t where h=head s;t=tail s
w=(p concat).transpose.(p$p$(m 5).o).t.(splitOn "z").y
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.