Utwórz program zgadywania Mistrzostw Świata

13

Jak wiecie, faza grupowa Pucharu Świata dobiegła końca, a od jutra 16 najlepszych drużyn rozpocznie fazę pucharową:

  • Brazylia (BRA)
  • Meksyk (MEX)
  • Holandia (NED)
  • Chile (CHI)
  • Kolumbia (COL)
  • Grecja (GRE)
  • Kostaryka (CRC)
  • Urugwaj (URU)
  • Francja (FRA)
  • Szwajcaria (SUI)
  • Argentyna (ARG)
  • Nigeria (NGA)
  • Niemcy (GER)
  • Stany Zjednoczone (USA)
  • Belgia (BEL)
  • Algieria (ALG)

W fazie pucharowej zwycięzca przechodzi do następnej rundy, a przegrany wraca do domu (nie ma remisów). Kliknij tutaj, aby zobaczyć więcej na temat fazy pucharowej.

Zostałeś zatrudniony przez golfbet.com, nową stronę bukmacherską, ponieważ jesteś znany zarówno z programowania, jak i zakładów sportowych. Twoim zadaniem jest napisanie programu lub funkcji, które mogą odgadnąć zwycięzcę meczu. Oczywiście wszyscy zgadują inaczej, to nie ma znaczenia, dopóki twoje domysły są spójne.

Jeśli nie chcesz zgadywać, możesz użyć następujących domysłów:

BRA
        BRA
CHI
                BRA
COL
        COL
URU
                        GER
FRA
        FRA
NGA
                GER
GER
        GER
ALG
                                        GER
NED
        NED
MEX
                NED
CRC
        CRC
GRE
                        ARG
ARG
        ARG
SUI
                ARG
BEL
        BEL
USA
  1. Program musi generować tego samego zwycięzcę bez względu na kolejność drużyn (zwycięzca meczu BRA-CHI musi być taki sam jak w meczu CHI-BRA)
  2. Jeśli drużyna przegra, nie może rozegrać więcej meczów. Oznacza to, że w przypadku meczów, które się nie odbywają, należy to zaznaczyć. Na przykład, jeśli Twój program zgadnie, że Brazylia wygra mecz BRA-CHI, wówczas CHI-GER musi zwrócić „brak wyniku”, ponieważ Chile nie zagra z Niemcami. Zobacz powyższy link do harmonogramu.

Dla uproszczenia nie musisz mierzyć się z brązowym pojedynkiem (ale możesz oczywiście).

Twój program lub funkcja przyjmuje dwa ciągi jako dane wejściowe: 3-literowy kod kraju dwóch drużyn i zwraca kod kraju zwycięskiej drużyny (możesz użyć standardowego wejścia / wyjścia lub dwóch parametrów funkcji / wartości zwracanej). Jeśli podane dwie drużyny nie będą grać zgodnie z twoimi domysłami, musisz zwrócić coś innego (może to być dowolny kod kraju, np. Pusty ciąg, zero, komunikat o błędzie). Możesz założyć, że dane wejściowe są prawidłowe (dwa różne kody krajów, które są na liście).

Jest to przede wszystkim golf-code, więc wygrywa najkrótszy program w bajtach. Cenne są jednak ładne i trudne rozwiązania.

Przykład (oczywiście możesz sam zgadywać):

wejście: BRA CHI wyjście: BRA

wejście: CHI BRA wyjście: BRA

wejście: wyjście CHI GER: brak wyniku

David Frank
źródło
Powinien być [podstępny], który generuje losowe domysły, ale zawsze pozwól swojej ulubionej drużynie wygrać;) (Jak w: generuje losowe drzewko zgadywania)
ɐɔıʇǝɥʇuʎs
@ codıʇǝɥʇuʎs codegolf.stackexchange.com/questions/32092/... Ten jest bardzo podobny do tego
David Frank
4
@ ɐɔıʇǝɥʇuʎs, to jest o wiele bardziej interesujące. Dostajemy przestrzeń możliwych programów, mniej więcej odpowiadającą funkcjom mieszającym w zestawie trzech elementów, i musimy znaleźć najmniejszy program, który jest równoważny każdemu programowi w tej przestrzeni.
Peter Taylor
1
Można założyć, że wejście będzie ważne czy będzie BRA BRAi HAZ CHEEZBURGERmusi być prawidłowo obsługiwane?
Dennis
@Dennis zobacz moją edycję - dane wejściowe są zawsze aktualne
David Frank

