В матрицах Паулей представляют собой набор матриц 2х2 , которые появляются очень часто в квантовой физике (нет, вам не нужно знать никакой квантовую физику для этой задачи). Если мы включим тождество в набор, четыре матрицы:
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
Умножение двух из них всегда будет давать другую матрицу Паули, хотя это может быть умножена на один из сложных этапов 1
, i
, -1
, -i
. Так , например, .σ1σ3 = -iσ2
Ваша задача - умножить количество матриц Паули и вернуть полученную матрицу и фазу. Входной будет передано как непустая строка цифр 0
до 3
представляющих матрицы в . Вывод должен быть строкой , содержащей одну цифру для полученной матрицы, необязательно предшествует , или , чтобы указать фазу ( для ).σ0
σ3
i
-
-i
-
-1
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы не должны использовать какие-либо встроенные (или сторонние) функции, связанные с матрицами Паули.
Это код гольф, самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
источник
Ответы:
Pyth, 47 байтов
Я думаю, что это все еще пригодно для игры в гольф. Но это намного превосходит CJam.
Попробуйте онлайн: демонстрация или тестовый набор
объяснение
Определение результирующего типа матрицы - это просто сохранение всех чисел.
При умножении 2 матриц
A*B
фаза изменяется, если не из матриц естьσ0
иA != B
.источник
Python 2,
108898786 байт(Спасибо @grc и @xnor за помощь)
объяснение
Давайте разделим коэффициент и базовую матрицу. Если мы сконцентрируемся только на базовой матрице, мы получим эту таблицу умножения (например,
13
есть-i2
, мы ставим2
)что, случается, то же самое, что и битовое xor.
Теперь давайте сосредоточимся на коэффициентах. Если мы позволим
0123
обозначить1,i,-1,-i
соответственно, мы получим:Для этого мы сначала проверяем, является ли любое число 0, выполняя
m*y
заботу о левом столбце и верхней строке. Добавление в(m-y)%3
затем дает:что близко, кроме того, что у нас
2
вместо3
. Мы учитываем это, выполняя*3/2
.Для индексации мы замечаем, что если мы возьмем строку
"--i"
и выберем каждый второй символ, начиная с индексов,0123
мы получим"-i","-","i",""
.источник
3-n%4
как~n%4
. Я подозреваю, что вы можете выразитьm*y and(m-y)%3*3/2
короче в волшебную строку, но моя первая попытка877449216>>2*m+8*y
только связана. Есть также довольно алгебраическая формула, что, еслиY=m^y
, выражение есть(m-y)*(y-Y)*(Y-m)/2
, но это долго.~
, хорошо - меня раздражал случайный человек : / Я почти уверен, чтоm*y and(m-y)%3*3/2
его тоже можно укоротить, но я провел всю ночь и ничего не получил ... Я вернусь к этому, если я иметь время. Может быть, тот факт, что у меня есть свобода мод 4, может помочь.Сетчатка , 77 байт
Я думал, что воспользуюсь этой возможностью, чтобы показать новую функцию Retina: многоступенчатые петли. Это должно значительно сократить многие задачи (особенно условная замена).
Retina - это мой собственный язык программирования на основе регулярных выражений. Исходный код может быть сгруппирован по этапам: каждый этап состоит из двух строк, где первая содержит регулярное выражение (и, возможно, некоторую конфигурацию), а вторая строка является строкой замены. Затем этапы применяются к STDIN по порядку, а окончательный результат выводится на STDOUT.
Вы можете использовать вышеперечисленное непосредственно в качестве исходного файла с параметром
-s
командной строки. Тем не менее, я не считаю переключение, потому что вы также можете просто поместить каждую строку в отдельный файл (тогда вы потеряете 15 байтов для новых строк, но добавите +15 для дополнительных файлов).объяснение
Новым в этом решении является
)
предпоследняя стадия. Это закрывает многоступенчатый цикл. Нет соответствия(
, что означает, что цикл неявно начинается на первом этапе. Следовательно, первые 7 этапов повторяются до тех пор, пока полный проход через все 7 из них не перестанет изменять результат. Эти 7 этапов просто выполняют различные преобразования, которые постепенно уменьшают количество матриц в строке и объединяют фазы. Как только мы достигаем конечного результата, ни один из семи шаблонов больше не совпадает, и цикл заканчивается. После этого мы добавляем 0, если в результате еще нет цифры (поскольку на предыдущих этапах просто отбрасываются все идентификаторы, включая результат).Вот что делают отдельные этапы:
Объединяет все пары
i
в,-
чтобы уменьшить фазу символов.Теперь, если осталось два последовательных идентичных символа, это либо одна,
--
либо две идентичные матрицы. В любом случае, умножение их дает идентичность. Но нам не нужны идентификаторы, поэтому мы просто удаляем их все, а также явные идентификаторы0
. Этот этап повторяется сам по себе,+
пока результат не перестанет меняться. Это гарантирует, что такие вещи, как,123321
будут решены полностью, так что следующий шаг может предполагать, что все пары цифр различны.На самом деле это две отдельные трансформации в одну (для гольфа). Обратите внимание, что если первая альтернатива совпадает
$2
и$3
пуста, а вторая$1
- пуста. Так что это можно разложить на эти два шага:Это просто меняет все пары цифр и добавляет знак минус. Так как мы удалили все
0
с и все одинаковые пары, то это будет соответствовать только12
,23
,31
,21
,32
,13
. Этот шаг может показаться странным, но он позволяет мне проверить только половину этих случаев позже, потому что те, которые я не могу обработать, будут заменены здесь на следующей итерации.Другая часть вышеупомянутой стадии была:
Это постепенно перемещает
-
знаки полностью влево (одна позиция на итерацию). Я делаю это так, что в конечном итоге они все рядом и решаются на более раннем этапе.Эти три этапа теперь просто разрешают три пары продуктов. Как я уже говорил выше, это отловит только половину соответствующих случаев, но другая половина будет учтена на следующей итерации, после того как на предыдущем шаге поменялись местами все пары.
Это последний этап цикла. Это похоже на тот, который сдвигается
-
влево, за исключениемi
. Основное отличие состоит в том, что этот обменi
только с цифрами. Если бы я использовал(.)i
тогда, в случаях, когда я получаю a-i
илиi-
два, меняли местами бесконечно, и программа не заканчивалась. Так что это только меняет их справа от-
знаков. Этого достаточно - пока все-
иi
появляются вместе в какой-то момент, они могут быть решены правильно.Последний шаг (вне цикла). Помните, что мы всегда удаляли все идентификаторы, поэтому, если результат фактически является идентификатором (умноженным на фазу), у нас больше не будет требуемой цифры в выводе, поэтому мы добавляем ее обратно.
В качестве примера, вот все промежуточные формы
0223202330203313021301011023230323
(этапы пропуска, которые не вносят никаких изменений):источник
CJam,
5856 байтЯ уверен, что это может быть много в гольфе, но здесь это идет:
Попробуйте онлайн здесь или запустите полный пакет здесь
источник