N dzieci, z których nie ma dwóch identycznych rozmiarów, są ustawione w jednej kolejności. Każdy może porównać wysokość tylko z najbliższymi sąsiadami. Kiedy nauczyciel krzyczy „podnieś ręce, jeśli jesteś najwyższy”, robi to, jeśli są oni wyżsi niż obaj sąsiedzi, i robią to jednocześnie. Jeśli tylko ktoś podniesie rękę, wygrywa. Jeśli więcej niż jeden podniesie ręce, wszyscy zostaną wyeliminowani z rzędu (zachowując kolejność reszty dzieci) i powtórzą ten proces.
Napisz program, który pobiera tablicę różnych liczb całkowitych (możesz założyć, że są one ściśle dodatnie) i wypisuje zwycięzcę tej gry. To jest golf golfowy, więc wygrywa najkrótszy kod.
Przykłady (z pokazanymi etapami pośrednimi):
5 3 9 8 7 → 3 8 7 → 8
1 2 9 4 → 9
9 3 8 7 4 12 5 → 3 7 4 5 → 3 4 → 4
Obecni liderzy:
- Galaretka: 17 bajtów [autor Dennis ♦]
- MATL: 20 bajtów [autor: Luis Mendo]
- APL: 28 bajtów [voidhawk]
- k: 40 bajtów [autor: Paul Kerrigan]
Trwa także bitwa Pytonów. Wciąż czekam na pojawienie się większej liczby języków golfowych.
Obecnie zaakceptowałem odpowiedź Dennisa ♦ - jeśli są nowi zwycięzcy, zaktualizuję wybór.
Odpowiedzi:
Galaretka , 17 bajtów
Dane wejściowe to ciąg liczb całkowitych oddzielonych przecinkami.
Wypróbuj online!
Podziękowania dla @Xanderhall, @Sherlock i @ErikGolfer za położenie fundamentów.
Jak to działa
źródło
JavaScript (ES6),
787672 bajtówDzięki @ edc65 za -4 bajty
Pobiera tablicę liczb całkowitych i wysyła tablicę zawierającą tylko zwycięzcę.
Testowy fragment kodu
Pokaż fragment kodu
Oto kilka innych prób, wykorzystujących
.filter
i zestawień tablicowych:Lub podwójnie zapętlona, strasznie długa:
Wyjaśnienie
Sposób, w jaki to działa, jest dość prosty: buduje tablicę tych, którzy są stosunkowo wyżsi (
r
) i tablicę tych, którzy nie są (q
), a następnie zwraca,r
jeśli ma tylko jeden element; jeśli nie, uruchamia sięq
i zwraca wynik.źródło
q
ir
. Unikniesz tego,&&r
a wyrażenie filtrujące również okazuje się krótszym bajtem.MATL , 20 bajtów
Dane wejściowe to wektor kolumny za pomocą
;
jako separator.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Jest to bezpośrednie wdrożenie procedury opisanej w wyzwaniu. A
do
...while
pętla utrzymuje usuwanie elementów, dopóki tylko jeden został usunięty; i to jest wyjście.Elementy do usunięcia są wykrywane poprzez pobranie różnic, podpisanie, a następnie różnic. Te, które dają wartość ujemną, należy usunąć.
źródło
Python3,
265260248243203121117112111 bajtówDziękuję @ZacharyT, @orion i @mathmandan za uratowanie
545dużo bajtów!źródło
Haskell, 85 bajtów
Przykład użycia:
f [9,3,8,7,4,12,5]
->4
.Jak to działa:
Wariant, również 85 bajtów:
Powiąż listę
b
(patrz wyżej) z n i zwróć element,s
jeślix\\n
jest listą singletonów i wf n
przeciwnym razie.źródło
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
nadal wymaga importu. Btw,tails
może również zostać zastąpione...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 bajtówWyjaśnienie
First, set
x
andy
equal to the inputList
. The loop continues untilLength@y==1
.x~Split~Less
is the list of lists of consecutive, increasing elements,Split[x,#>#2&]
is the list of lists of consecutive, decreasing elements. Taking theMax
of all of the lists in the former gives the list of children taller than the child to their right (along with the right-most child). Taking the first argument (#&
) of all of the lists in the latter gives the list of children taller than the child to their left (along with the left-most child). The intersection of these two will be the list of children who raised their hand. Set this equal toy
.x=DeleteCases[x,#|##&@@y]
removes fromx
any elements matching an element ofy
(#|##&
is equivalent toAlternatives
). Once the loop terminates, returny
. If the output must be an integer (rather than a list containing a single integer), return#&@@y
(+4 bytes).Thanks to Martin Ender for saving 2 bytes and making me comply with the rules. Open to suggestions.
źródło
!Less
works as you expect, since this doesn't actually evaluate to a function. You'll probably need to useGreater
(or#>#2&
) there. You can usex~Split~Less
for the firstSplit
though and>
for theLength
condition.Clear@y
between function calls, I'm afraid that's not valid. You'll either have to reset it yourself, scope it better, or turn this into a full program withInput
andPrint
.Perl 6, 111 bytes
Expanded:
źródło
Python 2,
10098 bytesUses the short-circuiting return as in Yodle's answer (by Zachary T)
źródło
+=b,
instead of+=[b]
(credit to mathmandan), usingt=[0]
to uset
to add toA
, and then, since we now start with 0 int
, checkingt[-2]<1
is shorter thanlen(t)<2
, and uset[1]
as the result in that case.return t[-2]and f(l)or t[1]
.Mathematica, 101 bytes
Unnamed recursive function taking a list of numbers as input, and returning a list with a single number (the winner) as output.
The core of the algorithm is
Max/@Partition[#,3,1,{2,2},0]
, which computes the array of (the-max-of-me-and-my-neighbors)s from the input list.a=Position[...-#,0]
then subtracts the original list and returns where the 0s are; these are the hand-raising children.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
branches depending on whether all the elements ofa
are equal or not (in this case, they will be only ifa
is a singleton); if so, then this child is the winner and we output her number; if not, then we recursively call this function on the list with all elements at positions ina
removed.źródło
Python 2, 99 Bytes
źródło
PHP, 131 bajtów
Pobiera liczby z argumentów wiersza poleceń. Nie powiedzie się, jeśli nazwa pliku zaczyna się od liczby dodatniej.
awaria
źródło
k, 40 bajtów
Objaśnienie:
$ jest if-else.
Warunkiem jest to, czy 1 jest sumą B, która jest zdefiniowana jako minimum dwóch list wygenerowanych przez sprawdzenie, czy x jest większy od poprzedniego i po pozycji (Rura jest odwrotna).
Jeśli to prawda, zwracamy x, gdzie B jest prawdziwe.
W przeciwnym razie powracamy bez prawdziwych pozycji.
źródło
Skala 129 bajtów
Grał w golfa
Bez golfa
Wypełniając listę lewą i prawą cyfrą 0, możesz następnie pogrupować w zestawy 3 i podzielić listę na te, w których ręka jest uniesiona, większość elementów lewej i prawej porównuje się z 0 na zewnątrz, więc uzyskaj poprawną liczbę (zakładając wysokość nobodys jest ujemny!)
źródło
C ++ 14, 182 bajty
Nauczyłem się, że operator trójskładnikowy może być używany z obiektami C ++. Wymaga wkładu być losowy dostęp z pojemnika
push_back
, jakvector
,deque
ilist
.Tworzy dwa pojemniki
t
is
tego samego typu i dołącza do lokalnego najwyższyt
i resztęs
. Jeśli wt
zamian jest tylko jeden element, w przeciwnym razie wywołuje się sam zs
.Nie golfowany:
źródło
R, 83 bajty
Dwie różne wersje:
Ten przyjmuje wektor N:
Ten tworzy funkcję F zdefiniowaną rekurencyjnie:
źródło
APL (Dyalog Unicode) , 28 bajtów SBCS
Wypróbuj online!
źródło