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
- 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)
- 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
BRA BRA
iHAZ CHEEZBURGER
musi być prawidłowo obsługiwane?Odpowiedzi:
Python 2.x -
368283Ciekawe 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.
Wskazówki dotyczące skrócenia powyższego są mile widziane :-).
Ulepszenia dzięki @TheRare i @MrLemon
Prowadzi to do następujących wyników:
Przykładowe wywołania:
źródło
j
(zawsze wynosi zero). 2.for k
można zapisać w jednym wierszu za pomocą;
separatora. 3. Nie potrzebujesz spacji po słowach kluczowych takich jaktry
lubexcept
4. 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,2
6.def f(s):print s in m and m[s]or'no result'
j
, ale występuje niewielki błąd formatowania przyj+=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 .C,
182 178133 (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
Jak to działa
dane wejściowe
a
ib
są mieszane przez wyrażenie*a-a[1]%16
do pojedynczego znaku (*a
jest to krótszy odpowiednika[0]
). Wyniki mieszania dla zespołówa
ib
są przechowywane wh
. 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*
.)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
E
przegrał z CRC, a MEXH
przegrał z NED. To ustawia CRCA
do grania w NEDI
w ć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ęh
wt
AND 2 . Niestetystrstr
funkcja nie jest najłatwiejsza, ponieważ zwraca wskaźnikp
, więc musimy odjąćp
od,t
aby uzyskać rzeczywistą pozycję wt.
polu Jeśli dopasowanie jest nieprawidłowe (nie można go znaleźć wt
),p
wynosi zero i wyrażenieno result
jest 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.
Bra
ZamiastBRA
jak 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ż, żeUru
mapowanie naspace
tak alternatywny znak|
jest potrzebne do oddzielenia grup kodów drużynowych.5 znaków zapisanych przez wyeliminowanie
t
i 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&2
więc kod będzie działał, jeśli adres będzie podzielny przez 4. (Uwaga: nie można traktować wskaźnikap
bezpośrednio jako liczby całkowitej, należy go odjąć od innego wskaźnika Używam wskaźnika,a
więca
musi 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.źródło
char
a*p
i zastąpieniea[0]
,b[0]
ih[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)
.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");}
h
powinien być zakończony zerem, więc musi byćh[3]
. 2. Jeśli ustawiszp=v[1]
, możesz uzyskać dostępv[i][j]
jakop[4*(i-1)+j]
. Działa na moim komputerze, ale nie wiem, czy jest przenośny ... 3. Powinieneś być w stanie zainicjować,h
jeśli zadeklarujesz go w środkumain
: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)]);}
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ą.JavaScript
215 206 120116Dużo miejsca na ulepszenia:
ES5 - 215
ES6 - 206
Podejście regex - 116
Dzięki ɐɔıʇǝɥʇuʎs za opublikowanie tego linku pomogło mi to w tworzeniu wyrażenia regularnego
źródło
split(' ')
dosplit``
ijoin('')
dojoin``
.Python (
179148139 cq zdecydowanie za długi)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ź:
Zakłada to prawidłowe drużyny, ale nie potrzebuje prawidłowego składu (
f('BRA','NED')
zwróciłoby 0 (nieprawidłowe dopasowanie), alef('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.
źródło
re.search
w wersji golfowej, niere.match
. Powinieneś także móc upuścić kotwice^
i$
.Scala (150)
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.
Dzwoni z:
źródło
PowerShell (
261221)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)
Oryginalny
źródło
return
w większości przypadków nie jest konieczne.foreach
a najbardziej wyraźne pętle są przereklamowane i bezużyteczne. Metody takie.Substring
powinny 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.for
pętlę jakfor($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 iForEach-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ęSubstring
połą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,-split
w przypadku gdy separatorem jest spacja lub tabulator).foreach
pętla na przykład można zapisać w postaci rurociągu, jak również (?
jestWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
który zasadniczo mówi »Filtr każdy element$x
do tego, czy jest on zgodny zarówno$a
a$b
i 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.CJam,
6458 bajtówW 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:
Wypróbuj online.
Testowe uruchomienie
Jak to działa
źródło
CJam,
4948 bajtówW powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne.
Kosztem dwóch dodatkowych bajtów można uniknąć tych znaków:
Wypróbuj online.
Testowe uruchomienie
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
ALG
to65 76 71
. Od(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
a 40, jeśli kod znaku z(
.Daje to następujące mapowanie:
Teraz możemy zakodować mecze rundy 16 w następujący sposób:
Jeśli założymy, że pierwsza drużyna w kolejności alfabetycznej zawsze wygrywa, mecze ćwierćfinałów są następujące:
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:
Kod
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
który zawiera wszystkie dopasowania (niektóre z nich więcej niż raz).
Jak to działa
źródło
"(=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.JavaScript 271
źródło