Данный вектор n
значений (x1,x2,x3,...,xn)
возвращает определитель соответствующей матрицы Вандермонда .
Этот определитель может быть записан как:
Детали
Ваша программа / функция должна принимать список чисел с плавающей запятой в любом удобном формате, который допускает переменную длину, и выводить указанный определитель.
Вы можете предположить, что вход и выход находятся в диапазоне значений, поддерживаемых вашим языком. Если ваш язык не поддерживает числа с плавающей запятой, вы можете использовать целые числа.
Некоторые тестовые случаи
Обратите внимание, что всякий раз, когда есть два равных элемента, определитель будет таким, 0
как есть две равные строки в соответствующей матрице Вандермонда. Спасибо @randomra за указание на этот пропущенный тестовый пример.
[1,2,2,3] 0
[-13513] 1
[1,2] 1
[2,1] -1
[1,2,3] 2
[3,2,1] -2
[1,2,3,4] 12
[1,2,3,4,5] 288
[1,2,4] 6
[1,2,4,8] 1008
[1,2,4,8,16] 20321280
[0, .1, .2,...,1] 6.6586e-028
[1, .5, .25, .125] 0.00384521
[.25, .5, 1, 2, 4] 19.3798828
[1,2,2,3] => 0
два равных элемента в массиве, чтобы проверить, проверяет ли код self-разность (xi-xi
), просто сравнивая с0
.Ответы:
Желе, 6 байт
œc2
получает все комбинации без замены длины 2.I
вычисляет список различий каждой из этих пар, получая список вроде[[1], [2], [3], ..., [1]]
. МыF
латентно и беремP
продукт.Попробуй это здесь!
источник
Рубин,
4947 байтЭто лямбда-функция, которая принимает вещественный одномерный массив и возвращает число с плавающей запятой или целое число в зависимости от типа ввода. Чтобы вызвать его, назначьте его переменной, затем выполните
f.call(input)
.Мы получаем все комбинации размера 2
.combination(2)
и получаем различия для каждой пары.map {|a, b| b - a}
. Мы объединяем полученный массив в строку, разделенную*
, затемeval
this, которая возвращает продукт. Если вход имеет длину 1, это будетnil
плохо, что в Ruby неверно, поэтому мы можем просто||1
в конце вернуть 1 в этой ситуации. Обратите внимание, что это все еще работает, когда продукт равен 0, потому что по любой причине 0 является правдивым в Ruby.Проверьте все тестовые примеры онлайн
Сохранено 2 байта благодаря Doorknob!
источник
Mathematica, 30 байт
Это анонимная функция.
Расширена Mathematica, это эквивалентно
(1 ##1 & ) @@ Apply[#2 - #1 & , Subsets[#1, {2}], {1}] &
.1##&
является эквивалентом дляTimes
(страница с благодарностями), которая применяется к каждой отдельной паре элементов из входного списка, созданного с помощьюSubsets[list, {2}]
. Обратите внимание, чтоSubsets
не проверяет уникальность элементов.источник
J, 13 байт
Это монадическая функция, которая принимает массив и возвращает число. Используйте это так:
объяснение
Я явно строю матрицу Вандермонда, связанную с входным массивом, а затем вычисляю ее определитель.
источник
.
также является символом-модификатором. То же самое само:
по себе.∘
), как при наброске с J ... Невероятно перегруженный.
и:
(который опять-таки визуально совпадает с двумя стопками.
) затрудняет чтение J (для меня). Тем более, когда пробелы рядом с точками определяют смысл!.
Символ J должен быть самым перегруженным символом за всю историю вычислений: я считаю 53 различных значения.
и 43 (61, если считать все_9:
до9:
) различных значений:
. Yukk. ;-)МАТЛ , 9
Попробуйте онлайн!
Это вычисляет матрицу всех различий, а затем сохраняет только часть ниже главной диагонали, делая другие записи,
1
чтобы они не влияли на продукт. Нижняя треугольная функция делает ненужными элементы0
, а не1
. Итак, вычитаем1
, берем нижнюю треугольную часть и добавляем1
обратно. Тогда мы можем взять произведение всех записей.источник
2Xn!dp
кажется, работает только с единичными значениями, когда значение больше или равно 2 ... Я написал это сам, пытаясь обыграть Jelly: PXn
делаете чек вродеif size(arg) == [1,1] ...
или что-то в этом роде. Мне лень искать источник, но (надеюсь) это не должно быть так сложно.1
или,0
и тогда не имеет значения, интерпретируется ли первый вход как массив или как число. Реальная проблема в том, что второй вход не может превышать размер массива. Msgstr "Сколько есть способов выбрать 2 элемента из 1 элемента". В этом случае разница между массивом и числом имеет значение: если первым вводом является возврат массива[]
(пустой массив), если это возврат числа0
. Я думаю, что я вернусь[]
, потому что тогдаp
заставляет другую интерпретациюPyth,
15131211 байтСпасибо @FryAmTheEggman и @ Pietu1998 за каждый байт!
источник
Mathematica, 32 байта
Я был удивлен, что не нашел встроенного для вещей Вандермонда. Возможно потому, что так легко сделать это самому.
Этот явно конструирует транспонирование ВМ и принимает его определитель (который, конечно, такой же, как и у оригинала). Этот метод оказался значительно короче, чем использование любой формулы, которую я знаю.
источник
Haskell, 34 байта
Рекурсивное решение. Когда перед элементом
h
добавляется новый элемент , выражение умножается на произведениеx-h
для каждого элементаx
списка. Спасибо Згарбу за 1 байт.источник
Matlab, 26 байт
(Неконкурирующий)
Простое использование встроенных функций. Обратите внимание, что (еще раз) Matlab's
vander
создает матрицы Вандермонда, но с измененным порядком строк.источник
Ржавчина, 86 байт
Ржавчина, многословно как обычно ...
Объяснение придет позже (хотя это довольно просто).
источник
Perl, 38
41байтВключить +1 для
-p
Дайте числа в строке на STDIN. Так, например, запустить как
Используйте злое регулярное выражение, чтобы получить двойной цикл:
vandermonde.pl
:источник
JavaScript (ES6), 61 байт
Я попытался понять массив (Firefox 30-57), и он был на 5 байт длиннее:
Скучная вложенная петля, вероятно, короче.
источник
Haskell, 53 байта
Пример использования:
f [1,2,4,8,16]
->20321280
.Пройдите через индексы
j
иi
вложенный цикл и составьте список различий элементов в положенииj
иi
. Сделайте произведение всех элементов в списке.Другие варианты, которые оказались немного длиннее:
f x=product[last l-i|l<-scanl1(++)$pure<$>x,i<-init l]
54 байтаimport Data.List;f i=product[y-x|[x,y]<-subsequences i]
55 байтисточник
CJam, 16 байтов
В ответ на сообщение Симмонса , несмотря на отсутствие в CJam оператора комбинаций, да, это можно сделать лучше :)
-1 байт благодаря @ MartinBüttner.
Попробуй это онлайн | Тестирование
источник
CJam, 32 байта
Я уверен, что кто-то может сыграть в эту игру лучше в CJam ... Основная проблема в том, что я не вижу хорошего способа получить подмножества, которые бы использовали большинство моих байтов. Это генерирует набор мощности (используя идею Мартина Бюттнера), а затем выбирает элементы длины 2.
источник
R , 41 байт
Попробуйте онлайн!
Я был удивлен, что не увидел ответ R здесь!
источник
Perl 5
-pa
, 36 байтПопробуйте онлайн!
источник