Odpowiedzi:

6

Python 2.x - 368 283

Ciekawe wyzwanie. Oczywiście musimy uzyskać aktualne rankingi od FIFA . Brazylia ma tak zwanego „12. mężczyznę”, ponieważ ma przewagę domową, a zatem waga 12/11.

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=[1242*12/11,1026,1137,1147,913,640,858,1300,882,981,762,1064,1175,1149,1074,1035]
m={}
for n in[16,8,4,2]:
 j=0
 for k in range(0,n,2):
  s=a[k] if d[k]>d[k+1] else a[k+1]
  m[a[k]+' '+a[k+1]]=s
  a[j]=s    
  j+=1
def f(s): 
 try: print m[s] 
 except: print 'no result'   

Wskazówki dotyczące skrócenia powyższego są mile widziane :-).

Ulepszenia dzięki @TheRare i @MrLemon

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7
m={}
for n in 16,8,4,2:
 j=0
 for k in range(0,n,2):s=a[k]if d[k]>d[k+1]else a[k+1];m[a[k]+' '+a[k+1]]=s;a[j]=s;j+=1     
def f(s):print s in m and m[s]or'no result'

Prowadzi to do następujących wyników:

BRA CHI: BRA
COL URU: URU
FRA NGA: FRA
ALG GER: GER
MEX NED: NED
CRC GRE: GRE
ARG SUI: ARG
BEL USA: BEL
------------
BRA URU: BRA
FRA GER: GER
NED GRE: GRE
ARG BEL: ARG
------------
BRA GER: BRA
GRE ARG: ARG
------------
BRA ARG: BRA

Przykładowe wywołania:

f('BRA MEX')
no result
f('BRA CHI')
BRA
Willem
źródło
1. Nie używasz j(zawsze wynosi zero). 2. for kmożna zapisać w jednym wierszu za pomocą ;separatora. 3. Nie potrzebujesz spacji po słowach kluczowych takich jak trylub except4. Możesz usunąć spacje między nawiasami i słowami kluczowymi ( a[k]if d[k]>d[k+1]else a[k+1]jest ważny) 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
patrz
@ TheRare On używa j, ale występuje niewielki błąd formatowania przy j+=1. [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]Oczywiście możesz zapisać wiele znaków, ponownie kodując dane FIFA .
MrLemon
@ MrLemon Ach, sam nie próbowałem kodu, tylko na niego spojrzałem.
patrz
5

C, 182 178 133 (lub 126)

Nie jest to najkrótszy program tutaj, ale jest to najkrótszy, w którym można łatwo zmienić prognozę. Teraz, gdy wszyscy półfinaliści są znani, aktualizuję.

Istnieją również pewne zmiany w kodzie. Oprócz sugestii Dennisa w komentarzach program został przekonwertowany na funkcję (ponieważ przy ponownym czytaniu jest to dozwolone przez reguły), a skrót został skrócony.

Kod, 133

f(char*a,char*b){
  char*p,*t=" HIAEAIH N?=R=?N ;@4S4@; 5BDGDB5 B@?I?@B",h[3]={*a-a[1]%16,*b-b[1]%16};
  (p=strstr(t,h))&&puts(p-t&2?a:b);
}

Jak to działa

dane wejściowe ai bsą mieszane przez wyrażenie *a-a[1]%16do pojedynczego znaku ( *ajest to krótszy odpowiednik a[0]). Wyniki mieszania dla zespołów ai bsą przechowywane w h. Na przykład staje się BRA CHI @;. Wartości skrótów są następujące (potwierdzeni półfinaliści i mój przewidywany mistrz są oznaczeni *.)

