토너먼트의 왕은 누구입니까?


13

배경

각 참가자가 다른 참가자와 하나의 게임을하는 라운드 로빈 토너먼트를 고려하십시오. 추첨이 없으므로 모든 게임에는 승자와 패자가 있습니다. 참가자 A는 A는 왕이 다른 모든 참가자에 대한 경우, 토너먼트의 B , 중 A가 이길 B를 , 또는 A가 다른 참가자 이길 C 차례로 비트 B를 . 모든 토너먼트에는 적어도 하나의 왕이 있음을 알 수 있습니다 (여러 개가있을 수 있음). 이 도전에서 당신의 임무는 주어진 토너먼트의 왕을 찾는 것입니다.

입력과 출력

입력 한 N × N값 은 부울 행렬 T이며 선택적 N ≥ 2으로 참가자 수 입니다. 각 항목은 T[i][j]참가자 사이의 게임의 결과를 표시 i하고 j값 1가 승리를 대표로, i윈 0 j. 그주의 T[i][j] == 1-T[j][i]경우 i != j. 대각선은 T0 으로 구성됩니다.

당신의 결과는 T0 기반 또는 1 기반 색인을 사용하여 나타내는 토너먼트의 왕 목록입니다 . 왕들의 순서는 관련이 없지만 중복되지 않아야합니다.

입력과 출력 모두 합리적인 형식으로 가져올 수 있습니다.

규칙과 득점

전체 프로그램 또는 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점 이 허용되지 않습니다.

테스트 사례

이 테스트 사례는 0 기반 인덱싱을 사용합니다. 1 기반 인덱싱의 경우 각 출력 값을 증가시킵니다.

 2 [[0,0],[1,0]] -> [1]
 3 [[0,1,0],[0,0,0],[1,1,0]] -> [2]
 3 [[0,1,0],[0,0,1],[1,0,0]] -> [0,1,2]
 4 [[0,1,1,1],[0,0,1,0],[0,0,0,0],[0,1,1,0]] -> [0]
 4 [[0,1,1,0],[0,0,1,0],[0,0,0,1],[1,1,0,0]] -> [0,2,3]
 5 [[0,1,0,0,1],[0,0,0,0,1],[1,1,0,0,0],[1,1,1,0,1],[0,0,1,0,0]] -> [3]
 5 [[0,1,0,1,0],[0,0,1,1,1],[1,0,0,0,0],[0,0,1,0,1],[1,0,1,0,0]] -> [0,1,4]
 5 [[0,0,0,0,0],[1,0,1,1,0],[1,0,0,0,1],[1,0,1,0,1],[1,1,0,0,0]] -> [1,3,4]
 6 [[0,0,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,1],[1,1,1,0,0,0]] -> [1,2,3,4,5]
 6 [[0,0,1,1,1,0],[1,0,0,1,1,1],[0,1,0,0,1,0],[0,0,1,0,0,1],[0,0,0,1,0,1],[1,0,1,0,0,0]] -> [0,1,2,3,5]
 6 [[0,1,1,0,0,1],[0,0,0,1,0,1],[0,1,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,0],[0,0,1,0,1,0]] -> [0,1,2,3,4,5]
 8 [[0,0,1,1,0,1,1,1],[1,0,1,0,1,1,0,0],[0,0,0,1,1,0,0,0],[0,1,0,0,0,1,0,0],[1,0,0,1,0,1,0,0],[0,0,1,0,0,0,1,0],[0,1,1,1,1,0,0,1],[0,1,1,1,1,1,0,0]] -> [0,1,4,6,7]
20 [[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1],[1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1],[0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1],[1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1],[0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1],[0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0],[1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0],[1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1],[1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1],[1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0],[0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1],[0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1],[1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1],[0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1],[0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1],[0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1],[0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1],[1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]] -> [0,1,3,4,5,7,8,11,15,17,18]

(런타임 또는 메모리 제한이 있습니까?) 신경 쓰지 마십시오. 나는 사양을 완전히 오해했다.
Dennis

@Dennis Nope. 당신의 프로그램이 이론적으로 무제한의 시간과 메모리를 제공하는 한, 당신은 괜찮습니다.
Zgarb

간단히 설명하면 : T [a] [b]는 T [b] [a]와 동일하지만 반대 각도에서 볼 때 T [a] [b] ==! T [b] [a]
edc65

