Đưa ra một bảng thắng, thua và hòa, đưa ra kết quả của mỗi trận đấu trong một giải đấu thể thao


11

Câu hỏi này được lấy cảm hứng từ giải đấu đang diễn ra của "trò chơi côn đồ được chơi bởi các quý ông", World Cup bóng bầu dục , vừa hoàn thành giai đoạn bể bơi. Có 20 đội trong giải đấu, và họ được chia thành 4 nhóm 5 đội mỗi đội. Trong giai đoạn bể bơi, mỗi đội thi đấu với tất cả các đội khác trong nhóm của họ (tổng cộng 10 trận đấu cho mỗi nhóm) và 2 đội hàng đầu của mỗi nhóm sẽ tiến tới vòng đấu loại trực tiếp.

Ở cuối giai đoạn nhóm có một bảng cho mỗi nhóm hiển thị số trận thắng, thua và hòa cho mỗi đội. Thách thức cho câu hỏi này là viết một chương trình nhập số lần thắng, thua và hòa cho mỗi đội trong một nhóm và từ đó thông tin đưa ra kết quả cá nhân của mỗi trong số 10 trận đấu (ai thắng, thua hoặc hòa với ai ) nếu có thể hoặc xuất ra một thông báo lỗi nếu không.

Ví dụ: đây là bảng dành cho Bi-a D của giải đấu năm nay:

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

Từ thông tin này, chúng tôi có thể suy luận rằng Ireland đã giành chiến thắng trước Canada, Pháp, Ý và Romania, bởi vì họ đã thắng tất cả các trò chơi của họ. Pháp phải giành chiến thắng trước Canada, Ý và Romania nhưng thua Ireland, bởi vì họ chỉ thua một và nó phải thuộc về Ireland bất bại. Chúng tôi vừa tìm ra rằng Ý thua Ireland và Pháp, vì vậy họ phải giành chiến thắng trước Canada và Romania. Canada thua tất cả các trò chơi của họ, và vì vậy chiến thắng của Romania phải là trước Canada.

         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       -

Đây là một ví dụ phức tạp hơn (hư cấu):

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

Trong trường hợp này, chúng ta có thể suy luận rằng Romania đã giành chiến thắng trước Canada, Pháp, Ý và Ireland, bởi vì họ đã thắng tất cả các trò chơi của họ. Canada phải giành chiến thắng trước Ireland, Ý và Pháp nhưng thua Romania. Chúng tôi vừa tìm ra rằng Ý thua Romania và Canada, vì vậy họ phải rút ra chống lại Pháp và Ireland. Điều đó có nghĩa là Ireland hòa với Ý và thua mọi người khác, và do đó Pháp phải đánh bại Ireland, hòa với Ý và thua Canada và Romania.

         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       -

Một số bảng không thể giải được, ví dụ Nhóm B năm nay, trong đó 3 đội có tổng số W / L / D giống nhau:

            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

Tuy nhiên, một số bảng có hàng trùng lặp có thể giải được, như thế này (hư cấu):

            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

Đầu vào

Chương trình hoặc chức năng của bạn phải chấp nhận 15 số chỉ định thắng, thua và rút tổng số cho mỗi trong số 5 đội. Bạn có thể sử dụng bất kỳ dấu phân cách nào bạn muốn, nhập các số theo thứ tự chính hàng hoặc cột và chấp nhận các số thông qua stdin hoặc chuyển qua một mảng cho một hàm.

Vì thắng + thua + hòa = 4, bạn có thể bỏ qua một trong các giá trị và giải quyết nó khỏi các giá trị khác nếu bạn muốn, nghĩa là bạn chỉ phải nhập 10 số.

Bạn không cần phải nhập bất kỳ tên nhóm.

Đầu vào mẫu:

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

Đầu ra

Đầu ra của chương trình hoặc chức năng của bạn phải ở dạng lưới 5 x 5 được in ra thiết bị xuất chuẩn hoặc một mảng được trả về từ một hàm. Mỗi yếu tố nên xác định xem đội được đưa ra ở vị trí hàng thắng, thua hoặc hòa với đội ở vị trí cột. Thứ tự hàng cho đầu ra phải phù hợp với đầu vào. Bạn có thể xác định những gì biểu thị thắng, thua hoặc hòa, do đó, các chữ cái W, L, D hoặc chữ số 0 1 2 hoặc bất cứ thứ gì bạn muốn có thể được sử dụng miễn là chúng được xác định rõ ràng và có thể được phân biệt với nhau. Các yếu tố đường chéo không được xác định, bạn có thể xuất bất cứ thứ gì, nhưng nó phải giống nhau trong từng trường hợp. Các giá trị có thể được phân tách bằng dấu phẩy, dấu cách hoặc bất kỳ ký tự nào bạn thích hoặc không phải ký tự. Cả đầu vào và đầu ra có thể được định dạng với tất cả các giá trị trên một dòng nếu muốn.

Nếu một bảng không có một giải pháp duy nhất thì bạn phải xuất một thông báo lỗi đơn giản theo lựa chọn của bạn.

Đầu ra mẫu:

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

Đầu ra mẫu cho bảng không thể giải được:

dunno mate

Đây là mã golf, vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.

Pic liên quan (Nhật Bản so với Nam Phi):

nhập mô tả hình ảnh ở đây

Câu trả lời:


4

CJam, 57 49 47 45 byte

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

Đây là một hàm ẩn danh bật ra một mảng hai chiều từ ngăn xếp và trả lại một mảng. Nó chứa đựng 2cho chiến thắng, 1cho trận hòa và 0thua lỗ. Nó cũng chứa 1các phần tử đường chéo, mà bạn có thể xuất bất cứ thứ gì . Nếu vấn đề không thể giải quyết được, hàm sẽ trả về -1.

Mã sẽ hoạt động trực tuyến, nhưng sẽ mất một lúc. Hãy thử nó trong trình thông dịch CJam .

Chạy thử nghiệm

$ 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

Làm thế nào nó hoạt động

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

Haskell, 180 177 byte

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]

Một chiến thắng được thể hiện là 1, một mất mát -1và một trận hòa như 0. Các yếu tố đường chéo cũng được 0. Bảng không thể giải quyết là danh sách trống, tức là [].

Ví dụ sử dụng: 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]]].

Làm thế nào nó hoạt động: lực lượng vũ phu! Tạo một danh sách thắng / thua / hòa theo đầu vào, ví dụ [3,1,0]-> [1,1,1,-1], hoán vị, xây dựng tất cả các kết hợp, chèn đường chéo và giữ tất cả các bảng bằng với chuyển vị của chúng với tất cả các phần tử bị phủ định. Lấy cái đầu tiên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.