Alice i Bob grają w małą grę. Najpierw rysują drzewo z węzła głównego (oznaczonego grubą kropką), bez wewnętrznych węzłów, z liczbami na liściach. Dowolny węzeł może mieć dowolną liczbę dzieci.
Zaczynamy od zera, a pierwsza gra to Alice (A). Musi wybrać jedno z dzieci bieżącego węzła. Potem jest kolej Boba i on podobnie wybiera węzeł potomny. Trwa to do momentu osiągnięcia węzła liścia.
Po osiągnięciu węzła liścia gra się kończy. Celem Alicji jest zakończenie w węźle o możliwie największej wartości, a celem Boba jest zakończenie w węźle o możliwie małej wartości.
Biorąc pod uwagę drzewo w formie zagnieżdżonej tablicy, zwróć wartość liścia, która zostanie osiągnięta, jeśli zarówno Alice, jak i Bob będą grać doskonale.
Przykłady:
18: [[67, [[100, [[67, 47], [86], 21, 16], [[46, [14], 35, 85], [71, [18, 63, 69], 99, 22], 3]]], [[18, 32, 42, 80]], [[36, 70], [86, 53, 46, 59], [[41], 86, 35]]], 3]
60: [[[84, 35], [44, 60]], [[24, 98], [16, 21]]]
58: [[53, 77], [58, [82, 41]], 52]
59: [[93, [100, 53], 58, 79], [63, 94, 59], [9, [55, 48]], [40, 10, 32]]
56: [[20, 10, [[[89, 22, 77, 10], 55], [24, 28, 30, 63]]], [[49, 31]], 17, 56]
0: [0]
Możesz założyć, że węzeł główny nigdy nie jest węzłem liścia i wskazuje co najmniej jeden węzeł liścia. Możesz założyć, że liście są liczbami nieujemnymi.
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Galaretka , 7 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Wykorzystuje algorytm z odpowiedzi @ xnor . Dla celów porównawczych prostsze podejście, które na przemian oblicza minima i maksima, waży 8 bajtów :
Jak to działa
źródło
Python 2, 53 bajty
Główne pytanie brzmi: jak zmieniać na przemian
max
imin
każda warstwa. Korzystając z faktumax(l) == -min([-x for x in l])
, że zamiast tego negujemy każdą drugą warstwę i powtarzamy z-min
. Zanegować każdą drugą warstwę, mijamy dół mnożnikc
że zastępcy+1
i-1
, a gdy dojdziemy liść, dostosowujemy swoją wartość przez mnożnik. Rozumiemy, że jesteśmy na liściu poprzez warunekl<[]
, ponieważ Python 2 traktuje liczby jako mniej niż listy.Trudno jest skrócić
else/if
trójskładnikową, ponieważ każda gałąź może dać wartość Prawda (niezerowa) lub Falsey (zero).źródło
JavaScript (ES6), 53 bajty
Stosuje podobne podejście do odpowiedzi @ xnor. Jeśli liczby są niezerowe, to tylko 49 bajtów:
źródło
Pyth, 21 bajtów
Moja pierwsza odpowiedź na Pythona! Dzięki Dennis za pomoc :).
źródło
mgd_H
może byćgR_H
. Ponadto, zamiast definiowania funkcji można pobierać dane zQ
i wymienićLgb1
zgQ1
.Mathematica, 13 bajtów
lub równoważnie
To zwraca wartość do nienazwanej funkcji, która pobiera drzewo i zwraca wynik.
Jest to w zasadzie to samo, co rozwiązanie xnor: na każdym poziomie zamieniamy znak listy i wynik i używamy
Min
do końca. W Mathematica okazało się to niesamowicie golfowe, ponieważ:Min
może przyjmować pojedyncze numery lub listy, a nawet kilka list. Po prostu daje ci minimalną wartość we wszystkich swoich argumentach. Oznacza to, że działa zarówno na listach, jak i liściach (gdzie po prostu zwraca liść)./@
co jest skrótem odMap
bardzo ogólnej funkcji wyższego rzędu w Mathematica. Nie tylko mapuje funkcję na listach, ale może mapować dowolne wyrażenie. Liczby są takim wyrażeniem, ale nie zawierają żadnych elementów do odwzorowania. Oznacza to, że możemy bezpiecznie zamapować dowolną funkcję na liczby, co wcale nie wpływa na liczbę.Obie te rzeczy razem oznaczają, że możemy napisać kod bez żadnych warunków, ponieważ
Min
iMap
operacje nie działają na liczbach, a następnie dwie negacje anulują się, dzięki czemu funkcja staje się tożsamością po podaniu liczby.Wreszcie dzięki
#0
Mathematica można pisać bezimienne funkcje rekurencyjne, co pozwala zaoszczędzić jeszcze kilka bajtów.źródło
Rubinowy, 46 bajtów
Użyto sztuczki @ xnor z
min
naprzemiennie między maks. I min.źródło
Julia,
2725 bajtówWykorzystuje algorytm z odpowiedzi @ xnor . Wypróbuj online!
źródło