GRE E   CRC A   *NED I   MEX H
USA R   BEL =   *ARG ?   SUI N
URU S   COL 4  **BRA @   CHI ;
NGA G   FRA D   *GER B   ALG 5

t[]przechowuje moje prognozy. Wyniki rundy 16 i ćwierćfinałów są już znane. Każda grupa 4 drużyn jest uporządkowana w taki sposób, że 1. i 4. zostały wyeliminowane, a 3. to półfinalista. Podobnie z półfinalistami, przewiduję, że 1. i 4. zostaną wyeliminowane, a 3. półfinalista będzie ogólnym zwycięzcą. Jeśli nie zgadzasz się z moimi przewidywaniami, po prostu uporządkuj tabelę.

Prognozy są przechowywane w blokach palindromicznych, aby uwzględnić możliwość wejścia użytkownika do zespołów w dowolnej możliwej kolejności. Kolejność składa zwycięskie zespoły z każdego zestawu 4, aby rozegrać trzeci mecz. Tak więc w pierwszej grupie GRE Eprzegrał z CRC, a MEX Hprzegrał z NED. To ustawia CRC Ado grania w NED Iw ćwierćfinale bez konieczności powtarzania pisania. Ciąg jest wypełniony spacją między każdą grupą 4 drużyn / 7 znaków, aby zapewnić, że nie ma wyjścia dla zespołów, które nie będą ze sobą grać.

Zwycięzca każdej możliwej meczu w każdej grupie 8 znaków jest następująca: invalid,b,a,a,b,b,a,invalid. Tak więc prawidłowego wyboru zwycięzcy można dokonać, zajmując pozycję hw t AND 2 . Niestety strstrfunkcja nie jest najłatwiejsza, ponieważ zwraca wskaźnik p, więc musimy odjąć pod, taby uzyskać rzeczywistą pozycję w t.polu Jeśli dopasowanie jest nieprawidłowe (nie można go znaleźć w t), pwynosi zero i wyrażenie no resultjest drukowane.

Pewne wątpliwe ulepszenia, 126

2 znaki zapisane przez ulepszone wyrażenie mieszające. Niestety wymaga to, aby przypadki zespołów były takie, jak pokazano w programie testowym poniżej funkcji (np. BraZamiast BRAjak w powyższym programie). Uświadomiłem sobie, że nie ma możliwości zrobienia tego z jednym operatorem, więc 2 operatory i stała jednego znaku są tak dobre, jak to tylko możliwe. Zauważ też, że Urumapowanie na spacetak alternatywny znak |jest potrzebne do oddzielenia grup kodów drużynowych.

5 znaków zapisanych przez wyeliminowanie ti traktowanie ciągu prognozy jako dosłownego. Oznacza to, że nie można znać adresu, pod którym przechowywany jest ciąg. Jednak pod warunkiem, że nie jest on zapisany jako zero, jesteśmy zainteresowani, p&2więc kod będzie działał, jeśli adres będzie podzielny przez 4. (Uwaga: nie można traktować wskaźnika pbezpośrednio jako liczby całkowitej, należy go odjąć od innego wskaźnika Używam wskaźnika, awięc amusi być podzielny przez 4.) Można być pewnym, że 32 lub 64-bitowe ciągi kompilatora / architektury będą przechowywane w ten sposób. Działa to dla mnie dobrze na GCC / cygwin, chociaż odmawia kompilacji na Visual Studio / Windows.

g(char*a,char*b){
  char*p,h[3]={*a^a[1]+3,*b^b[1]+3};
  (p=strstr("|%&626&%|+4*#*4+|(71 17(|./3$3/.|/74&47/",h))&&puts(p-a&2?a:b);
}

