Расшифровать расширенный формат Векслера

18

Эта проблема основана на публикации в песочнице пользователя 48538 . Поскольку он больше не активен на этом сайте, я принял этот вызов.


apgsearch , распределенная программа поиска супа для «Игры жизни» Конвея и база данных результатов поиска, Catagolue использует apgcodes для классификации и обозначения паттернов. Сами apgcodes используют расширенный формат Wechsler , расширение шаблона записи, разработанное Алланом 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]

Соревнование

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

Вы можете предположить, что строка не пустая и не начинается и не заканчивается на 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]]
alephalpha
источник
Когда- zнибудь произойдет в самом начале?
г-н Xcoder
@ Mr.Xcoder На странице LifeWiki ничего об этом не сказано. Но вы можете предположить, что строка не начинается и не заканчивается на z.
алефальфа
3
Не совсем шаблон Game of Life, но просто для удовольствия: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⊞υ⁴

Если это 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]
  • Если c больше или равно "x", мы выделяем 5 новых пустых строк в o [] и добавляем 5 к y . Это вызвано инициалом, "x"который был добавлен в начале строки, или любым "z"из оригинального содержимого.

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

набивка

Наконец, мы дополняем каждую строку в o [] пробелами, чтобы все они имели w символов.

o.map(r => r.padEnd(w))
Arnauld
источник
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

Попробуйте онлайн!

Попробуйте онлайн!

Попробуйте онлайн!

Принимает ввод в верхнем регистре и выводит транспонированную матрицу в виде нескольких выходных строк 1 и 0. Может добавить дополнительные нули.

Если вы хотите проверить строчными буквами, добавьте uзаголовок TIO.

Если вы хотите получить хорошо напечатанный текст, добавьте '1'█:'0'.:нижний колонтитул TIO.

объяснение

(Я называю «строки» и «столбцы» противоположными тем, что вы могли ожидать, потому что это генерирует транспонированную матрицу)

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

  1. Заменить "yy" на 38 0s
  2. Разделите на «у» и разверните 0-ти прогонов.
  3. Заменить "w" и "x"
  4. Определите самый длинный столбец (то есть самую длинную строку между z) и заполните все остальные столбцы, чтобы они были такой длины. (Это необходимо из-за того, как работает алгоритм ниже)
  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 
kerwizzy
источник
1
Привет и добро пожаловать в PPCG; очень хороший первый пост! Что касается вашего количества байтов: вы правы. TIO даже легко показывает, что 148 символов представлены 148 байтами с использованием кодовой страницы 05AB1E.
Джонатан Фрех
Одно небольшое замечание: большинство языков игры в гольф используют неявную печать; Я думаю, что вы можете пропустить свой последний ,.
Джонатан Фрех
Я посмотрел и сделал некоторые улучшения. Поведение будет отличаться (теоретически) только для вещей с более чем 1000 строк или столбцов, и в этот момент меньшая программа сделает что-то неожиданное.
Kerwizzy
Не самая простая задача для начала! Хорошая работа, я думаю, что некоторые из стойких 05AB1E дадут несколько полезных указателей, когда они придут.
Джонатан Аллан
1
Добро пожаловать в PPCG и мир 05AB1E. У меня сейчас не так много времени, и я начал использовать 05AB1E только несколько месяцев назад, так что я тоже не слишком профессионал, но здесь есть некоторые мелочи для игры в гольф: "yy"может быть „yy(05AB1E имеет встроенная строка из 2 и 3 символов). >≠может быть Ā(правда, в основном 0остается, 0а все остальное становится 1). }}может быть ](закрыть все циклы и if-elses). Я уверен, что некоторые из профессиональных игроков в гольф 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}⍞

Попробуйте онлайн!

NB: принимает ввод в виде строки в верхнем регистре.

С красивой печатной продукцией

объяснение

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)⊤число в двоичный вектор, в результате чего 3-мерная матрица с двоичными векторами вдоль первичной оси
инвертируется вдоль первичной оси,
уменьшает ранг матрицы, поэтому он 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'
jslip
источник
Здесь экономия 7 байт: a←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞. Загвоздка ошибка также не кажется очень golfy
H.PWiz
Спасибо @ H.PWiz. Да, мне тоже не нравится перехват ошибок, но в противном случае я использовал две замены регулярных выражений.
Jslip
@jslip круглые скобки ⎕Rи их операнды не нужны
ngn
2+'WX'⍳⍵->2+'X'=⍵
СПП
{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
СПП
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:g/w/00/и x«использование» s:g/x/000/. Наконец, с s/$/z/добавлениемzв конце, добавив много пустых строк в нижней части. (Мы увидим причину позже.)

Остальное - это просто большая карта. Мы наносим на карту.split("z").map: (*~0 x.chars).comb}) , что является входной строкой (без нулевых сокращений), разбитой на строки в z, причем каждая строка сначала дополняется 0 x.chars(тоннами нулей, а именно столько, сколько является общей длиной входной строки) справа а затем разбить на список отдельных символов ( .comb). Наконец, мы транспонируем это с помощью [Z](уменьшите с помощью zip). Сжатие заканчивается, как только самый короткий список истощается, в результате чего все строки имеют одинаковую длину. (Количество бесполезных конечных нулей справа равно длине самой короткой строки. Кроме того, этот трюк транспонирования не работает для «матрицы» только с одной строкой. Поэтому мы принудительно добавили еще одну строку в конце ранее.)

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

(Я чувствую себя немного плохо из-за того, что так сильно злоупотребляю возможностью отследить нули. Но это значительно сократило байтовый счет :—).)

Ramillies
источник
142 байта
Джо Кинг
@JoKing - О, да, большое спасибо!
Рамилли
Не удается 1yx1и1yw1
Джонатан Аллан
@JonathanAllan, ты прав, спасибо. Я исправлю это через мгновение. (Сначала я подумал по какой-то причине, что это может быть только так, y[0-9a-v]и когда я обнаружил, что это не так, я просто добавил быстрое (и неправильное) исправление.)
Рамилли
Вы можете заменить замену на 000y наx
Jo King
2

Желе , 66 байт

Yowza!

Ø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. Во-первых, 0к #. Если это - #0то, то изменяется на то, 000что завершает операцию, в противном случае символ после #уменьшается, и цикл повторяется до тех пор, пока все #s не будут обработаны.

w
000
x
00

Исправьте wс и xс.

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 и1 s.

Попробуйте онлайн!

объяснение

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

Если текущим символом является «y», установите флаг так, чтобы значение base-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
Евгений Новиков
источник