Bir galibiyet, kayıp ve berabere tablosu verildiğinde, her maçın sonucunu bir spor turnuvasında çıktılayın


11

Bu soru, havuz sahnesini yeni tamamlayan Rugby Dünya Kupası "hologanın beyler tarafından oynanan oyunu" devam eden turnuvasından esinlenmiştir . Turnuvada 20 takım var ve her biri 5 takımdan oluşan 4 havuzdan oluşuyor. Havuz aşamasında her takım kendi havuzundaki diğer tüm takımlara karşı oynar (havuz başına toplam 10 maç) ve her havuzun ilk 2 takımı nakavt aşamasına geçer.

Havuz aşamasının sonunda, her havuz için her takım için kazanma, kayıp ve beraberlik sayısını gösteren bir masa bulunur. Bu sorunun meydan okuması, bir havuzdaki her takım için kazanma, kayıp ve berabere kalma sayısını giren bir program yazmak ve bu bilgilerden 10 maçın her birinin (kimin kazandığı, kaybettiği veya kime karşı çektiği) bireysel sonuçları çıktı ) mümkünse veya yoksa bir hata mesajı verir.

Örneğin, bu yılki turnuvanın D Grubu için masa:

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

Bu bilgilerden, İrlanda'nın Kanada, Fransa, İtalya ve Romanya'ya karşı kazandığını, tüm oyunlarını kazandıklarını söyleyebiliriz. Fransa Kanada, İtalya ve Romanya'ya karşı kazanmış ancak İrlanda'ya kaybetmiş olmalı, çünkü sadece birini kaybetmişler ve yenilgisiz İrlanda'ya gitmiş olmalılar. Az önce İtalya'nın İrlanda ve Fransa'ya kaybettiği için Kanada ve Romanya'ya karşı kazanmış olmaları gerektiğini öğrendik. Kanada tüm maçlarını kaybetti ve bu yüzden Romanya'nın galibiyeti Kanada'ya karşı olmalı.

         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       -

İşte daha karmaşık (kurgusal) bir örnek:

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

Bu durumda, Romanya'nın Kanada, Fransa, İtalya ve İrlanda'ya karşı kazandığını, tüm oyunlarını kazandıklarını söyleyebiliriz. Kanada, İrlanda, İtalya ve Fransa'ya karşı kazanmış ancak Romanya'ya kaybetmiş olmalıdır. Az önce İtalya'nın Romanya ve Kanada'yı kaybettiği için çalıştık, bu yüzden Fransa ve İrlanda'ya karşı çekilmeleri gerekiyordu. Bu, İrlanda'nın İtalya ile çekildiği ve herkese kaybettiği ve bu nedenle Fransa'nın İrlanda'yı dövdüğü, İtalya ile çekildiği ve Kanada ve Romanya'ya kaybettiği anlamına gelir.

         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       -

Bazı tablolar çözülemez, örneğin 3 ekibin aynı W / L / D toplamlarına sahip olduğu bu yılki Pool B:

            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

Ancak, yinelenen satırlara sahip bazı tablolar, bu gibi kurgusaldır:

            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

Giriş

Programınız veya işleviniz, 5 takımın her biri için kazanma, kaybetme ve beraberlik toplamlarını belirten 15 sayıyı kabul etmelidir. İstediğiniz herhangi bir sınırlayıcıyı kullanabilir, sayıları satır veya sütun ana düzeninde girebilir ve sayıları stdin aracılığıyla veya bir dizi aracılığıyla bir işleve geçirebilirsiniz.

Galibiyetler + kayıplar + çekiliş = 4 olduğu için, değerlerden birini atlayabilir ve isterseniz diğerlerinden çalışabilirsiniz, yani sadece 10 sayı girmeniz gerekir.

Herhangi bir takım adı girmenize gerek yoktur.

Örnek giriş:

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

Çıktı

Programınızın veya işlevinizin çıktısı, stdout'a yazdırılan 5 x 5 ızgara veya bir işlevden döndürülen bir dizi biçiminde olmalıdır. Her bir eleman, sıra pozisyonunda verilen takımın sütun pozisyonunda takıma karşı kazanıp kaybetmediğini veya çizileceğini belirtmelidir. Çıktı için satır sırası girişle eşleşmelidir. Kazanma, kaybetme veya berabere neyi ifade ettiğini tanımlayabilirsiniz, böylece W, L, D veya 0 1 2 rakamları veya istediğiniz her şey açıkça tanımlandığı ve birbirinden ayırt edilebildiği sürece kullanılabilir. Köşegen öğeler tanımsızdır, her şeyi çıktılayabilirsiniz, ancak her durumda aynı olmalıdır. Değerler virgül, boşluk veya istediğiniz herhangi bir karakterle ayrılabilir veya karakterle ayrılamaz. Hem giriş hem de çıkış istenirse tek bir satırdaki tüm değerlerle biçimlendirilebilir.

Bir tablonun benzersiz bir çözümü yoksa, seçtiğiniz basit bir hata mesajı vermelisiniz.

Örnek çıktı:

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

Çözülemeyen tablo için örnek çıktı:

dunno mate

Bu kod golf yani bayt en kısa program kazanır.

Pic ile ilgili (Güney Afrika'ya karşı Japonya):

resim açıklamasını buraya girin

Yanıtlar:


4

CJam, 57 49 47 45 bayt

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

Bu, yığından iki boyutlu bir dizi çıkaran ve karşılığında bir tane bırakan anonim bir işlevdir. 2Kazançlar, 1çekilişler ve 0kayıplar için içerir . Ayrıca 1, her şeyi çıktılayabileceğiniz çapraz elemanlar için de içerir . Sorun çözülemezse, işlev geri döner -1.

Kod çevrimiçi çalışacak, ancak biraz zaman alacak. CJam yorumlayıcısında deneyin .

Test sürüşü

$ 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

Nasıl çalışır

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 bayt

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]

Kazanma, 1kayıp -1ve beraberlik olarak gösterilir 0. Çapraz elemanlar da vardır 0. Çözülemeyen tablolar boş listelerdir, yani [].

Kullanım örneği: 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]]].

Nasıl çalışır: kaba kuvvet! Girdiye göre bir kazanç / kayıp / beraberlik listesi oluşturun, örneğin [3,1,0]-> [1,1,1,-1], izin ver, tüm kombinasyonları oluştur , köşegenler ekle ve tüm elemanlar kaldırılmış olarak transpozisyonlarına eşit olan tüm tabloları koru. İlkini al.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.