확률 적 행렬입니까?


24

확률 행렬은 마르코프 체인의 맥락에서 사용되는 확률의 행렬이다.

오른쪽 확률 행렬은 각 행의 합계에 대한 행렬이다 1.

왼쪽 확률 행렬은 각 열의 합에 대한 행렬이다 1.

이중 확률 행렬의 각 행과 각 열의 합을 행렬이다 1.

이 과제에서 정수를 사용하여 확률 을 백분율로 나타냅니다 . 이 경우에 합계의 행 또는 열해야 100하지 1.

목표 는 정수의 정사각형 행렬을 입력으로 받으면 행렬이 오른쪽 확률 적, 왼쪽 확률 적, 이중 확률 적 또는 둘 다 없음을 나타내는 네 가지 값 중 하나를 출력하는 프로그램 또는 함수를 작성하는 것입니다.

입력

입력 언어에 맞는 적절한 매트릭스 표현을 사용할 수 있습니다. 예를 들어, 목록 목록, 쉼표로 구분 된 문자열, 줄 바꿈으로 구분 된 행 등

입력 행렬은 항상 정사각형이며 음이 아닌 정수만 포함합니다. 입력 행렬은 항상 최소 1×1입니다.

STDIN함수 인수 또는 이와 유사한 것을 사용하여 입력을 전달할 수 있습니다 .

산출

오른쪽 확률 론적 , 왼쪽 확률 론적 , 이중 확률 론적 또는 그 중 어느 것에도 해당하지 않는 4 가지 출력 을 선택해야합니다 . 이러한 출력은 전달 된 입력에 관계없이 일정해야합니다. 프로그램은 어떤 부정적 번호에 대응한다는 예와 동일한 경우에 대해 서로 다른 출력을 반환하지 않을 것들 중에는 유효하지 않다.

요컨대, 네 가지 가능한 경우와 출력간에 일대일 대응이 있어야합니다. 이 네 가지 출력의 일부 예는 {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]

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


먼저 행렬의 크기를 결정하는 입력을 취할 수 있습니까?
HyperNeutrino

@AlexL. 아니요,이 시점에서 사양을 변경하는 것은 불공평합니다.
페이탈 라이즈

답변:


9

05AB1E , 13 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

하스켈, 57 55 바이트

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

유형의 입력 (Eq a, Num a) => [[a]]. 부울리스트 출력[left-stochastic, right-stochastic]

2 바이트를 절약 한 @proudhaskeller에게 감사합니다


함수를 pointfree로하여 바이트를 절약 할 수 없습니까? 예를 들어 with [transpose,id]<*>(그러면 s a=임의 함수가 허용 되므로 as를 생략 할 수 있음 )
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매핑 자체를 수행합니다.
Angs

11

R, 55 바이트

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

이름없는 함수 m는 R 행렬로 가정됩니다.

산출:

  • [1] TRUE FALSE: 왼쪽 확률론
  • [1] FALSE TRUE: 오른쪽 확률 론적
  • [1] TRUE TRUE: 더블
  • [1] FALSE FALSE: 없음

any(colSums(m)-100)마찬가지로 rowSums모든 출력을 반전시키면서 2 바이트가 떨어 지므로 항상 유지하려면 !-1바이트 앞에 배치 할 수 있습니다 .
Giuseppe

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

,2한 자릿수가 포함되지 않은 경우 마지막 은 불필요합니다. 이가 표현하는 경우에도, 1대신 100(이 가질 수로), 그것은 또 다른 절약 할 4바이트.


6

매스 매 티카 29 바이트

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

 = U + F3C7 = [\ Transpose] 문자로 대체하십시오. 이 코드 스 니펫은 Mathematica에 올바르게 붙여 넣습니다.

{lefttruth, righttruth}를 출력으로 사용하는 동일한 진실성 규칙


{}⋃1 바이트 이상 절약Union@
Simmons

@ASimmons, 팁 주셔서 감사합니다! 그것을 넣고 내 바이트 총계의 오류를 수정했습니다.
Kelly Lowder

그런 다음 대체하여 출력 {righttruth, lefttruth}를 만들 경우에도 생각 Total@과 함께 Tr/@추가로 2 바이트를 저장합니다.
시몬스

또는 두 행렬을 동일하게 뒤집어 해가되도록{}⋃Tr/@#=={100}&/@{#,#}&
A Simmons

@ASimmons, 예, 또 다른 2 개를 구했습니다. 감사합니다!
Kelly Lowder

6

k, 21 19 바이트

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

산출

  • 00b none
  • 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

출력은 두 개의 0/1 값입니다. 첫 번째는 행렬이 왼쪽 확률인지, 두 번째 행렬이 오른쪽 확률인지를 나타냅니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오.

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은 비싸고 답은 좋은 사람이었습니다.
매직 문어 Urn

5

매스 매 티카, 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

파이썬 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

EDIT1 : 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;ew1 또는 0 만 가능 하므로 return w<<1|e;none == 0 으로 변경 하고 재정의 할 수 있습니다 .
링크 Ng

1
이러한 if문장 중 일부 를 삼항 연산으로 바꾸고 마지막에 정수를 반환하면 30을 줄일 수 있습니다 . 솔루션이 비슷하기 때문에 게시해야한다면 Idunno입니다.
Yodle

@LinkNg 아주 좋아요. 이해하지 않고 코드를 작성하고 싶지 않습니다. 이진 연산자에 익숙하지 않습니다.
paldir

@ Yodle 감사합니다. 솔루션을 변경했습니다. 매우 유사하더라도 게시하십시오.
paldir

3

자바 스크립트 (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]}

두 가지 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.