Введения
Булева матрица 2 × n может быть представлена в виде строки из четырех символов . ':
. Строка имеет «верхний ряд» и «нижний ряд», где точки представляют 1 и пустые пробелы представляют 0. Например, матрица 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
может быть представлен как ' '. :
. Ваша задача - взять матрицу в этой «сжатой форме» и вращать ее элементы на один шаг по часовой стрелке, как конвейерная лента.
вход
Ваш ввод представляет собой одну строку над символами . ':
. Его длина гарантированно будет не менее 2.
Выход
Ваш вывод должен быть входной строкой, но с каждой точкой, повернутой на один шаг по часовой стрелке. Точнее говоря, точки в верхнем ряду больше на одно место справа, кроме самой правой, которая движется вниз. Точки в нижнем ряду перемещаются на один шаг влево, кроме самой левой, которая перемещается вверх. В частности, выходная строка должна иметь ту же длину, что и оригинал, и пробел является значительным.
пример
Рассмотрим входную строку :..:'.
, которая соответствует матрице 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
Повернутая версия этой матрицы
1 1 0 0 1 1
1 1 1 0 1 0
что соответствует строке ::. :'
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Вы можете решить, будут ли входные и выходные данные заключены в кавычки, и в обоих также допустим один завершающий символ новой строки.
Контрольные примеры
Эти контрольные примеры заключены в двойные кавычки.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(переверните 2 части, чтобы я мог увеличить i, меньше регулярных выражений и более простой тест, сохраните предыдущий c в q)Perl,
706964636160 байтВключает +2 для
-lp
Запустите со строкой ввода на STDIN, например
rotatedots.pl
:объяснение
Пробел
не конвертируется в приведенном выше коде. Для расчетов
/2
и*2
так будет вести себя как и становиться0
. В других позициях он будет частью «или», но 1 бит пробела является подмножеством одного бита0
и будет иметь такой же эффект, как0
если бы он был или-ed с любой из цифр. Только если символ, с которым он или является, является пробелом, он останется пробелом, а не станет0
. Но это нормально, так как все0
равно был бы возвращен в космос.источник
Сетчатка , 66
объяснение
Начиная с ввода:
Первые 4 этапа строят матрицу, используя
1
/e
для true и0
/f
для false для верхней / нижней строк соответственно. Верхний и нижний ряды переплетены вместе. Это даст строку вроде:Тем не менее, эти 4 этапа также эффективно перемещают нижний ряд 1 влево, просто изменяя порядок букв и цифр:
Этап
T
транслитерации меняет шестнадцатеричные цифры только на первый и последний символы, т.е. заменяется0-9a-f
наf-a9-0
. Это приводит к перемещению нижнего левого символа вверх в верхний ряд и верхнего правого символа вниз в нижний ряд:На следующем этапе происходит перестановка каждой пары букв и цифр, тем самым перемещая верхний ряд 1 вправо. Ранее это было
(\D)(\d)
, но оказывается, что этого(.)(\d)
достаточно, потому что замены всегда происходят слева направо, и поэтому последние две цифры не будут ошибочно сопоставлены, потому что предпоследний символ будет уже заменен. Матрица теперь полностью повернута по мере необходимости:Последние 4 этапа затем переводятся обратно в исходный формат:
Попробуйте онлайн.
Все тестовые сценарии, по одному на строку ,
m
добавляются вT
строку, чтобы обеспечить отдельную обработку каждой входной строки.источник
Желе,
323029 байтОбратите внимание на завершающий пробел. Попробуйте онлайн! или проверьте все контрольные примеры .
Фон
Мы начнем с рассмотрения входной строки (например,
:..:'.
) и ее обратного.Для каждого символа в верхней строке мы проверяем, принадлежит ли он
':
, и для каждого символа нижней строки, если он принадлежит.:
. Это дает двумерный массив логическихкоторая является матрицей вопроса, с перевернутым нижним рядом.
Мы удаляем последний логический тип каждой строки, меняем порядок строк, добавляем булевы в их первоначальном порядке и, наконец, реверсируем верхний ряд.
Это дает повернутую матрицу из вопроса.
Наконец, мы рассматриваем каждый столбец логических чисел как двоичное число и индекс
'.:
для получения соответствующих символов.Как это устроено
источник
Pyth,
38362 байта благодаря Якубе!
Попробуйте здесь или запустите Test Suite .
Объяснение:
источник
L,hb_eb
короче на один байт и.DR2T
создает также декартово произведение и еще несколько пар, но не в цифре и помогает сэкономить место..D
трюк действительно крутой!Python 3,
145141130 байтобъяснение
Решение для игры в гольф использует следующее свойство zip:
zip('ABCD', 'xy') --> Ax By
такzip(a[:l],a[l:])
можно заменить наzip(a,a[l:])
и, что позволяет убрать определениеl
Результаты
источник
Pyth, 66 байт
Попробуй это здесь!
объяснение
Это можно разбить на 3 части:
Преобразовать ввод
Это довольно тривиально. Каждый символ отображается следующим образом:
Первый - это пробел.
Мы получаем список из двух кортежей, которые мы транспонируем, чтобы получить 2 строки матрицы, которые затем сглаживаются.
Код
Поворот
Мы имеем матрицу в виде плоского массива в
J
и ширину матрицы вK
. Вращение можно описать так:Код
Конвертируй обратно
источник
Python 3,
166154153150146138137135132127 байтовИзменить: Я заимствовал использование
zip
от ответа Python Эрваны в конце функции.и их идея использоватьКак оказалось, развороты не были хорошей идеей для моей функции. Я изменил свое использование[::-1]
развороты, хотя я включил свой собственный поворот.format
для дальнейшего игры в гольф. Переехалa
иb
прямо вzip
дальнейшую игру в гольф (разминка остается неизменной, потому что в моем объяснении разделение полезноa
и помогаетb
избежать беспорядка)Изменить: Заимствовано
(some number)>>(n)&(2**something-1)
из этого ответа xnor на вызове Music Interval Solver .zip(*[divmod(et cetera, 2) for i in input()])
Беспорядок, который, вероятно, может быть лучше в гольфе, хотя мне нравится целесообразность, которую он дает от использования двух кортежейt
иv
.Ungolfed:
источник
Рубин,
166163 байтаТьфу ...
transpose
слишком долго.Трюки, используемые здесь:
sprintf('%02b',x)
для новообращенного"0"
,"1"
,"2"
,"3"
в"00"
,"01"
,"10"
, и"11"
соответственно. Удивительно, но второй аргумент не нужно сначала преобразовывать в целое число.Поворот осуществляется с помощью
a[1].push a[0].pop;a[0].unshift a[1].shift;
, который, я думал, был по крайней мере немного умным (если не слишком многословным в Ruby). Симметрия эстетически хороша, во всяком случае: Pисточник
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 байт
Я отображаю каждый символ в двухзначный двоичный эквивалент
и я думаю о них как об одном другом
Я сохраняю это
Для каждого символа (0-3) из n я проверяю его соседей, добавляя бит старшего разряда левого соседа к биту младшего разряда правого соседа. если я == 0 (первый символ), я использую его собственный младший бит вместо левого соседнего бита.
если n [i + 1]> - 1, это означает, что мы получили 0,1,2,3, поэтому, когда это ложно, мы попадаем на последний элемент.
Когда это происходит, я использую собственный бит высшего порядка символа вместо младшего бита правого соседа
отобразить это обратно на
.':
землю и присоединиться к этому массиву обратно вместеисточник
MATL ,
4039 байтПопробуйте онлайн! Связанная версия была
v
изменена&v
из-за изменений в языке после публикации этого ответа .источник
JavaScript, 311 байт
Вероятно, может быть улучшено много:
источник
s[i-1]
? Это может сэкономить несколько байтов.s[i+1]
.<
вместо того,==
чтобы сэкономить вам несколько байтов. Вы также можете проверить Советы по игре в гольф в JS и Советы по игре в гольф в ES6<
вместо==
JavaScript (ES6),
237210204188182178 байтКредит @Downgoat за сохранение 16 байтов в 188-байтной версии
Обновление: у меня была мозговая волна, и я сократил первую операцию
s
до одногоmap
вызова вместо двух отдельныхКрасивая печать и объяснение
источник
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
работает?Perl
144142137131 байтДобавлен байт для
-n
флага.Практически тот же алгоритм, что и в моем ответе на Ruby , только короче, потому что ... Perl.
Неприятно,
@a=(shift@b,@a)
короче чемunshift@a,shift@b
.Увы, это одинаковая длина:
Спасибо Ton Hospel за 5 байт и msh210 за байт!
источник
..@a
вместо..$#a
? (Возможно,oct
умирает или возвращает 0 или что-то в этом роде. Я не пробовал.)//g
sprintf
долго.map$_%2,/./g
а такжеmap$_/2|0,//g
почти должен быть короче (непроверенный)Python 3,
294287283 байтаWaaayyyyyy слишком долго, но я попробую в гольф несколько байтов:
источник
Луа, 139 байт
Использование:
источник