main(){
  char team[16][4]={"Gre","Crc","Ned","Mex", "Usa","Bel","Arg","Sui", "Uru","Col","Bra","Chi", "Nga","Fra","Ger","Alg"}; 
  int i;
  for(i=1;i<16;i++){printf("%s %s \n",team[i-1],team[i]);g(team[i],team[i-1]);g(team[i-1],team[i]);}  
}
Level River St
źródło
Ciekawe podejście! Można zaoszczędzić kilka bajtów usuwając przestrzeń pomiędzy chara *pi zastąpienie a[0], b[0]i h[0]z *a, B` i *h. Pytanie mówi również, że * jeśli podane dwie drużyny nie będą grać zgodnie z twoimi domysłami, musisz zwrócić coś innego (może to być dowolny kod kraju, np. Pusty ciąg, null, komunikat o błędzie) , więc wydrukowanie wyniku nie jest nie wymagane i można zastąpić puts(...)z (p=strstr(t,h))&&puts(p-t&2?a:b).
Dennis
Dzięki za wskazówki, szczególnie a[0]->*a! Wkrótce się zaktualizuje. Zastanawiam się, czy jest jakiś sposób na uzyskanie dostępu do tablicy wielowymiarowej z jednym numerem? Napisałem tę wersję wiersza poleceń o identycznej długości (można zaoszczędzić 1 bajt za pomocą a #define.) Byłoby miło unikać podwójnych indeksów dolnych w tym i podobnych przypadkach:char *p,h[2],*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK";main(int c,char**v){h[0]=v[1][1]*3-v[1][0]*2;h[1]=v[2][1]*3-v[2][0]*2;puts((p=strstr(t,h))?v[1+!(p-t&2)]:"no result");}
Level River St
1. Znalazłem mały błąd. hpowinien być zakończony zerem, więc musi być h[3]. 2. Jeśli ustawisz p=v[1], możesz uzyskać dostęp v[i][j]jako p[4*(i-1)+j]. Działa na moim komputerze, ale nie wiem, czy jest przenośny ... 3. Powinieneś być w stanie zainicjować, hjeśli zadeklarujesz go w środku main:main(int c,char**v){char*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK",*p=v[1],h[3]={p[1]*3-*p*2,p[5]*3-p[4]*2};(p=strstr(t,h))&&puts(v[1+!(p-t&2)]);}
Dennis
@Dennis Twój kod działa poprawnie zarówno na GCC / cygwin, jak i VS / Windows na moim komputerze. for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])Powtarza również echo każdego wiersza polecenia do wydrukowania w VS, ale w GCC nazwa programu to 0, pierwszy argument to 40, a drugiego argumentu nigdzie nie widać (podniosłem do 1000). Ciekawe. W każdym razie zmieniłem się na funkcję, która jest zgodna z zasadami, oprócz aktualizacji moich prognoz (tylko czekałem na dzisiejszy wynik, aby je potwierdzić przed opublikowaniem.) Jeszcze raz dziękuję i powodzenia we wtorek z Brazylią.
Level River St
3

JavaScript 215 206 120 116

Dużo miejsca na ulepszenia:

ES5 - 215

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter(function(x){return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)


ES6 - 206

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter((x)=>{return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)

Podejście regex - 116

Dzięki ɐɔıʇǝɥʇuʎs za opublikowanie tego linku pomogło mi to w tworzeniu wyrażenia regularnego

a=prompt().split(' ').sort();a.join('').match(/LG(.R(A|G)|GE)|RG(S|BE|CR)|ELUS|AC(H|O)|OLUR|CGR|CM|FRANG|XNE/)&&a[0]
William Barbosa
źródło
1
Możesz skrócić swoje rozwiązania, przechodząc split(' ')do split``i join('')do join``.
Arjun
2

Python ( 179 148 139 cq zdecydowanie za długi)

f=lambda *l:sorted(l)[0]if"".join(sorted(l))in"BRACHI COLURU FRANGA ALGGER MEXNED CRCGRE ARGSUI BELUSA BRACOL ALGFRA CRCMEX ARGBEL BRAFRA CRCMEX ARGBEL BRAFRA ARGCRC ARGBRA"else 0

Wszyscy wiedzą, że kraj o nazwie, która jest pierwsza w alfabecie, wygra. (Ta odpowiedź istnieje tylko po to, żeby zacząć.)

Dzięki dobroczynności faceta (ów) tutaj mogłem nieco skrócić moją odpowiedź:

import re;f=lambda *l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|^BRACHI$|^FRANGA$|^BRACOL$',"".join(sorted(l)))else 0

Zakłada to prawidłowe drużyny, ale nie potrzebuje prawidłowego składu ( f('BRA','NED')zwróciłoby 0 (nieprawidłowe dopasowanie), ale f('XNE')powróciłoby 'XNE'. Nie mam pytania, że ​​jest to problem. Zapraszam do ponownego wykorzystywania) to wyrażenie regularne według własnego uznania.

Dzięki @Ventero, nic nie wiem o wyrażeniach regularnych.

import re;f=lambda*l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|BRACHI|FRANGA|BRACOL',"".join(sorted(l)))else 0
.ıʇǝɥʇuʎs
źródło
Prawdopodobnie chcesz re.searchw wersji golfowej, nie re.match. Powinieneś także móc upuścić kotwice ^i $.
Ventero
2

Scala (150)

type s=String;var m=Map[s,s]();def f(x:(s,s))={var a=x._1;var b=x._2;if(b<a){b=a;a=x._1};if(m.getOrElse(a,a)=="")m.getOrElse(b,b)else{m=m+(b->"");a}}

Możliwe są mecze pomiędzy „foo” i „bar”, również drużyny, które nie będą grać przeciwko sobie w pierwszych rundach, uzyskają wynik (na przykład zaczynając od BRA, ARG)

To tylko nagrywanie przegranych drużyn.

type s=String //just aliasing for saving characters
var m=Map[s,s]() //map for storing loosing teams, a set would do too
def f(x:(s,s))={
  var a=x._1 var b=x._2
  if(b<a){b=a;a=x._1};//swap if b<a lexographically
  if(m.getOrElse(a,a)=="")//if a has loosed previously
     m.getOrElse(b,b)// return b if b was not in the map else return ""
  else{
    m=m+(b->"") //add b to the map, because a will definitly win this amazing match
    a //and return a
  }
}

Dzwoni z:

f(("GER","BRA"))
thg gg
źródło
2

PowerShell ( 261221 )

$a=Read-Host;$b=Read-Host;$x="CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA";0..($x.Length-2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)};$x|?{"$a$b","$b$a"-eq$_}|%{$_.Substring(3);exit};0

Jako stosunkowo nowy użytkownik programu PowerShell uważam, że potok jest absolutnie niesamowity. Myślę, że następnym razem może być próba manipulowania tablicą w celu wyeliminowania wszystkich wywołań podłańcuchowych. (Musiałem dodać połączenie na końcu, bo w przeciwnym razie oba zespoły uzyskały wynik)

Nowy członek, pierwsza próba golfa kodowego!

Mógłbym zakodować ćwierćfinał, półfinały i finały, aby uratować kilka postaci, ale to nie byłoby tak zabawne.

Powinien być wystarczająco prosty do rozszyfrowania, ale spełnia oba warunki: daje tego samego zwycięzcę> niezależnie od wprowadzonego zamówienia i zwraca zwycięzcę tylko dla meczów, które faktycznie mają miejsce>!

Wszelkie porady dotyczące ulepszeń będą mile widziane, dzięki!

Oryginalny

$a=Read-Host;$b=Read-Host;$x=("CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA");for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}foreach($i in $x){if($i-match$a-and$i-match$b){return $i.Substring(3)}}return 0
fuandon
źródło
1
Kilka rzeczy (naprawienie tego całkowicie zajmie dużo więcej czasu): Nie pisz PowerShell tak, jakby to był C lub C #. Oznacza to, że returnw większości przypadków nie jest konieczne. foreacha najbardziej wyraźne pętle są przereklamowane i bezużyteczne. Metody takie .Substringpowinny być stosowane tylko w ekstremalnych okolicznościach (i chociaż można zastanowić się nad użytecznością futbolu, nie jest to sport ekstremalny). Zasadniczo chcesz korzystać z potoku w jak największym stopniu.
Joey
1
Zamiast pisać rozwlekły forpętlę jak for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}można po prostu użyć rurociągu o zakresie i ForEach-Object(alias %) 0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}. Uważnie zastanawiając się nad tym, jak reprezentowane są Twoje dane, bardzo prawdopodobne jest, że pozbędziesz się Substringpołączeń. Nawiasy wokół początkowej tablicy są niepotrzebne. W przypadku większych tablic sensowne może być także użycie znaku separatora i użycie -split(unary, -splitw przypadku gdy separatorem jest spacja lub tabulator).
Joey
1
Ostateczna foreachpętla na przykład można zapisać w postaci rurociągu, jak również ( ?jest Where-Object): $x|?{$_-match$a-and$_-match$b}|%{$_;exit};0który zasadniczo mówi »Filtr każdy element $xdo tego, czy jest on zgodny zarówno $aa $bi wyjście pierwszy, wychodząc później. Jeśli nie można znaleźć żadnego, należy wyprowadzić wartość 0. «. Ponieważ znasz format swoich ciągów, możesz też po prostu użyć -match"$a$b|$b$a". Ponieważ muszą one występować w dowolnej kolejności w ciągu. Co oznacza również, że możemy tutaj zastosować małą sztuczkę: zagrać "$a$b","$b$a"-eq$_w golfa jeszcze jednym bajtem.
Joey
2

CJam, 64 58 bajtów

lS/$_0=\:+4b256b1>:ca"oM-YtM-mM-^@}gM-^VM-^U8tM-=nM-^MfM-]oM-xgM-)tM-|m@gim{g_"2/&,*

W powyższym przykładzie użyto karetki i notacji M. Ponieważ kod zawiera znaki niedrukowalne.

Kosztem sześciu dodatkowych bajtów można uniknąć tych znaków:

lS/$_0=\:+4b95b1>32f+:c"I8Vyv)2~N{VIEh1$IW32W)B82QBs2G"2/N*\#W>*

Wypróbuj online.

Testowe uruchomienie

$ base64 -d > worldcup.cjam <<< \
> bFMvJF8wPVw6KzRiMjU2YjE+OmNhIm/ZdO2AfWeWlTh0vW6NZt1v+GepdPxtQGdpbXtnXyIyLyYsKg==
$ wc -c worldcup.cjam
58 worldcup.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(LANG=en_US cjam worldcup.cjam <<< "$A $B")
> done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Jak to działa

lS/$    " Read one line from STDIN, split at spaces and sort the resulting array.         ";
_0=\    " Extract the first element of a copy of the array and swap it with the array.    ";
:+      " Concatenate the strings.                                                        ";
4b      " Convert the resulting string into an integer by considering it a base 4 number. ";
256b    " Convert the integer into an array by considering it a base 256 number.          ";
1>:ca   " Drop the first element, convert into a string and create a singleton array.     ";
"…"     " Push a string of all matches encoded as explained above.                        ";
2/      " Split the string into an array of two-character strings.                        ";
&       " Intersect the two arrays. If the array is non-empty, the teams play.            ";
,*      " Multiply the string on the stack by the length of the array.                    ";
Dennis
źródło
Powinieneś dodać rozmiar skryptu bash do rozmiaru programu CJam, aby być sprawiedliwym.
David Frank
1
@DavidFrank: Dołączyłem skrypt Bash, aby pokazać dowód, że mój program zapewnia dane wyjściowe tylko dla 15 dopasowań, które mają miejsce. Działa samodzielnie i nie wymaga żadnych zewnętrznych programów.
Dennis
2

CJam, 49 48 bajtów

lS/$_0="^\16@&^^/+(^]^W^Y,>O?"{_2%+}3*@{2b91%c}%#1&!*

W powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne.

Kosztem dwóch dodatkowych bajtów można uniknąć tych znaków:

lS/$_0="(=BL2*;74)#%8J[K"{_2%+}3*@{2b91%C+c}%#1&!*

Wypróbuj online.

Testowe uruchomienie

$ base64 -d > wc.cjam <<< bFMvJF8wPSIcMTZAJh4vKygdFxksPk8/IntfMiUrfTMqQHsyYjkxJWN9JSMxJiEq
$ wc -c wc.cjam
48 wc.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(cjam wc.cjam <<< "$A $B"); done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

tło

Zaczynamy od przypisania i ASCII znaku każdej drużynie, rozważając jego nazwę jako podstawową liczbę 2, biorąc wynikową liczbę całkowitą modulo 91, dodając 12 (aby uniknąć znaków niedrukowalnych) i wybierając znak odpowiadający wynikowemu kodowi ASCII. W kodzie CJam jest to osiągane przez 2b91%c.

Na przykład kody znaków ALGto 65 76 71. Od (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40a 40, jeśli kod znaku z (.

Daje to następujące mapowanie:

ALG (    ARG 4    BEL #    BRA 2    CHI *    COL ;    CRC 8    FRA B
GER =    GRE J    MEX [    NED K    NGA L    SUI )    URU 7    USA %

Teraz możemy zakodować mecze rundy 16 w następujący sposób:

(=BL2*;74)#%8J[K

Jeśli założymy, że pierwsza drużyna w kolejności alfabetycznej zawsze wygrywa, mecze ćwierćfinałów są następujące:

(B2;4#8[

Zauważ, że ten ciąg można uzyskać od pierwszego, wybierając co drugi znak, zaczynając od pierwszego. W kodzie CJam jest to osiągane przez 2%.

Stosując ten sam pomysł, mecze półfinałów i mecz finałowy są następujące:

(248
(4

Kod

"(=BL2*;74)#%8J[K"{_2%+}3*

wypycha ciąg zawierający dopasowania z rundy 16, a następnie wykonuje trzykrotnie: duplikuje ciąg, wyodrębnia co drugi znak kopii, konkatenuje. Wynikiem jest ciąg

(=BL2*;74)#%8J[K(B2;4#8[(B2;4#8[(248(B2;4#8[(248(248(4

który zawiera wszystkie dopasowania (niektóre z nich więcej niż raz).

Jak to działa

lS/$        " Read one line from STDIN, split at spaces and sort the resulting array.     ";
_0=         " Extract the first element of a copy of the array.                           ";
"…"         " Push the string containing the matches of the round of 16.                  ";
{_2%+}3*    " Push the remaining matches.                                                 ";
@           " Rotate the input array on top of the stack.                                 ";
{2b91%C+c}% " Perform the mapping for each team in the input array.                       ";
#           " Push the index of the match in the array of all matches (-1 for not found). ";
1&!         " Push 1 if the index is even (valid match) and 0 if it is odd.               ";
,*          " Repeat the string on the stack that many times.                             ";
Dennis
źródło
To niesamowite, co robisz z Cjam. Ilekroć myślę, że możesz pożyczyć jeden z moich pomysłów, wymyślisz coś lepszego! twój kod prognozy "(=BL2*;74)#%8J[K"{_2%+}3*ma taką samą długość jak niepalindromiczna forma mojego ciągu predykcji, "rRgL j9Ab 35ph tYKO gApK"ale o wiele łatwiejszy w obsłudze.
Level River St
0

JavaScript 271

t=prompt('Match?').split('-')
x=t[0],y=t[1],T='BRACHICOLURUFRANGAGERALGNEDMEXCRCGREARGSUIBELUSA'
v='\n',R='',W='No Game'
for(z=1;T!='USA';++z,T=n){R+=v+z+v,n='',r=/(...)(...)/g
while(m=r.exec(T))a=m[1],n+=b=m[2],R+=a+'-'+b+v,W=a==x&&b==y||a==y&&b==x?b:W
}
alert(W+'\n'+R)
wolfhammer
źródło