それは確率的行列ですか?


24

確率論的マトリックスは、マルコフ連鎖の文脈で使用される確率の行列です。

確率的行列は、各行の合計に行列です1

確率的行列は、各列の合計の行列です1

二重確率的行列は、各行及び各列の和に行列です1

この課題では、整数を使用して確率をパーセントで表します。その場合、行または列は合計する必要が100あり1ます。

あなたの目標は、入力として整数の正方行列が与えられると、行列が右確率的、左確率的、二重確率的、またはそれらのいずれでもないことを示す4つの値の1つを出力するプログラムまたは関数を書くことです。

入力

入力には、言語に自然なマトリックスの適切な表現を使用できます。たとえば、リストのリスト、行が改行で区切られたコンマ区切り値の文字列など。

入力行列は常に正方であり、負でない整数のみを含みます。入力行列は常に少なくともになり1×1ます。

を使用して入力を渡すことができSTDINます、関数の引数として、または類似のもの。

出力

右確率的左確率的二重確率的、またはそれらのいずれにも対応しない4つの異なる出力を選択する必要があります。これらの出力は、渡される入力に関係なく一定でなければなりません。あなたのプログラムは同じケースに対して異なる出力を返さないかもしれません。例えば、負の数はそれらのどれにも対応しないと言っては無効です。

要するに、出力と4つの可能なケースとの間には1対1の対応が必要です。これらの4つの出力のいくつかの例は{1, 2, 3, 4}{[1,0], [0,1], [1,1], [0,0]}またはでさえあり{right, left, doubly, none}ます。

プログラムが使用する4つの出力を答えてください。

行列が二重確率である場合、右または左の確率ではなく、二重確率に対応する出力を返す必要があります。

出力を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]

得点

これはであるため、バイト単位の最短回答が優先されます。


最初にマトリックスのサイズを決定する入力を取得できますか?
ハイパーニュートリノ

@AlexL。いいえ、この時点で仕様を変更するのは不公平です。
16年

回答:


9

05AB1E13 11 10バイト

右の確率的: [0,1]
左の確率的: [1,0]
二重の確率的:[1,1]
それらのどれも: [0,0]

Dø2FOTnQPˆ

オンラインでお試しください!

説明

D            # duplicate input
 ø           # transpose the copy
  2F         # 2 times do (once for each matrix)
    O        # sum of the rows
     TnQ     # is equal to 100
        P    # product
         ˆ   # add to global list
             # implicitly print global list at the end of the program

14

Haskell、57 55バイト

import Data.List
s a=all((==100).sum)<$>[transpose a,a]

タイプの入力(Eq a, Num a) => [[a]]。ブールリストを出力します[left-stochastic, right-stochastic]

2バイトを節約してくれた@proudhaskellerに感謝


関数をポイントフリーにすることで、いくつかのバイトを節約できませんでしたか?例:(任意の関数が許可されている[transpose,id]<*>ためs a=、省略できます)
-flawr

おそらく@flawr、しかし[transpose,id]<*>のタイプ有する[[[a]]]->[[[a]]]の別の層を必要とする、mapおよびpure/ return/ (:[])またはタイプの入力[[[INT]]]、自然されていません。私が手に入れたベストはmap(all(==100).map sum).(<$>[transpose,id]).flip id
-Angs

ああ、説明してくれてありがとう!
flawr

どの程度all((==100).sum)の代わりにall(==100).map sum
誇りに思ってhaskeller

@proudhaskellerもちろん!allそれ自体でマッピングを行います。
アンス

11

R、55バイト

function(m)c(all(colSums(m)==100),all(rowSums(m)==100))

mR行列と見なされる名前のない関数。

出力:

  • [1] TRUE FALSE:左の確率的
  • [1] FALSE TRUE:右確率論
  • [1] TRUE TRUE:二重に
  • [1] FALSE FALSE: なし

any(colSums(m)-100)同様に、rowSumsすべての出力を反転させながら2バイトをドロップするため、それらを保持したい場合は、常に!ネット-1バイトの先頭に配置できます。
ジュゼッペ

7

オクターブ、35 34 32 31バイト

