Eine stochastische Matrix ist eine Matrix von Wahrscheinlichkeiten, die im Zusammenhang mit Markov-Ketten verwendet werden.
Eine rechte stochastische Matrix ist eine Matrix, in der jede Zeile summiert 1
.
Eine linke stochastische Matrix ist eine Matrix, in der jede Spalte summiert 1
.
Eine doppelt stochastische Matrix ist eine Matrix, in der sich jede Zeile und jede Spalte summiert 1
.
In dieser Herausforderung werden wir die Wahrscheinlichkeiten in Prozent mit ganzen Zahlen darstellen . In diesem Fall muss eine Zeile oder Spalte die Summe aus 100
und nicht 1
.
Ihr Ziel ist es, ein Programm oder eine Funktion zu schreiben, die bei einer quadratischen Matrix von Ganzzahlen als Eingabe einen von vier Werten ausgibt, die anzeigen, dass die Matrix entweder rechtsstochastisch, linksstochastisch, doppeltstochastisch oder keine davon ist.
Eingang
Sie können für die Eingabe jede geeignete Darstellung einer Matrix verwenden, die für Ihre Sprache natürlich ist. Zum Beispiel eine Liste von Listen, eine Folge von durch Kommas getrennten Werten mit durch Zeilenumbrüchen getrennten Zeilen usw.
Die Eingabematrix ist immer quadratisch und enthält nur nicht negative ganze Zahlen. Die Eingabematrix wird immer mindestens sein 1×1
.
Sie können die Eingabe mit STDIN
, als Funktionsargument oder ähnlichem übergeben.
Ausgabe
Sie müssen vier verschiedene Ausgänge auswählen , die der rechten , der linken , der doppelten oder keiner Stochastik entsprechen . Diese Ausgaben müssen unabhängig von der übergebenen Eingabe konstant sein. Ihr Programm kann möglicherweise keine unterschiedlichen Ausgaben für denselben Fall zurückgeben, z. B. ist die Aussage, dass eine negative Zahl keiner dieser Ausgaben entspricht, ungültig.
Kurz gesagt, es muss eine 1-zu-1-Entsprechung zwischen Ihrer Ausgabe und den vier möglichen Fällen geben. Einige Beispiele für diese vier Ausgänge wären {1, 2, 3, 4}
oder {[1,0], [0,1], [1,1], [0,0]}
oder sogar {right, left, doubly, none}
.
Bitte geben Sie in Ihrer Antwort die vier Ausgänge an, die Ihr Programm verwendet.
Wenn eine Matrix doppelt stochastisch ist, müssen Sie die Ausgabe zurückgeben, die doppelt stochastisch und nicht rechts oder links stochastisch ist.
Sie können die Ausgabe an drucken STDOUT
, von einer Funktion zurückgeben oder etwas Ähnliches.
Testfälle
[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]
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Antworten:
05AB1E ,
131110 BytesRechte Stochastik:
[0,1]
Linke Stochastik:
[1,0]
Doppelte Stochastik:
[1,1]
Keine davon:
[0,0]
Probieren Sie es online!
Erläuterung
quelle
Haskell,
57-55BytesEingabe des Typs
(Eq a, Num a) => [[a]]
. Gibt eine boolesche Liste aus[left-stochastic, right-stochastic]
Vielen Dank an @proudhaskeller für das Speichern von 2 Bytes
quelle
[transpose,id]<*>
(dann könnte man dies a=
als beliebig zulässige Funktionen weglassen )[transpose,id]<*>
hat eine Art[[[a]]]->[[[a]]]
, die ein andere Schicht benötigtmap
undpure
/return
/(:[])
oder einen Eingang des Typs [[[int]]], die nicht natürlich ist. Das Beste, was ich bekommen habe, istmap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
stattall(==100).map sum
?all
macht ein Mapping an sich.R, 55 Bytes
Unbenannte Funktion, bei der
m
angenommen wird, dass es sich um eine R-Matrix handelt.Ausgabe:
[1] TRUE FALSE
: Links stochastisch[1] FALSE TRUE
: Richtig stochastisch[1] TRUE TRUE
: Zweifach[1] FALSE FALSE
: Keinerquelle
any(colSums(m)-100)
und auch für dierowSums
werden Sie zwei Bytes fallen, während Sie alle Ausgänge invertieren. Wenn Sie diese also behalten möchten, können Sie immer ein!
für net-1
byte voranstellen.Oktave,
35343231 BytesNenne es so:
Teste es hier.
2 Bytes wurden zunächst dank flawr eingespart, es wurde jedoch ein um 1 Byte kürzerer Ansatz gewählt.
Dies gibt für die verschiedenen Fälle Folgendes aus:
Der letzte
,2
wäre unnötig, wenn einzelne Ziffern nicht enthalten wären. Wenn dies1
anstelle von100
(wie es hätte sein können) aufsummiert wird , würden weitere4
Bytes gespart .quelle
Mathematica 29 Bytes
Ersetzen des Zeichens = U + F3C7 = [\ Transpose]. Dieses Code-Snippet wird korrekt in Mathematica eingefügt.
Gleiche Wahrheitskonvention mit {lefttruth, righttruth} als Ausgabe
quelle
{}⋃
speichert ein Byte mehr alsUnion@
Total@
durchTr/@
weitere 2 Bytes sparen.{}⋃Tr/@#=={100}&/@{#,#}&
k,
21& ndash; 19 BytesAusgabe
00b
keiner10b
links01b
Recht11b
beideBeispiel:
edit: Bytezahl um 3 reduzieren - Funktion muss nicht in ein Lambda eingeschlossen werden
bearbeiten: bytecount um 2 reduzieren - H / T @Simon Major
quelle
MATL , 12 Bytes
Es werden zwei Null / Eins-Werte ausgegeben. Erstens, wenn die Matrix linksstochastisch ist, zweitens, wenn sie rechtsstochastisch ist.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle
quelle
Mathematica,
4643 BytesWie bei anderen Antworten sind die Ausgaben
{False, False}
für nicht stochastisch{True, False}
für linksstochastisch{False, True}
für rechtsstochastisch{True, True}
für doppelt stochastischEingesparte 3 Bytes durch Umschalten auf die Operatorform von
AllTrue
quelle
\[Transpose]
�
weniger aufschlussreich ist@
am Ende ein ExtraPHP, 104 Bytes
Eine anonyme Funktion, die 0 => beide, 1 => links, 2 => rechts, 3 => weder echos.
Verwenden Sie wie:
Eine Befehlszeilenprogrammversion mit 114 Bytes:
Gebraucht wie:
quelle
Python 2,
7064 BytesHier ist nichts verrücktes, nur das Einspringen
zip
, um die Matrix zu transponieren :) Die Ausgaben sind wie folgt:Und hier ist der Code :)
quelle
splat
Operator :) Im Wesentlichen ist es das, was mich die Matrix transponieren lässt :)C #
205203183 BytesGolf gespielt:
Ungolfed mit Kommentaren:
Ausgabetaste: 1 - rechts stochastisch 2 - links stochastisch 3 - doppelt stochastisch 4 - keine
Probieren Sie es aus: http://rextester.com/PKYS11433
EDIT1:
r=0;c=0;
=>r=c=0;
EDIT2: Verschachtelte ternäre Operatoren. Credits gehen an @Yodle.
quelle
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Dae
undw
nur 1 oder 0 sein können, kann es geändert werdenreturn w<<1|e;
und keine == 0 neu definieren.if
Anweisungen in ternäre Operationen umwandeln und am Ende einfach eine Ganzzahl zurückgeben. Keine Ahnung, ob ich meine Lösung posten soll, da sie so ähnlich ist.JavaScript (ES6), 83 Byte
Um genau zu sein, gibt dies nicht nur das rechte stoachistische Ergebnis auf der linken Seite aus, sondern die Booleschen Werte werden auch invertiert. Eine Ausgabe von
[false, true]
bedeutet also immer noch recht stoachistisch.quelle
C # 6, 130 Bytes
{False, False}
für nichtstochastisch{True, False}
für linksstochastisch{False, True}
für rechtsstochastisch{True, True}
für doppeltstochastischRepl.it Demo
Ungolfed
quelle
Groovy, 57 Jahre alt
Ausgabe
[0,0]
wenn auch nicht.[1,0]
wenn richtig.[0,1]
wenn links.[1,1]
wenn beides.quelle
Pip , 17 Bytes
In einer unerwarteten Wendung ist diese Vorlage eine Funktion.
Gibt eine Liste mit zwei
0
/1
Werten zurück:[0 0]
= nicht stochastisch,[0 1]
= links stochastisch,[1 0]
= rechts stochastisch,[1 1]
= doppelt stochastisch. Probieren Sie es online!Erläuterung
quelle
Dyalog APL , 16 Bytes
{∧/100=+/↑⍵(⍉⍵)}
{ }
direkte Funktionsdefinition (aka "dfn")⍵
ist das Argument⍵(⍉⍵)
die Matrix neben ihrer Umsetzung↑
mische sie zu einem einzigen 2 × n × n-Array+/
Summe entlang der letzten Achse ergibt eine 2 × n Matrix100=
Welche Elemente sind 100 (Boolesche Werte sind 0 1)∧/
"und" -Reduktion entlang der letzten Achse, 2 Boolesche Werte für linkes und rechtes Stochastikumquelle
C ++ 14,
139136133130 Bytes-3 Bytes für
s=M.size()
, -3 Bytes für die Rückgabe per Referenzparameter, -3 Bytes als unbenanntes LambdaNimmt an, dass die Eingabe ähnlich ist
vector<vector<int>>
. Gibt 3,2,1,0 für doppelt, links, rechts und nicht stochastisch zurück.Ungolfed:
quelle