Учитывая целочисленный массив по крайней мере из двух элементов, выведите Matrix-Vector (определенный ниже) массива.
Чтобы вычислить Matrix-Vector , сначала поверните массив n
ввода размера, чтобы создать матрицу размера.n x n
, , причем первый элемент массива следует за главной диагональю. Это формирует матричную часть. Для вектора переверните входной массив по вертикали. Затем выполните нормальное матричное умножение. Выходной вектор является результатом.
Например,
a = [1, 2, 3]
Сначала поверните массив два раза вправо, чтобы получить, [3, 1, 2]
а [2, 3, 1]
затем сложите их, чтобы сформировать 3x3
матрицу
[[1, 2, 3]
[3, 1, 2]
[2, 3, 1]]
Затем переверните массив вертикально, чтобы сформировать вектор
[[1, 2, 3] [[1]
[3, 1, 2] x [2]
[2, 3, 1]] [3]]
Выполнить обычное матричное умножение
[[1, 2, 3] [[1] [[1+4+9] [[14]
[3, 1, 2] x [2] = [3+2+6] = [11]
[2, 3, 1]] [3]] [2+6+3]] [11]]
И вывод - [14, 11, 11]
или [[14], [11], [11]]
(на ваш выбор, является ли он плоским или нет).
Пример № 2
a = [2, 5, 8, 3]
[[2, 5, 8, 3] [[2] [[4+25+64+9] [[102]
[3, 2, 5, 8] x [5] = [6+10+40+24] = [80]
[8, 3, 2, 5] [8] [16+15+16+15] [62]
[5, 8, 3, 2]] [3]] [10+40+24+6]] [80]]
[102, 80, 62, 80]
правила
- Можно предположить, что ввод и вывод соответствуют целочисленному типу вашего языка.
- Вход и выход могут быть предоставлены в любом удобном формате .
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
источник
(v*2)[i+j]
хороший трюкPyth , 10 байт
Тестовый пакет .
источник
Желе , 9 байт
Попробуйте онлайн!
Функция, которая возвращает вертикальный массив. Как полная программа, она выглядит так, как будто она возвращает горизонтальный массив. Чтобы вернуть горизонтальный массив, вы должны сделать
LḶN⁸ṙ×⁸S€
вместо этого.источник
05AB1E , 11 байт
Попробуйте онлайн!
источник
Haskell , 49 байтов
Попробуйте онлайн!
Для входа
v=[1,2]
iterate tail$v++v
выдает список[[1,2,1,2],[2,1,2],[1,2],[2],[],...]
fst<$>zip l v
так же, какtake(length v)l
и дает[[1,2,1,2],[2,1,2]]
sum.zipWith(*)v
отображается на каждый элемент и дает векторное матричное произведение.источник
fst<$>zip l v
очень нравитсяR ,
6662 байтПопробуйте онлайн!
источник
Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)
на 3 байта короче; он просто возвращает список матриц.for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i]
составляет 61 байт без возврата странного формата вывода.Mathematica, 35 байт
Попробуйте онлайн!
-9 байт из @Not дерева
источник
Most@FoldList[RotateRight,#,1^#].#&
. (Но хороший трюк, использующийFold
вместоNest
!)CJam , 17 байт
Попробуйте онлайн!
источник
GolfScript , 37 байт
Попробуйте онлайн!
источник
Python 3 + NumPy , 68 байт
Попробуйте онлайн!
источник
J , 14 байт
Попробуйте онлайн!
объяснение
источник
1&|.
связаны1
с|.
созданием монады? но затем вы используете эту монаду как с левым, так и с правым аргументом, причем левый определяет, сколько раз он был применен. Что тут происходит?&
. Когда используется какu n&f v
, он выполняет(n&f)^:u v
. Смотрите дно связи, чтобы увидеть больше разборов этого.#\.|."{]
, но я опубликовал самое короткое, которое придумал, прежде чем пробовать альтернативы.APL, 17 байт
Объяснение:
источник
Октава , 34 байта
Попробуйте онлайн!
источник
Haskell ,
565552 байтаПопробуйте онлайн!
Сохранено один байт благодаря @Laikoni
Сохранено три байта:
l++l
вместоcycle l
источник
zipWith(*)l$drop i$cycle l
.Шелуха , 11 байт
Попробуйте онлайн!
объяснение
источник
Октава -
6748 байтСпасибо Луису Мендо за сокращение этого кода на 19 байт!
Примечание: этот код может работать только в октаве. MATLAB не поддерживает выражения внутри функций, которые могут создавать переменные, одновременно оценивая выражения, которые их создают.
Оригинальный код в MATLAB можно найти здесь, но можно запустить в любой версии MATLAB. Этот код составляет 67 байт:
объяснение
a=input('');
- Получает (строки) вектор от пользователя через стандартный ввод. Вы должны ввести вектор в форме октавы (т.е.[1,2,3]
).n=numel(...);
- Получает общее количество элементов во входном векторе.x=0:n-1
- Создает вектор строки, который увеличивается от0
доn-1
с шагом 1.(x=0:n-1)-x'
- Выполняет вещание так, чтобы у нас былаn x n
матрица, чтобы каждая строкаi
представляла собой элементы от 0 доn-1
каждого элемента в строке,i
вычитаемой изi
.mod(..., n)+1
- Гарантирует, что любые отрицательные значения обернутыn
так, чтобы каждая строкаi
содержала вектор от 0 доn-1
кругового смещения влево наi
элементы. Мы добавляем 1, когда MATLAB / Octave начинает индексировать векторы или матрицы с 1.a(...)
- Создаетn x n
матрицу, где используя (4), мы получаем правильные индексы входного вектора, продиктованного каждым значением из (4), таким образом, получая матрицу, которая нам нужна.(...)*a'
- Выполняет умножение вектора матрицы путем транспонирования / переворачивания,a
чтобы стать вектором столбца перед выполнением умножения.Примеры запусков
Попробуйте онлайн!
источник
bsxfun
. Определениеn
без-1
сохранения также экономит несколько байтов. А если вы ограничитесь Octave, вы можете назначитьa
и0:n
переменным на лету и сохранить еще немного . Кроме того, приходите сюда чаще! :-Dinput
функции также является хорошим трюком. Я не думаю, что это может поддержать это. Я видел это только в C или C ++ из моего собственного опыта. Благодарность!Javascript 79 байт
Принимает входной массив и выводит массив матричного вектора
объяснение
источник
Clojure, 80 байт
iterate
производит бесконечную последовательность, но вместо использования,(take (count %) (iterate ...))
чтобы остановить ее, я использую%
в качестве дополнительного аргументаmap
.источник
Perl 5 , 65 + 1 (-a) = 66 байт
Попробуйте онлайн!
Принимает входной вектор как разделенные пробелом числа. Выводит разделенные строкой числа, представляющие вектор результата.
источник
C (gcc) , 126 байтов
Попробуйте онлайн!
Массив может быть представлен на входе указателем и длиной.
источник
Common Lisp, 78 байт
Попробуйте онлайн!
Удвойте массив (в данном случае список Lisp) и выполните итерации по спискам с
i
помощью (используяx
, черезy
, чтобы остановить итерацию). Затем вычислите следующий элемент результата, суммируя результат умножения каждого элемента наx
каждый элементi
(снова останавливаясь, когда более короткий список заканчивается).источник