@(n)any([sum(n);sum(n')]-100,2)

次のように呼び出します。

f(100)
f(42)
f([4,8,15; 16,23,42; 80,69,43])
f([99,1;2,98])
f([1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16])

ここでテストしてください。

flawrのおかげで最初は2バイト節約しましたが、1バイト短くなった別のアプローチを採用しました。

これにより、さまざまなケースで以下が出力されます。

0    Doubly
0    

1    None
1

0    Left
1

1    Right
0

,21桁が含まれていなければ、最後は不要です。また、これ1100(可能な限り)の代わりに合計すると、別の4バイトが節約されます。


6

Mathematica 29バイト

{}⋃Tr/@#=={100}&/@{#,#}&

= U + F3C7 = [\ Transpose]文字に置き換えます。このコードスニペットはMathematicaに正しく貼り付けられます。

出力として{lefttruth、righttruth}を使用した同じ真実性の規則


{}⋃上の1つのバイトを節約するUnion@
A・シモンズ

@ASimmons、ヒントをありがとう!それを入れて、合計バイトのエラーを修正しました。
ケリーロウダー

また、出力を{righttruth、lefttruth}にすると、置換Total@するTr/@とさらに2バイト節約されます。
シモンズ

溶液になるように、または等価的に二つの行列を逆{}⋃Tr/@#=={100}&/@{#,#}&
Aシモンズ

@ASimmons、はい、それは別の2を保存しました。ありがとう!
ケリーロウダー

6

k、21 19バイト

{min'100=+/'(x;+x)}

出力

  • 00b なし
  • 10b
  • 01b
  • 11b 両方

例:

k)f:{min'100=+/'(x;+x)} //store function as f
k)f(100 0;98 2)
01b

編集:バイト数を3減らす-関数をラムダで囲む必要はありません

編集:バイト数を2減らす-H / T @Simon Major


1
実際にラムダで囲むことでバイトを保存できます:{min'100 = + / '(x; +:x)}
Simon Major

5

MATL、12バイト

sG!sv!100=XA

出力は2つのゼロ/ 1値です。最初は、マトリックスが左確率であるかどうかを示し、2番目は右確率であるかを示します。

オンラインでお試しください!または、すべてのテストケースを確認します

s      % Implicitly input N×N matrix. Sum of each column. Gives a 1×N vector
G!     % Push input transposed
s      % Sum of each column. Gives a 1×N vector
v      % Concatenate vertically. Gives a 2×N matrix
!      % Transpose. N×2
100=   % Does each entry equal 100?
XA     % True for columns that contain only "true". Gives 1×2 vector. Implicitly display

しかし、100は高価で、良い答えでした。
魔法のタコUr

5

Mathematica、46 43バイト

AllTrue[#==100&]/@Apply[Plus,{#,#},{1}]&

他の回答と同様に、出力は

{False, False} 非確率論的

{True, False} 左確率論

{False, True} 右確率論のために

{True, True} 二重確率論

の演算子形式に切り替えることで3バイトを節約しました AllTrue


U + F3C7(プライベート使用)を\[Transpose]
u54112

私はそれを考えたが、それはあまり啓発的ではないと思った
シモンズ

また@、最後に追加があります
-u54112

4

PHP、104バイト

function($a){for($s=array_sum;$a[+$i];)$o|=$s($a[+$i])!=100|($s(array_column($a,+$i++))!=100)*2;echo$o;}

0 =>両方、1 =>左、2 =>右、3 =>どちらもエコーしない匿名関数。
次のように使用します:

php -r "$c=function($a){for($s=array_sum;$a[+$i];)$o|=$s($a[+$i])!=100|($s(array_column($a,+$i++))!=100)*2;echo$o;};$c(json_decode($argv[1]));" "[[4,8,15],[16,23,42],[80,69,43]]"

114バイトのコマンドラインプログラムバージョン:

for($a=json_decode($argv[1]);$a[+$i];)$o|=($s=array_sum)($a[+$i])!=100|($s(array_column($a,+$i++))!=100)*2;echo$o;

次のように使用されます:

 php -r "for($a=json_decode($argv[1]);$a[+$i];)$o|=($s=array_sum)($a[+$i])!=100|($s(array_column($a,+$i++))!=100)*2;echo$o;" "[[4,8,15],[16,23,42],[80,69,43]]"

4

Pythonの2、70の 64バイト

狂ったようなことはなく、スプラッティングを利用しzipて行列を転置するだけです:)出力は次のとおりです。

0 - not stochastic
1 - right stochastic
2 - left stochastic
3 - doubly stochastic

そして、ここにコードがあります:)

k=lambda m:all(sum(x)==100for x in m)
lambda n:k(n)+2*k(zip(*n))

(* na間違えましたか?
hhh

1
@hhhいいえ、それはsplat演算子です:)本質的にそれは私にマトリックスを転置させるものです:)
Kade

4

C#の、205の 203 183バイト

ゴルフ:

int F(int[,]m){int x,i,j,r,c,e,w;x=m.GetLength(0);e=w=1;for(i=0;i<x;i++){r=c=0;for(j=0;j<x;j++){r+=m[i,j];c+=m[j,i];}if(r!=100)e=0;if(c!=100)w=0;}return e==1&&w==1?3:e==1?1:w==1?2:4;}

