승리, 손실 및 무승부 테이블이 주어지면 스포츠 경기에서 각 경기의 결과를 출력하십시오.


11

이 질문은 풀장 무대를 막 완료 한 럭비 월드컵 (Rugby World Cup ) 의 "훌리건 게임"에 대한 지속적인 토너먼트에서 영감을 얻은 것 입니다. 토너먼트에는 20 개의 팀이 있으며 각각 5 개의 팀으로 구성된 4 개의 풀로 나뉩니다. 풀 스테이지 동안 각 팀은 풀에있는 다른 모든 팀과 경기를하며 (풀 당 총 10 경기) 각 풀의 상위 2 팀이 녹아웃 스테이지로 진행합니다.

풀 단계가 끝나면 각 팀의 승리, 패배 및 추첨 횟수를 보여주는 각 풀의 테이블이 있습니다. 이 질문에 대한 도전은 풀의 각 팀에 대한 승, 패 및 무승부를 입력하는 프로그램을 작성하는 것입니다. 그리고 그 정보에서 10 경기 각각의 개별 결과를 산출합니다 ) 가능하면 에러 메시지를 출력합니다.

예를 들어, 다음은 올해 토너먼트 D에 대한 표입니다.

            Win    Loss    Draw
Canada        0       4       0
France        3       1       0
Ireland       4       0       0
Italy         2       2       0
Romania       1       3       0

이 정보를 통해 아일랜드는 모든 게임에서 승리했기 때문에 아일랜드가 캐나다, 프랑스, ​​이탈리아 및 루마니아를 상대로 승리했다고 추론 할 수 있습니다. 프랑스는 캐나다, 이탈리아 및 루마니아와의 경기에서 승리했지만 아일랜드와의 경기에서 패배했습니다. 우리는 방금 이탈리아가 아일랜드와 프랑스에 졌다는 것을 알아 냈으므로 캐나다와 루마니아에 대항하여 승리해야합니다. 캐나다는 모든 경기에서 패했다. 따라서 루마니아의 승리는 캐나다와의 대결이었다.

         Canada  France Ireland   Italy Romania
Canada        -       L       L       L       L
France        W       -       L       W       W
Ireland       W       W       -       W       W
Italy         W       L       L       -       W
Romania       W       L       L       L       -

보다 복잡한 (가상) 예는 다음과 같습니다.

            Win    Loss    Draw
Canada        3       1       0
France        1       2       1
Ireland       0       3       1
Italy         0       2       2
Romania       4       0       0

이 경우 루마니아는 캐나다, 프랑스, ​​이탈리아 및 아일랜드와의 경기에서 승리했기 때문에 이겼다고 추론 할 수 있습니다. 캐나다는 아일랜드, 이탈리아 및 프랑스와의 경기에서 승리했지만 루마니아는 패했다. 우리는 방금 이탈리아가 루마니아와 캐나다로 졌다는 사실을 알아 냈으므로 프랑스와 아일랜드를 상대해야했습니다. 이는 아일랜드가 이탈리아를 사용하여 다른 사람들에게 졌기 때문에 프랑스가 아일랜드를 이겼고 이탈리아를 사용하여 캐나다와 루마니아에 졌어 야한다는 것을 의미합니다.

         Canada  France Ireland   Italy Romania
Canada        -       W       W       W       L
France        L       -       W       D       L
Ireland       L       L       -       D       L
Italy         L       D       D       -       L
Romania       W       W       W       W       -

예를 들어 올해의 풀 B와 같은 일부 테이블은 해결할 수 없습니다. 3 개의 팀이 동일한 W / L / D 합계를 얻었습니다.

            Win    Loss    Draw
Japan         3       1       0
Samoa         1       3       0
Scotland      3       1       0
South Africa  3       1       0
United States 0       4       0

그러나 중복 행이있는 일부 테이블은 다음과 같이 해결할 수 있습니다.

            Win    Loss    Draw
Japan         4       0       0
Samoa         0       3       1
Scotland      2       2       0
South Africa  0       3       1
United States 3       1       0

입력

귀하의 프로그램 또는 기능은 5 개 팀 각각에 대해 승리, 손실 및 추첨 합계를 지정하는 15 개의 숫자를 수용해야합니다. 원하는 구분 기호를 사용하고, 행 또는 열 주요 순서로 숫자를 입력하고, stdin을 통해 또는 배열을 통해 함수에 전달 된 숫자를 승인 할 수 있습니다.

승 + 손실 + 무승부 = 4이기 때문에 원하는 경우 값 중 하나를 생략하고 다른 값에서 해결할 수 있습니다. 즉 10 개의 숫자 만 입력하면됩니다.

팀 이름을 입력 할 필요가 없습니다.

샘플 입력 :