@ edc65 좋은 관찰입니다. 나는 그것을 도전으로 편집했다.
Zgarb

답변:


9

MATLAB, 36 35 29 바이트

@(T,N)find(sum(T*T>-T,2)>N-2)

i왕 인지 알아 보자 . 그런 다음 각 j값 에 대해 T[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1. 그러나 두 번째 조건은로 대체 될 수 sum_over_k(T[i][k] * T[k][l])>0있지만 이것은 행렬의 항목 일뿐입니다 (행렬로 T*T간주 T하는 경우 ). 은 OR다음 가산함으로써 재생 될 수 T있다면 우리가 확인해야하므로, 그 결과 n-1, 행의 값 i의이 T*T+T0보다 큰 여부를 확인하기 위해, i왕. 이것이 바로 내 기능입니다.

(이것은 MATLAB이므로 인덱스는 1을 기준으로합니다.)

MATLAB 행렬은 세미콜론으로 줄 구분 기호로 인코딩해야합니다.

[[0,0,0,0,0];[1,0,1,1,0];[1,0,0,0,1];[1,0,1,0,1];[1,1,0,0,0]] 

대신 참가자 수를 입력으로 사용하여 몇 바이트를 절약 할 수 있습니다.size(T,1)
Luis Mendo

7

젤리, 13 12 11 바이트

a"€¹o/€oḅ1M

출력은 1 기반입니다. 온라인으로 사용해보십시오!

또는 배열 조작 대신 비트 연산자를 사용하십시오.

×Ḅ|/€|ḄBS€M

다시, 출력은 1 기반입니다. 온라인으로 사용해보십시오!

배경

참가자의 경우 , 우리 모두 찾을 수 있습니다 B를 하도록 A가 C의 비트 B를 이길 에 해당하는 모든 행을 복용하여 C가 되도록 C가 이길를 . IFR B 번째 의 항목 C 이다 1 , 우리는이 C가 B를 이길 .

선택한 열의 모든 해당 항목에 대한 논리합을 계산하면 A가 B 를 과도 성으로 비트 했는지 여부를 나타내는 단일 벡터를 얻 습니다 . 마지막으로, 입력 행렬의 해당 행으로 결과 벡터를 OR 링하면 A가 B 를 과도하게 또는 직접적으로 비트 하는지 부울을 제공합니다 .

모든 행에 대해 이것을 반복 하여 각 벡터에서 1 의 수를 계산하므로 각 A 비트 의 참가자 수를 계산합니다 . 최대 카운트는 토너먼트의 왕에 해당합니다.

작동 원리

a"€¹o/€oḅ1M  Main link. Argument: M (matrix)

   ¹         Yield M.
  €          For each row of M:
a"           Take the logical AND of each entry of that row and the corr. row of M.
    o/€      Reduce each resulting matrix by logical OR.
       o     Take the logical OR of the entries of the resulting maxtrix and the
             corr. entries of M.
        ḅ1   Convert each row from base 1 to integer, i.e. sum its elements.
          M  Get all indices of maximal sums.
×Ḅ|/€|ḄBS€M  Main link. Argument: M (matrix)

 Ḅ           Convert each row of M from base 2 to integer. Result: R
×            Multiply the entries of each column of M by the corr. integer.
  |/€        Reduce each row fo the resulting matrix by bitwise OR.
     |Ḅ      Bitwise OR the results with R.
       BS€   Convert to binary and reduce by sum.
             This counts the number of set bits for each integer.
          M  Get all indices of maximal popcounts.

1
사람들은 이것을 계속 게시하고 x "바이트"라고 말하지만 "ḅ"은 표준 인코딩에서 1 바이트로 실제로 인코딩됩니까? 죄송하지만 이러한 하이퍼 압축 스택 기반 언어는 모든 가능한 기능을 유니 코드 문자에 할당하는 것을 속이는 느낌이 들기 때문에 완전히 흥미롭지 않습니다.
MattPutnam

2
@MattPutnam Jelly는 자체 사용자 정의 인코딩을 사용합니다 . (또한, 이것은 스택 기반 없음)
spaghetto

2
@MattPutnam 나는 비슷한 감정을 가지고 있었지만 전통적인 골프를 전혀 좋아하지 않습니다. 다른 언어 사이트와 달리 전통적인 언어를 사용하는 사람은 아무도 없으며 다른 SE 사이트와 달리 '이 답변이 그 대답보다 분명히 더 낫습니다'는 것은 아닙니다. 또한 기술적으로 허용되지 않지만 질문을 뒷받침하기 위해 언어를 변경하지는 않습니다 (실제로 향후 질문에 대한 유용한 지름길을 실현하고 운영 할 수는 있지만).
corsiKa

왜이 알고리즘이 왕을 출력합니까?
xnor

@Dennis 이제 기본적으로 논리 또는 비트 산술을 통해 수행되는 부울 행렬 곱셈을 볼 수 있습니다. 실제 행렬 곱셈이 더 짧지 않습니까?
xnor

2

numpy, 54 바이트를 사용하는 Python

import numpy
lambda M:(M**0+M+M*M).all(1).nonzero()[0]

numpy 행렬을 받아서 0부터 시작하는 numpy 행 행렬을 출력합니다.

왕을 생각하는 또 다른 방법은 모든 참가자가 왕, 왕이 이길 사람들, 그리고 사람들이 이길 사람들을 만나는 참가자입니다. 다시 말해서, 모든 참가자들에게있어 "비트"관계 중에 왕에서 그들까지 최대 2 개의 길이 있습니다.

매트릭스 I + M + M*M는 각 소스에서 각 대상으로 0, 1 또는 2 단계의 경로 수를 인코딩합니다. 이 행렬의 행에 긍정적 인 항목 만있는 경우 플레이어가 왕입니다. 0은 Falsey이므로 all행이 모두 0이 아닌지 알려줍니다. 이것을 각 행에 적용하고 0이 아닌 결과의 인덱스를 출력합니다.


내 접근 방식과 똑같이 보이지만 다른 해석으로 흥미 롭습니다. 흥미로운 점
flawr

2

자바 스크립트 (ES6), 83 바이트

a=>a.map((b,i)=>b.every((c,j)=>c|i==j|b.some((d,k)=>d&a[k][j]))&&r.push(i),r=[])&&r

a => a.map ((b, i) => b.every ((c, j) => c | i == j | b.some ((d, k) => d & a [ k] [j])) && i + 1) .filter (a => a)하지만 1- 인덱스로 출력해야한다는 것을 의미합니다
Charlie Wynn

2

MATL , 12 10 9 바이트

Xy+HY^!Af

입력 : 먼저 참가자 수, 그리고 별도의 줄에 세미콜론으로 구분 된 행이있는 행렬. 출력은 1 기반입니다.

예를 들어, 다섯 번째 테스트 사례에는 입력이 있습니다.

4
[0,1,1,0; 0,0,1,0; 0,0,0,1; 1,1,0,0]

마지막 테스트 케이스에 입력이 있습니다

20
[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1; 1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1; 0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1; 0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1; 1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1; 0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1; 0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0; 1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0; 1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1; 1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1; 1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0; 0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1; 0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1; 1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1; 0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1; 0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1; 0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1; 0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1; 1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0; 0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]

온라인으로 사용해보십시오!

설명

Xy    % Implicitly take input: number. Push identity matrix with that size
+     % Implicitly take input: matrix. Add to identity matrix
HY^   % Matrix square
!     % Transpose
A     % Row vector with true entries for columns that contain all nonzero values
f     % Indices of nonzero values

1
MATL <Jelly \ m /
flawr

1

자바 136 131 121 112 바이트

(n,m)=>m.map((a,k)=>eval(a.map((o,i)=>o||eval(a.map((p,j)=>p&&m[j][i]).join`|`)).join`+`)>n-2&&k+1).filter(a=>a)

다음을 사용하여 전화 :

f=(n,m)=>m.map((a,k)=>eval(a.map((o,i)=>o||eval(a.map((p,j)=>p&&m[j][i]).join`|`)).join`+`)>n-2&&k+1).filter(a=>a)

f(20,[[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1],
     [1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1],
     [0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1],         
     [0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1],
     [1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1],         
     [0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1],
     [0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0],         
     [1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0],
     [1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1],         
     [1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1],
     [1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0],         
     [0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1],
     [0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1],         
     [1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1],
     [0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1],         
     [0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1],
     [0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1],         
     [0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1],
     [1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0],             
     [0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]])

출력이 1- 인덱싱 되었기 때문에 감시

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.