コメントなしでゴルフ:

    int F(int[,] m)
    {
        //x - matrix size
        //i, j - loop control variables
        //r, c - row/column sum
        //e, w - east/west, pseudo-bool values indicate right/left stochastic
        int x, i, j, r, c, e, w;
        x = m.GetLength(0);
        e = w = 1;

        for (i = 0; i < x; i++)
        {
            r = c = 0;

            for (j = 0; j < x; j++)
            {
                r += m[i, j];
                c += m[j, i];
            }

            if (r != 100)
                e = 0;

            if (c != 100)
                w = 0;
        }

        return e == 1 && w == 1 ? 3 : e == 1 ? 1 : w == 1 ? 2 : 4;
    }

出力キー:1-右確率2-左確率3-二重確率4-なし

試してください:http : //rextester.com/PKYS11433

編集1:r=0;c=0;=>r=c=0;

EDIT2:ネストされた三項演算子。クレジットは@Yodleに送られます。


2
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;eand wは1または0のみであるため、return w<<1|e;none == 0に変更して再定義できます。
リンクNg

1
これらのifステートメントの一部を3項演算に変換し、最後に整数を返す場合、30を短縮できます。Idunnoとても似ているので、ソリューションを投稿する必要がある場合。
ヨドル

@LinkNgとてもいい。理解せずにコードを書きたくありません。私は二項演算子に精通していません。
paldir

@Yodleありがとう、ソリューションを変更しました。非常に似ている場合でも投稿してください。
paldir

3

JavaScript(ES6)、83バイト

a=>[a.some(a=>a.reduce((l,r)=>l-r,100)),a.some((_,i)=>a.reduce((l,a)=>l-a[i],100))]

ただ逆に、この出力は右側の論理的結果を左側に出力するだけでなく、ブール値も反転しているため、[false, true]まだ出力は右側の論理的結果を意味します。


3

C#6、130バイト

using System.Linq;bool[]F(int[][]a)=>new[]{a.Where((_,i)=>a.Select(x=>x[i]).Sum()==100).Count()==a.Length,a.All(x=>x.Sum()==100)};

{False, False}非確率的
{True, False}、左確率的
{False, True}、右確率的
{True, True}、二重確率的

repl.itデモ

非ゴルフ

bool[]F(int[][]a)=>
    // Return new array of two bools. Array type is inferred from arguments
    new[]
    {
        // Left:
        // Count the no. of columns which sums up to 100
        a.Where((_,i)=>a.Select(x=>x[i]).Sum()==100).Count()
            // Then check if no. of such columns equal to total column count
            ==a.Length,
        // Right: Do all rows sum up to 100?
        // Can't use this trick for left because no overload of All() accept Func<TSource,int,bool> like Where() does
        a.All(x=>x.Sum()==100)
    };

3

グルーヴィー、57

{a={it.every{it.sum()==100}};[a(it),a(it.transpose())]}​

出力

[0,0] どちらでもない場合。

[1,0] 正しい場合。

[0,1] 残っている場合。

[1,1] 両方の場合。


2

ピップ、17バイト

予想外のひねりでは、この提出は機能です。

{[h]=UQ$+_M[Zaa]}

2つの0/ 1値のリストを返します:[0 0]=確率的ではない、[0 1]=左確率的、[1 0]=右確率的、[1 1]=二重確率的。オンラインでお試しください!

説明

{               }  A function:
              a    Function argument (nested list)
           [Za ]   Create a list containing a's transpose and a
          M        Map this function to each of the above:
       $+_           Sum down the columns
     UQ              Get unique elements
 [h]=                If stochastic, the result should be [100]

2

Dyalog APL、16 バイト

{∧/100=+/↑⍵(⍉⍵)}

{ }直接関数定義(別名「dfn」)は引数です

⍵(⍉⍵) 転置に沿った行列

それらを単一の2×n×n配列に混在させる

+/ 最後の軸に沿って合計し、2×n行列を取得します

100= どの要素が100か(ブール値は0 1)

∧/ 「および」-最後の軸に沿って削減、左、右確率論のための2つのブール値を取得


2

C ++ 14、139の 136 133 130バイト

-3バイト、s=M.size()参照パラメーターで返すための-3バイト、無名のラムダとして-3バイト

[](auto M,int&r){int a,b,i,j,s=M.size();r=3;for(i=-1;++i<s;){for(j=-1,a=b=0;++j<s;a+=M[i][j],b+=M[j][i]);r&=(a==100)+2*(b==100);}}

入力がのようなものであると仮定しますvector<vector<int>>。二重、左、右、確率なしの場合は3,2,1,0を返します。

ゴルフをしていない:

auto f=
[](auto M, int& r){
  int a,b,i,j,s=M.size();
  r=3;
  for(i=-1;++i<s;){
    for(j=-1,a=b=0;++j<s;
      a+=M[i][j],
      b+=M[j][i]);
    r&=(a==100)+2*(b==100);
  }
}
;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.