Стохастическая матрица является матрицей вероятностей , используемых в контексте цепей Маркова.
Правая стохастическая матрица представляет собой матрицу , где каждая строка суммы в 1
.
Влево стохастическая матрица представляет собой матрицу , где каждый столбец суммы в 1
.
Дважды стохастическая матрица представляет собой матрицу , где каждая строка и каждый столбец сумм к 1
.
В этой задаче мы будем представлять вероятности в процентах, используя целые числа . В этом случае строка или столбец должны быть суммами, 100
а не суммой 1
.
Ваша цель состоит в том, чтобы написать программу или функцию, которая, учитывая квадратную матрицу целых чисел в качестве входных данных, выводит одно из четырех значений, указывающих, что матрица является либо стохастической справа, либо стохастической слева, либо стохастической с двойной точностью, либо ни одной из них.
вход
Вы можете использовать любое правильное представление матрицы, которое является естественным для вашего языка для ввода. Например, список списков, строка значений, разделенных запятыми, со строками, разделенными переносами строк и т. Д.
Входная матрица всегда будет квадратной и будет содержать только неотрицательные целые числа. Входная матрица всегда будет как минимум 1×1
.
Вы можете передать ввод, используя STDIN
аргумент функции или что-то подобное.
Выход
Вы должны выбрать четыре различных выхода, которые соответствуют правому стохастику , левому стохастику , дважды стохастическому или ни одному из них . Эти выходы должны быть постоянными независимо от того, какой вход передается. Ваша программа может не возвращать разные выходные данные для одного и того же случая, например, говоря, что любое отрицательное число не соответствует ни одному из этих случаев. , недопустимо.
Короче говоря, между выходными данными и четырьмя возможными случаями должно быть соответствие 1: 1. Некоторые примеры этих четырех выходов будут {1, 2, 3, 4}
или {[1,0], [0,1], [1,1], [0,0]}
или даже {right, left, doubly, none}
.
Пожалуйста, укажите в своем ответе четыре выхода, которые использует ваша программа.
Если матрица является дважды стохастической, то вы должны вернуть результат, соответствующий дважды стохастическому, а не правому или левому стохастику.
Вы можете распечатать вывод STDOUT
, вернуть его из функции или чего-либо подобного.
Контрольные примеры
[100] => Doubly stochastic
[42] => None of those
[100 0 ] => Doubly stochastic
[0 100]
[4 8 15]
[16 23 42] => Left stochastic
[80 69 43]
[99 1 ] => Right stochastic
[2 98]
[1 2 3 4 ]
[5 6 7 8 ] => None of those
[9 10 11 12]
[13 14 15 16]
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Ответы:
05AB1E ,
131110 байтСтохастик справа: Стохастик
[0,1]
слева : Стохастик
[1,0]
вдвойне:
[1,1]
Ни один из них:
[0,0]
Попробуйте онлайн!
объяснение
источник
Haskell,
5755 байтВвод типа
(Eq a, Num a) => [[a]]
. Вывод логического списка[left-stochastic, right-stochastic]
Спасибо @proudhaskeller за сохранение 2 байта
источник
[transpose,id]<*>
(тогда вы могли бы опустить, такs a=
как разрешены любые функции)[transpose,id]<*>
имеет тип[[[a]]]->[[[a]]]
, который нуждается в другом слоеmap
иpure
/return
/(:[])
или вводе типа [[[Int]]], которая не является естественным. Лучшее, что я получилmap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
вместоall(==100).map sum
?all
делает отображение в себе.R, 55 байт
Безымянная функция, где
m
предполагается R-матрица.Выход:
[1] TRUE FALSE
: Левый стохастик[1] FALSE TRUE
: Правильный стохастик[1] TRUE TRUE
: Вдвойне[1] FALSE FALSE
: Никтоисточник
any(colSums(m)-100)
и аналогичным образом,rowSums
при сбросе всех выходных данных вы потеряете два байта, поэтому, если вы хотите сохранить их, вы всегда можете поставить!
перед-1
байтом нетто .Октава,
35343231 байтНазовите это так:
Проверьте это здесь.
Изначально, благодаря flawr, сэкономили 2 байта, но выбрали другой подход, который был на 1 байт короче.
Это выводит следующее для разных случаев:
Последнее
,2
было бы ненужным, если бы не были включены однозначные цифры. Кроме того, если бы это суммировалось1
вместо100
(как могло бы быть), это сохраняло бы другие4
байты.источник
Mathematica 29 байт
заменяя символ U = U + F3C7 = [\ Transpose]. Этот фрагмент кода будет правильно вставлен в Mathematica.
То же соглашение об истинности с {lefttruth, righttruth} как выход
источник
{}⋃
сохраняет один байтUnion@
Total@
наTr/@
сэкономит еще 2 байта.{}⋃Tr/@#=={100}&/@{#,#}&
k,
2119 байтовВыход
00b
никто10b
слева01b
правильно11b
и то и другоеПример:
редактировать: уменьшить количество байтов на 3 - функция не должна быть заключена в лямбду
редактировать: уменьшить счет на 2 - H / T @Simon Major
источник
MATL , 12 байт
Выход - два ноль / одно значение. Первый указывает, является ли матрица лево-стохастической, второй - если она стохастическая.
Попробуйте онлайн! Или проверьте все тестовые случаи
источник
Mathematica,
4643 байтаКак и с другими ответами, результаты
{False, False}
для нестохастических{True, False}
для левой стохастики{False, True}
для правильного стохастика{True, True}
для дважды стохастическогоСохранено 3 байта путем переключения на операторную форму
AllTrue
источник
\[Transpose]
�
было менее поучительно@
в концеPHP, 104 байта
Анонимная функция, которая отображает 0 => оба, 1 => слева, 2 => справа, 3 => ни того, ни другого.
Используйте как:
Версия программы командной строки в 114 байтов:
Используется как:
источник
Python 2,
7064 байтаВ этом нет ничего сумасшедшего, просто использование сплаттинга
zip
для транспонирования матрицы :) Выводы следующие:А вот и код :)
источник
splat
оператор :) По сути, это то, что позволяет мне транспонировать матрицу :)C #,
205203183 байтаGolfed:
Разоблаченный с комментариями:
Выходной ключ: 1 - правый стохастик 2 - левый стохастик 3 - двойной стохастик 4 - нет
Попробуйте это: http://rextester.com/PKYS11433
EDIT1:
r=0;c=0;
=>r=c=0;
EDIT2: вложенные троичные операторы. Кредиты идут в @ Йодле.
источник
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Посколькуe
иw
может быть только 1 или 0, его можно изменитьreturn w<<1|e;
и переопределить none == 0.if
операторов в троичные операции и просто вернете целое число в конце. Не знаю, если я должен опубликовать свое решение, так как оно очень похоже.JavaScript (ES6), 83 байта
Наоборот, это не только выводит правосторонний стохистический результат слева, но и логические значения также инвертируются, поэтому вывод
[false, true]
все еще означает правостороннюю стохистику.источник
C # 6, 130 байт
{False, False}
для нестохастического{True, False}
для левого стохастического{False, True}
для правого стохастического{True, True}
для дважды стохастическогоrepl.it demo
Ungolfed
источник
Groovy, 57
Выход
[0,0]
если нет.[1,0]
если правильно.[0,1]
если ушел.[1,1]
если оба.источник
Пип , 17 байт
В неожиданном повороте это представление является функцией.
Возвращает список из двух
0
/1
значений:[0 0]
= не стохастический[0 1]
= влево стохастический[1 0]
= правые стохастической[1 1]
= бистохастический. Попробуйте онлайн!объяснение
источник
Дьялог АПЛ , 16 байт
{∧/100=+/↑⍵(⍉⍵)}
{ }
прямое определение функции (он же "dfn"),⍵
является аргументом⍵(⍉⍵)
матрица наряду с ее транспозицией↑
смешать их в один массив 2 × n × n+/
сумма по последней оси, получить матрицу 2 × n100=
какие элементы равны 100 (логические 0 0)∧/
«и» -редукция по последней оси, получить 2 логических значения для левой, правой стохастическойисточник
С ++ 14,
139136133130 байт-3 байта для
s=M.size()
, -3 байта для возврата по ссылочному параметру, -3 байта для безымянной лямбдыПредполагается, что ввод будет похож
vector<vector<int>>
. Возвращает 3,2,1,0 для дважды, слева, справа, без стохастики.Ungolfed:
источник