3 1 0
1 2 1
0 3 1
0 2 2
4 0 0

산출

프로그램 또는 함수의 출력은 표준 출력으로 인쇄 된 5 x 5 격자 또는 함수에서 반환 된 배열의 형태 여야합니다. 각 요소는 행 위치에서 주어진 팀이 열 위치에서 팀에 대해이기거나 잃어 버렸는지 또는 끌 었는지 여부를 지정해야합니다. 출력의 행 순서는 입력과 일치해야합니다. 승, 패 또는 무승부를 나타내는 것을 정의 할 수 있으므로 문자 W, L, D 또는 숫자 0 1 2 또는 원하는 것을 명확하게 정의하고 서로 구별 할 수있는 한 사용할 수 있습니다. 대각선 요소는 정의되어 있지 않으므로 아무 것도 출력 할 수 있지만 각 경우에 동일해야합니다. 값은 쉼표, 공백 또는 원하는 문자 또는 문자가 아닌 문자로 구분할 수 있습니다. 원하는 경우 입력과 출력을 모두 한 줄로 모든 값으로 포맷 할 수 있습니다.

테이블에 고유 한 솔루션이 없으면 선택한 간단한 오류 메시지를 출력해야합니다.

샘플 출력 :

- W W W L
L - W D L
L L - D L
L D D - L
W W W W -

해결할 수없는 테이블의 샘플 출력 :

dunno mate

이것은 코드 골프이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.

그림 관련 (일본과 남아프리카) :

여기에 이미지 설명을 입력하십시오

답변:


4

CJam, 57 49 47 45 바이트

{JZb:af{.*e_1+e!}:m*:e_5f/{_z2\ff-=},_,(0@?~}

이것은 익명의 함수로 스택에서 2 차원 배열을 팝하고 그 결과를 반환합니다. 그것은 포함 2, 승리를위한 1무에 대한 0손실. 또한 1대각선 요소 도 포함되어있어 무엇이든 출력 할 수 있습니다 . 문제를 해결할 수 없으면이 함수는을 반환합니다 -1.

코드는 온라인으로 작동하지만 시간이 조금 걸립니다. CJam 통역사 에서 사용해보십시오 .

시운전

$ cat input
3 1 0
1 2 1
0 3 1
0 2 2
4 0 0
$ time cjam results.cjam < input
[1 2 2 2 0]
[0 1 2 1 0]
[0 0 1 1 0]
[0 1 1 1 0]
[2 2 2 2 1]

real    0m1.584s
user    0m4.020s
sys     0m0.146s

작동 원리

JZb:a e# Push 19 in base 3; wrap each digit in an array. Pushes [[2] [0] [1]].
f{    e# For each row of the input, push it and [[2] [0] [1]]; then:
  .*  e# Repeat 2, 0 and 1 (win, loss, draw) the specified number of times.
  e_  e# Flatten the resulting array.
  1+  e# Append a 1 for the diagonal.
  e!  e# Push all possible permutations.
}     e#
:m*   e# Cartesian product; push all possible combinations of permutations.
:e_   e# Flatten the results.
5f/   e# Split into rows of length 5.
{     e# Filter:
  _z  e#   Push a transposed copy of the array.
  2\  e#   Swap the result with 2.
  ff- e#   Subtract all elements from 2.
  =   e#   Check for equality.
},    e# Keep the element if `=' pushed 1.
_,(   e# Get the length of the array of solutions and subtract 1.
0@?   e# Keep the array for length 1, push 0 otherwise.
~     e# Either dump the singleton array or turn 0 into -1.

4

하스켈, 180 177 바이트

import Data.List
z=zipWith
m=map
a#b|(c,d)<-splitAt a b=c++[0]++d
f t=take 1[x|x<-m(z(#)[0..])$sequence$m(permutations.concat.z(flip replicate)[1,-1,0])t,transpose x==m(m(0-))x]

승리는로 표시되고 1손실 은로 표시 -1됩니다 0. 대각선 요소도 있습니다 0. 해결할 수없는 테이블은 빈 목록입니다 (예 :) [].

사용 예 : f [[3,1,0],[1,2,1],[0,3,1],[0,2,2],[4,0,0]]-> [[[0,1,1,1,-1],[-1,0,1,0,-1],[-1,-1,0,0,-1],[-1,0,0,0,-1],[1,1,1,1,0]]].

작동 방식 : 무차별 대입! 입력에 따라 승 / 패 / 추첨 목록을 작성합니다. 예 :[3,1,0] -> [1,1,1,-1], permute, 모든 조합 작성, 대각선 삽입 및 모든 요소가 무효화 된 상태로 조옮김과 동일한 모든 테이블 유지). 첫 번째를 가져 가라.

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