Как скручиваются струны
Алгоритм скручивания очень прост. Каждый столбец смещен вниз на свой индекс (столбец 0 перемещается вниз на 0, столбец 1 перемещается на 1, ...). Сдвиг столбца переносится наверх. Это работает так:
aaaa
bbbb
cccc
становится:
a
ba
cba
----
cba
cb
c
Со всем под линией обтекания наверх. Реальный пример:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
вход
Входные данные - это либо массив строк, либо многострочная строка. Все строки имеют одинаковую длину.
Выход
Скрученная строка, многострочный вывод на стандартный вывод (или ближайший вариант).
Примеры:
( >
обозначает ввод, конечный пробел важен)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Ответы:
Брахилог , 5 байт
Попробуйте онлайн!
Получает входные данные в виде массива столбцов (что, по-видимому, соответствует спецификации вопроса).
iᵇ
- Для каждого элемента в массивеᵐ
сопоставьте его с индексом (на основе 0) - сопоставьте этот предикат с каждым элементом результата:↻₎
- перестановка (столбец) по кругу на сумму, указанную в качестве последнего элемента (индекса)Легко распространяется на версию, которая принимает одну многострочную строку:
13 байт
Попробуйте онлайн!
источник
Пиф, 11
Попробуй здесь
источник
APL (Дьялог) , 7 байт
требует
⎕io←0
Попробуйте онлайн!
⍬⍋⍉
получает диапазон от 0 до количества обращенных столбцов по⊖
вертикали,⊖⊖⍨⍬⍋⍉
поворачивая (по вертикали) обратный (по вертикали) ввод,0,1..
⊖
изменяя это, и возвращая его.источник
Сетчатка ,
1111019287 байтЧисло байтов предполагает кодировку ISO 8859-1.
Ву, решил это в одной подстановке регулярных выражений. :) (Скорее всего, есть более короткое решение с использованием нескольких, но где в этом удовольствие ...)
Попробуйте онлайн!
объяснение
Это требует некоторых базовых знаний о балансировке групп . Короче говоря, разновидность регулярных выражений .NET позволяет вам захватывать несколько раз одной группой, помещая все записи в стек. Этот стек также может быть извлечен, что позволяет нам использовать его для подсчета вещей внутри регулярного выражения.
Это выдвигает один захват на обе группы
1
и2
для каждого персонажа перед матчем (в текущей строке). То есть он считает горизонтальное положение матча.Остальное в перспективе:
Мы сопоставляем каждую строку и также помещаем ее в группу
1
, так что1
теперь группа является суммой горизонтального и вертикального положения (где последняя отсчитывается снизу ). Это по существу маркирует диагонали сетки с возрастающими значениями, начиная с нижнего левого угла. Что.*
то просто перемещает курсор двигателя до конца строки.Теперь мы переключаемся на просмотр сзади, который сопоставляется справа налево в .NET:
Это будет многократно выталкивать точные
H
снимки из группы1
(гдеH
высота ввода). Цель этого состоит в том, чтобы взять группу по модулюH
. После этого группа1
содержит строку (отсчитывается снизу), из которой можно выбрать новый символ в текущем столбце.Еще один взгляд сзади, снова начиная справа.
(?<-1>.+¶)*.+
теперь использует группу,1
чтобы найти строку, из которой нужно выбрать нового персонажа, а затем поисковый запрос находит правильный столбец, используя группу2
.Нужный символ захватывается в группу
3
и записывается обратно подстановкой.источник
$+
выглядит полезным ... особенно если вы хотите сделать только одну подстановку: ^)$+
на самом деле довольно бесполезен ... его описание на MSDN звучит намного полезнее, чем на самом деле, потому что подразумевает, что(a)|(b)
->$+$+
удвоит всеa
s иb
s, но вместо этого удалит всеa
s, поскольку просто ссылается на синтаксически последнюю группу , Это означает, что это просто способ избежать подсчета всех групп, если вы слишком ленивы (как я). Для игры в гольф он экономит байты только тогда, когда у вас более 9 групп, что, вероятно, довольно редко для начала.Regex.Replace
для Retina, но пока не успел ее реализовать).CJam, 13 байтов
Проверьте это здесь.
объяснение
источник
TeaScript, 10 байт
Благодаря чрезвычайно лаконичному синтаксису TeaScript 3, он очень короткий: D
Был бы на 1 байт короче, если бы цикл Sigma не глючил
Попробуйте онлайн
объяснение
источник
Python 3, 164 байта
Не лучший ответ длинным выстрелом, но первый в Python ...
источник
)
]
''.join(l)for l in....
MATLAB,
9236 байтПредполагая, что входная строка
s
уже имеет форму двумерного массива / матрицы, напримерПояснение: итерация по столбцам матрицы. Для каждого столбца выполните круговое смещение его элементов на количество символов, равное индексу столбца (-1 из-за индексации MATLAB).
источник
Брахилог , 96 байт
Ожидается список строк кодов символов в качестве входных данных и отсутствие выходных данных, например
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
Это один смехотворно длинный ответ, и, вероятно, есть гораздо более короткий способ сделать это.
объяснение
источник
JavaScript,
9289 байт3 байта от спасибо @Neil .
Показать фрагмент кода
источник
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
вплоть до первого.join
.Python 2, 115 байт
Благодаря чуду
zip
удалось свести это в одну строчку. Смотрите это в действии здесь .источник
MATL , 18
21байтВход имеет вид
Попробуйте онлайн!
Как это работает :
источник
F #, 105 байт
Мой первый удар в этом (только
\n
требуется персонаж):Использование:
источник
JavaScript (ES6), 73 байта
объяснение
Тест
Показать фрагмент кода
источник
Japt, 29 байт
Проверьте это онлайн!
Как это работает
источник
Haskell, 81 байт
повторная реализация примера CJam, хотя reverse, map и enumerate являются частью mapAccumR, snd удаляет аккумулятор, так как он нам больше не нужен, обращение является лишь побочным эффектом правого сгиба.
источник
Haskell, 65 байт
Пример использования:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.источник
MATL , 9 байт
Попробуйте онлайн!
По сути, очень похож на существующий ответ Луиса Мендо на MATL , но короче благодаря использованию функций, которых, вероятно, не было в языке на этом этапе: 1.
"
Теперь автоматически выполняется итерация по столбцам матрицы, поэтому нет необходимости в дорогостоящем построении индексов столбцов и индексации в них ( это важная персона), 2.&h
как сокращенный способ сказатьN$h
, и 3. неявный конец цикла, если]
не указан.Альтернативно для того же bytecount:
Попробуйте это на MATL Online
источник
C (лязг) , 114 байтов
Работает в GCC под MinGW. GCC TIO запутывается при использовании
strlen
в выражении init первого цикла for.Попробуйте онлайн!
источник