Вызов
Учитывая левую или правую стохастическую матрицу, где предел при x приближается к бесконечности матрицы, а степень x приближается к матрице со всеми конечными значениями, возвращает матрицу, к которой сходится матрица. По сути, вы хотите продолжать умножать матрицу на себя, пока результат больше не изменится.
Тестовые случаи
[[7/10, 4/10], [3/10, 6/10]] -> [[4/7, 4/7], [3/7, 3/7]]
[[2/5, 4/5], [3/5, 1/5]] -> [[4/7, 4/7], [3/7, 3/7]]
[[1/2, 1/2], [1/2, 1/2]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/3, 2/3], [2/3, 1/3]] -> [[1/2, 1/2], [1/2, 1/2]]
[[1/10, 2/10, 3/10], [4/10, 5/10, 6/10], [5/10, 3/10, 1/10]] -> [[27/130, 27/130, 27/130], [66/130, 66/130, 66/130], [37/130, 37/130, 37/130]]
[[1/7, 2/7, 4/7], [2/7, 4/7, 1/7], [4/7, 1/7, 2/7]] -> [[1/3, 1/3, 1/3], [1/3, 1/3, 1/3], [1/3, 1/3, 1/3]]
правила
- Применяются стандартные лазейки
- Вы можете выбрать, хотите ли вы матрицу справа или слева стохастик
- Вы можете использовать любой разумный тип чисел, такой как числа с плавающей точкой, рациональные числа, десятичные числа с бесконечной точностью и т. Д.
- Это код-гольф , поэтому самая короткая подача в байтах для каждого языка объявляется победителем для его языка. Ответ не будет принят
Ответы:
R ,
4443 байтаПопробуйте онлайн!
Просто продолжайте умножать, пока не найдете фиксированную матрицу. Видимо
X!=(X=X%*%m)
делает сравнение, затем переназначаетX
, так что это аккуратно.Спасибо @Vlo за сбривание байта; даже если вычеркнуто 44 все еще регулярно 44.
источник
function(m){ while(any(m!=(m=m%*%m)))0 m}
не работает. Числовые неточности, препятствующие запуску условия завершения?Октава ,
454235 байтПопробуйте онлайн!
Благодаря Giuseppe удалось сэкономить 3 байта, а еще Луиса Мендо - еще 7!
При этом используется, что собственный вектор, соответствующий собственному значению 1 (также максимальному собственному значению), является вектором столбца, который повторяется для каждого значения ограничивающей матрицы. Мы должны нормализовать вектор, чтобы иметь сумму 1, чтобы он был стохастическим, затем мы просто повторяем его, чтобы заполнить матрицу. Я не слишком хорошо разбираюсь в игре в гольф в Octave, но мне не удалось найти функциональный способ повторного умножения, и полная программа кажется, что она всегда будет длиннее этой.
Мы можем использовать,
any(A)
так как из ограничений мы знаем, что матрица должна описывать неприводимую цепь Маркова, и поэтому каждое состояние должно быть достижимым из других состояний. Поэтому хотя бы одно значение в каждом столбце должно быть ненулевым.источник
eigs
всегда вернуть собственный вектор, соответствующий1
? Моя память о цепях Маркова немного размыта.eigs
возвращается, начиная с наибольшего собственного значения. Также спасибо за гольф!Wolfram Language (Mathematica) , 14 байтов
Выходное число плавает:
Попробуйте онлайн!
Wolfram Language (Mathematica) , 30 байтов
Выходные доли:
Попробуйте онлайн!
источник
Желе , 6 байт
Это полная программа.
Попробуйте онлайн!
источник
APL (Дьялог) ,
186 байтов12 байтов сохранено благодаря @ H.PWiz
Попробуйте онлайн!
источник
+.×⍨⍣≡
для 6 байтов. То есть квадрат пока ничего не изменитсяк / кв, 10 байт
k / q потому что программа идентична на обоих языках. Код действительно просто идиоматический к / к.
объяснение
{..}
вне лямбда-синтаксиса, сx
неявным параметром$[x]
имеет $ как оператор умножения двоичной матрицы, при условии, что только один параметр создает унарный оператор, который умножается на матрицу Маркова/[x]
применяет левое умножение до сходимости, начиная с самого x.источник
C (gcc) ,
207192190181176 байт + 2 байта флага-lm
пятнадцать,семнадцать,двадцать два байта, благодаря floorcat .return A;
.Попробуйте онлайн!
источник
Python 3 ,
7561 байтПопробуйте онлайн!
В тестовых случаях есть неточности с плавающей точкой, поэтому значения могут немного отличаться от точных дробей.
PS.
numpy.allclose()
используется потому, чтоnumpy.array_equal()
длиннее и склонен к неточностям.-14 байт Спасибо HyperNeutrino;) О да, я забыл оператор @; P
источник
dot
вместоmatmul
: Dx=n@n
: P tio.run/…f=
на фронт, потому что это рекурсивно называется;)Java 8,
356339 байт-17 байт благодаря @ceilingcat .
Определенно не правильный язык .. Черт с плавающей точкой точности ..
Объяснение:
Попробуйте онлайн.
источник
float
/double
не имеют надлежащей точности с плавающей запятой,java.math.BigDecimal
следует использовать вместо этого. И вместо того , чтобы просто+-*/
, BigDecimals использовать.add(...)
,.subtract(...)
,.multiply(...)
,.divide(...)
. Так что так просто, как7/10
становитсяnew BigDecimal(7).divide(new BigDecimal(10))
. Кроме того, значения,scale,RoundingMode
individe
необходимы для значений с «бесконечными» десятичными значениями (например,1/3
быть0.333...
). Основной метод, конечно, можно использовать в гольфе, но я не стал беспокоиться, когда выполнил поиск и замену, чтобы преобразовать поплавки в BigDecimals.