Stochastyczny macierzy jest macierz prawdopodobieństw stosowane w kontekście łańcuchów Markowa.
Prawo stochastyczny matryca jest matrycą w którym każdy rząd z sumy 1
.
Opuścił matrycę stochastyczne jest macierzą gdzie każda kolumna do sumy 1
.
Podwójnie stochastyczny macierz jest macierzą, gdzie każdy rządek oraz każda kolumienka kwot 1
.
W tym wyzwaniu będziemy reprezentować prawdopodobieństwa w procentach przy użyciu liczb całkowitych . W takim przypadku wiersz lub kolumna musi być sumą do, 100
a nie sumą 1
.
Twoim celem jest napisanie programu lub funkcji, która, biorąc pod uwagę kwadratową macierz liczb całkowitych jako dane wejściowe, wyprowadza jedną z czterech wartości wskazujących, że macierz jest albo prawa stochastyczna, lewa stochastyczna, podwójnie stochastyczna lub żadna z nich.
Wkład
Do wprowadzenia możesz użyć dowolnej właściwej reprezentacji macierzy naturalnej dla twojego języka. Na przykład lista list, ciąg wartości oddzielonych przecinkami z wierszami oddzielonymi podziałami wierszy itp.
Matryca wejściowa zawsze będzie kwadratowa i będzie zawierać tylko nieujemne liczby całkowite. Matryca wejściowa zawsze będzie co najmniej 1×1
.
Możesz przekazać dane wejściowe, używając STDIN
jako argumentu funkcji lub czegoś podobnego.
Wydajność
Musisz wybrać cztery różne wyniki, które odpowiadają prawemu stochastycznemu , lewemu stochastycznemu , podwójnie stochastycznemu lub żadnemu z nich . Wyjścia te muszą być stałe niezależnie od przekazywanych danych wejściowych. Twój program może nie zwracać różnych wyników dla tego samego przypadku, np. Mówiąc, że jakakolwiek liczba ujemna nie odpowiada żadnej z tych wartości, jest niepoprawna.
Krótko mówiąc, musi być korespondencja 1 do 1 między twoimi wynikami a czterema możliwymi przypadkami. Niektóre przykłady tych czterech wyjść byłoby {1, 2, 3, 4}
albo {[1,0], [0,1], [1,1], [0,0]}
nawet {right, left, doubly, none}
.
Proszę wskazać w swojej odpowiedzi cztery wyjścia, z których korzysta program.
Jeśli macierz jest podwójnie stochastyczna, musisz zwrócić wynik odpowiadający podwójnie stochastycznemu, a nie prawemu lub lewemu stochastycznemu.
Możesz wydrukować dane wyjściowe STDOUT
, zwrócić je z funkcji lub coś podobnego.
Przypadki testowe
[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]
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
05AB1E ,
131110 bajtówPrawa stochastyczna:
[0,1]
Lewa stochastyczna:
[1,0]
Podwójnie stochastyczna:
[1,1]
Żadna z tych:
[0,0]
Wypróbuj online!
Wyjaśnienie
źródło
Haskell,
5755 bajtówPodanie typu
(Eq a, Num a) => [[a]]
. Wyświetla listę wartości logicznych[left-stochastic, right-stochastic]
Dzięki @proudhaskeller za oszczędność 2 bajtów
źródło
[transpose,id]<*>
(wtedy można pominąć,s a=
ponieważ dozwolone są funkcje anynomiczne)[transpose,id]<*>
nie typu[[[a]]]->[[[a]]]
, co wymaga jeszcze warstwęmap
ipure
/return
/(:[])
lub wejście typu [[[Int]]], który nie jest naturalnie. Najlepsze, co mam, tomap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
zamiastall(==100).map sum
?all
wykonuje samo mapowanie.R, 55 bajtów
Funkcja bez nazwy, gdzie
m
przyjmuje się, że jest to macierz R.Wydajność:
[1] TRUE FALSE
: Lewy stochastyczny[1] FALSE TRUE
: Prawo stochastyczny[1] TRUE TRUE
: Podwójnie[1] FALSE FALSE
: Żadenźródło
any(colSums(m)-100)
i podobnie dorowSums
zrzuci dwa bajty podczas odwracania wszystkich danych wyjściowych, więc jeśli chcesz je zachować, zawsze możesz umieścić z!
przodu-1
bajt netto .Oktawa,
35343231 bajtówNazwij to tak:
Sprawdź to tutaj.
Początkowo zapisałem 2 bajty dzięki flawr, ale wybrałem inne podejście, które było o 1 bajt krótsze.
To daje następujące wyniki dla różnych przypadków:
Ostatni
,2
byłby niepotrzebny, gdyby nie uwzględniono pojedynczych cyfr. Ponadto, jeśli sumuje się to1
zamiast100
(jak mogłoby to mieć), zapisuje kolejne4
bajty.źródło
Mathematica 29 bajtów
podstawianie znaku = U + F3C7 = [\ Transpose]. Ten fragment kodu wklei się poprawnie w Mathematica.
Ta sama konwencja prawdomówności z {lefttruth, righttruth} jako wyjście
źródło
{}⋃
oszczędza jeden bajtUnion@
Total@
goTr/@
spowoduje zapisanie kolejnych 2 bajtów.{}⋃Tr/@#=={100}&/@{#,#}&
k,
2119 bajtówWydajność
00b
Żaden10b
lewo01b
dobrze11b
obiePrzykład:
edycja: zmniejsz liczbę bajtów o 3 - funkcja nie musi być zawarta w lambda
edycja: zmniejsz liczbę bajtów o 2 - H / T @Simon Major
źródło
MATL , 12 bajtów
Wyjście to dwie wartości zero / jeden. Pierwszy wskazuje, czy matryca jest lewostochastyczna, a drugi, jeśli jest prawoskrętna.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe
źródło
Mathematica,
4643 bajtyPodobnie jak w przypadku innych odpowiedzi, wyniki są
{False, False}
dla niestochastycznych{True, False}
dla lewoskrętnych{False, True}
dla prawej stochastycznej{True, True}
dla podwójnie stochastycznegoZaoszczędzono 3 bajty, przechodząc do postaci operatora
AllTrue
źródło
\[Transpose]
�
to mniej pouczające@
końcu jest też dodatkowyPHP, 104 bajty
Anonimowa funkcja, która echo 0 => oba, 1 => lewy, 2 => prawy, 3 => żaden.
Użyj jak:
Wersja programu wiersza poleceń o długości 114 bajtów:
Używany jak:
źródło
Python 2,
7064 bajtówNie ma tu nic szalonego, tylko splatanie się
zip
do transponowania matrycy :) Wyniki są następujące:A oto kod :)
źródło
splat
operator :) Zasadniczo to pozwala mi transponować matrycę :)C #,
205203183 bajtówGra w golfa:
Niegolfowany z komentarzami:
Klucz wyjściowy: 1 - prawy stochastyczny 2 - lewy stochastyczny 3 - podwójny stochastyczny 4 - brak
Wypróbuj: http://rextester.com/PKYS11433
EDYCJA 1:
r=0;c=0;
=>r=c=0;
EDYCJA 2: Zagnieżdżone operatory trójskładnikowe. Kredyty trafiają do @Yodle.
źródło
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Ponieważe
iw
może mieć tylko 1 lub 0, można go zmienić nareturn w<<1|e;
i ponownie zdefiniować brak == 0.if
instrukcji w operacje trójkowe i po prostu zwrócisz liczbę całkowitą na końcu. Nie wiem, czy powinienem opublikować moje rozwiązanie, ponieważ jest tak podobne.JavaScript (ES6), 83 bajty
Przeciwnie, ten wynik nie tylko daje wynik po prawej stronie stoachistycznej po lewej, ale również booleany są odwrócone, więc wynik
[false, true]
nadal oznacza prawy stoachistyczny.źródło
C # 6, 130 bajtów
{False, False}
dla nie-stochastycznego{True, False}
dla lewego-stochastycznego{False, True}
dla prawego-stochastycznego{True, True}
dla podwójnie stochastycznegorepl.it demo
Bez golfa
źródło
Groovy, 57
Wydajność
[0,0]
jeśli żaden.[1,0]
jeśli dobrze.[0,1]
jeśli pozostanie.[1,1]
Jeśli oba.źródło
Pip , 17 bajtów
W nieoczekiwany zwrot ten przekaz jest funkcją.
Zwraca listę dwóch
0
/1
wartości:[0 0]
= nie stochastyczny,[0 1]
= lewy stochastyczny,[1 0]
= prawy stochastyczny,[1 1]
= podwójnie stochastyczny.Wypróbuj online!Wyjaśnienie
źródło
Dyalog APL , 16 bajtów
{∧/100=+/↑⍵(⍉⍵)}
{ }
⍵
argumentem jest bezpośrednia definicja funkcji (aka „dfn”)⍵(⍉⍵)
matryca obok jej transpozycji↑
zmieszaj je w jedną tablicę 2 × n × n+/
sumując wzdłuż ostatniej osi, uzyskaj macierz 2 × n100=
które elementy to 100 (booleany to 0 1)∧/
„i” - redukcja wzdłuż ostatniej osi, zdobądź 2 booleany dla lewego, prawego stochastycznegoźródło
C ++ 14,
139136133130 bajtów-3 bajty na
s=M.size()
, -3 bajty na powrót przez parametr referencyjny, -3 bajty jako nienazwana lambdaZakłada, że dane wejściowe są podobne
vector<vector<int>>
. Zwraca 3,2,1,0 dla podwójnie, lewo, prawo, brak stochastyczny.Nie golfowany:
źródło