N Kinder, von denen keine zwei ihre genaue Größe teilen, sind in einer bestimmten Reihenfolge aufgestellt. Jeder kann nur Höhen mit seinen unmittelbaren Nachbarn vergleichen. Wenn der Lehrer "Hände heben, wenn Sie der Größte sind" ruft, tun sie dies, wenn sie größer sind als beide Nachbarn, und dies gleichzeitig. Wenn nur einer die Hand hebt, gewinnt er. Wenn mehr als eine Person die Hand hebt, werden sie alle aus der Reihe entfernt (unter Beibehaltung der Ordnung der übrigen Kinder) und wiederholen den Vorgang.
Schreiben Sie ein Programm, das eine Reihe von eindeutigen Ganzzahlen verwendet (Sie können davon ausgehen, dass diese eindeutig positiv sind) und den Gewinner dieses Spiels ausgibt. Das ist Code-Golf, also gewinnt der kürzeste Code.
Beispiele (mit gezeigten Zwischenstufen):
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
Aktuelle Führungskräfte:
- Gelee: 17 Bytes [von Dennis ♦]
- MATL: 20 Bytes [von Luis Mendo]
- APL: 28 Bytes [voidhawk]
- k: 40 Bytes [von Paul Kerrigan]
Es gibt auch eine Schlacht von Pythons. Ich warte immer noch darauf, dass weitere Golfsprachen auftauchen.
Derzeit habe ich die Antwort von Dennis ♦ akzeptiert. Wenn es neue Gewinner gibt, aktualisiere ich die Auswahl.
Antworten:
Gelee , 17 Bytes
Die Eingabe ist eine durch Kommas getrennte Folge von Ganzzahlen.
Probieren Sie es online!
Die Credits gehen an @Xanderhall, @Sherlock und @ErikGolfer, um die Grundlagen zu legen.
Wie es funktioniert
quelle
JavaScript (ES6),
787672 BytesVielen Dank an @ edc65 für -4 Bytes
Nimmt ein Array von ganzen Zahlen auf und gibt ein Array aus, das nur den Gewinner enthält.
Testschnipsel
Code-Snippet anzeigen
Hier sind einige andere Versuche mit
.filter
und Array-Komprimierungen:Oder eine doppelte for-Schleife, furchtbar lang:
Erläuterung
Die Art und Weise, wie dies funktioniert, ist ziemlich einfach: Es erstellt ein Array von relativ großen (
r
) und nicht (q
) Elementen und gibt dann zurück,r
wenn es nur ein Element enthält. Wenn nicht, läuft es von selbst weiterq
und gibt das Ergebnis zurück.quelle
q
und umschaltenr
. Sie vermeiden das&&r
und der Filterausdruck fällt auch ein Byte kürzer aus.MATL , 20 Bytes
Die Eingabe ist ein Spaltenvektor, der
;
als Trennzeichen verwendet wird.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Dies ist eine direkte Implementierung des in der Challenge beschriebenen Verfahrens. Eine
do
...while
-Schleife entfernt solange Elemente, bis nur noch eines entfernt wurde. und das ist die Ausgabe.Die zu entfernenden Elemente werden erkannt, indem Differenzen, Signum und dann wieder Differenzen genommen werden. Diejenigen, die einen negativen Wert ergeben, sind diejenigen, die entfernt werden müssen.
quelle
Python3,
265260248243203121117112111 BytesVielen Dank an @ZacharyT, @orion und @mathmandan, dass sie
545viele Bytes gespart haben !quelle
Haskell, 85 Bytes
Anwendungsbeispiel:
f [9,3,8,7,4,12,5]
->4
.Wie es funktioniert:
Eine Variante, auch 85 Bytes:
Binden Sie die Liste von
b
(so) an n und geben Sie das Element zurück,s
wennx\\n
es sich um eine Singleton-Liste handelt,f n
andernfalls.quelle
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
braucht noch den Import. Übrigenstails
kann auch durch ersetzt werden...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 BytesErläuterung
Stellen Sie zuerst
x
undy
gleich der Eingabe einList
. Die Schleife geht weiter bisLength@y==1
.x~Split~Less
ist die Liste von Listen aufeinanderfolgender, zunehmender Elemente,Split[x,#>#2&]
ist die Liste von Listen aufeinanderfolgender, abnehmender Elemente. Wenn Sie dieMax
Liste aller Listen in der ersten Liste nehmen, wird die Liste der Kinder größer als das Kind rechts von Ihnen (zusammen mit dem am weitesten rechts stehenden Kind). Wenn Sie das erste Argument (#&
) aller Listen in letzterer verwenden, wird die Liste der Kinder größer als das Kind links von ihnen (zusammen mit dem am weitesten links stehenden Kind). Der Schnittpunkt dieser beiden wird die Liste der Kinder sein, die ihre Hand erhoben haben. Stellen Sie dies gleichy
.x=DeleteCases[x,#|##&@@y]
Entferntx
alle Elemente, die mit einem Element von ) übereinstimmen . Sobald die Schleife beendet ist, kehren Sie zurücky
(#|##&
entsprichtAlternatives
y
. Wenn die Ausgabe eine Ganzzahl sein muss (anstelle einer Liste, die eine einzelne Ganzzahl enthält), geben Sie zurück#&@@y
(+4 Byte) zurück.Vielen Dank an Martin Ender für das Speichern von 2 Bytes und das Einhalten der Regeln. Offen für Vorschläge.
quelle
!Less
funktioniert, wie Sie es erwarten, da dies eigentlich keine Funktion ergibt. Sie müssen dort wahrscheinlichGreater
(oder#>#2&
) verwenden. Sie könnenx~Split~Less
für die ersteSplit
aber und>
für dieLength
Bedingung verwenden.Clear@y
zwischen Funktionsaufrufen angeht, ist das leider nicht gültig . Sie müssen es entweder selbst zurücksetzen, einen besseren Bereich festlegen oder es mitInput
und in ein vollständiges Programm umwandelnPrint
.Perl 6 , 111 Bytes
Erweitert:
quelle
Python 2,
10098 BytesVerwendet die Kurzschlussrückleitung wie in Yodles Antwort (von Zachary T)
quelle
+=b,
anstelle von+=[b]
(credit to mathmandan) verwenden,t=[0]
to verwendent
, um zu addierenA
, und dann, da wir jetzt mit 0 in beginnent
, die Überprüfungt[-2]<1
kürzer ist alslen(t)<2
undt[1]
in diesem Fall als Ergebnis verwenden.return t[-2]and f(l)or t[1]
.Mathematica, 101 Bytes
Unbenannte rekursive Funktion, die eine Liste von Zahlen als Eingabe verwendet und eine Liste mit einer einzelnen Zahl (dem Gewinner) als Ausgabe zurückgibt.
Der Kern des Algorithmus ist
Max/@Partition[#,3,1,{2,2},0]
, der das Array von (dem-Maximum-von-mir-und-meinen-Nachbarn) s aus der Eingabeliste berechnet.a=Position[...-#,0]
subtrahiert dann die ursprüngliche Liste und gibt zurück, wo die Nullen sind; das sind die handaufziehenden Kinder.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
Verzweigungen, je nachdem, ob alle Elemente vona
gleich sind oder nicht (in diesem Fall nur, wenna
es sich um einen Singleton handelt); Wenn ja, dann ist dieses Kind der Gewinner und wir geben seine Nummer aus. Wenn nicht, rufen wir diese Funktion in der Liste rekursiv auf, wobei alle Elemente an den Positionena
entfernt sind.quelle
Python 2, 99 Bytes
quelle
PHP, 131 Bytes
Nimmt Zahlen aus Befehlszeilenargumenten. Schlägt fehl, wenn der Dateiname mit einer positiven Zahl beginnt.
Nervenzusammenbruch
quelle
k, 40 Bytes
Erläuterung:
$ ist ein if-else.
Die Bedingung ist, ob 1 die Summe von B ist, die als das Minimum von zwei Listen definiert ist, die durch Prüfen erzeugt werden, ob x größer ist als die vorherigen und Nachpositionen (Pipe ist umgekehrt).
Wenn dies zutrifft, geben wir x zurück, wobei B zutrifft.
Ansonsten greifen wir ohne die wahren Positionen zurück.
quelle
Scala 129 Bytes
Golf gespielt
Ungolfed
Wenn Sie die Liste links und rechts mit 0en auffüllen, können Sie sie dann in 3er-Sets gruppieren und die Liste für diejenigen aufteilen, bei denen die Hand oben ist. Die Elemente ganz links und rechts werden außen mit 0 verglichen ist negativ!)
quelle
C ++ 14, 182 Bytes
Es wurde erfahren, dass der ternäre Operator mit C ++ - Objekten verwendet werden kann. Erfordert die Eingabe ein Direktzugriffs Behälter mit sein
push_back
, wievector
,deque
undlist
.Erzeugt zwei Behälter
t
unds
des gleichen Typs und fügt den lokalen höchsten zut
und den Rests
. Wenn es nur ein Element gibt, das zurückgegeben wirdt
, rufen Sie sich ansonsten rekursiv mit aufs
.Ungolfed:
quelle
R 83 Bytes
Zwei verschiedene Versionen:
Dieser nimmt einen Vektor N:
Dieser erzeugt eine rekursiv definierte Funktion F:
quelle
APL (Dyalog Unicode) , 28 Byte SBCS
Probieren Sie es online!
quelle