N enfants, sans deux partageant leur taille exacte, sont alignés dans un certain ordre. Chacun ne peut comparer les hauteurs qu'avec ses voisins immédiats. Lorsque l'enseignant crie «lève la main si tu es le plus grand», il le fait s'il est plus grand que ses deux voisins, et il le fait simultanément. Si un seul lève la main, il gagne. Si plus d'un lève la main, ils sont tous éliminés du rang (en préservant l'ordre du reste des enfants) et ils répètent le processus.
Écrivez un programme, qui prend un tableau d'entiers distincts (vous pouvez supposer qu'ils sont strictement positifs) et génère le gagnant de ce jeu. C'est le code-golf, donc le code le plus court l'emporte.
Exemples (avec les étapes intermédiaires illustrées):
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
Dirigeants actuels:
- Gelée: 17 octets [par Dennis ♦]
- MATL: 20 octets [par Luis Mendo]
- APL: 28 octets [voidhawk]
- k: 40 octets [par Paul Kerrigan]
Il y a aussi une bataille de Pythons en cours. Toujours en attente de nouvelles langues de golf pour apparaître.
J'ai actuellement accepté la réponse de Dennis ♦ - s'il y a de nouveaux gagnants, je mettrai à jour la sélection.
Réponses:
Gelée , 17 octets
L'entrée est une chaîne d'entiers séparés par des virgules.
Essayez-le en ligne!
Les crédits vont à @Xanderhall, @Sherlock et @ErikGolfer pour avoir jeté les bases.
Comment ça marche
la source
JavaScript (ES6),
787672 octetsMerci à @ edc65 pour -4 octets
Prend un tableau d'entiers et génère un tableau contenant uniquement le gagnant.
Extrait de test
Afficher l'extrait de code
Voici quelques autres tentatives d'utilisation des
.filter
comprhensions et des tableaux:Ou une double boucle for, horriblement longue:
Explication
La façon dont cela fonctionne est assez simple: il construit un tableau de ceux qui sont relativement plus grands (
r
) et un tableau de ceux qui ne le sont pas (q
), puis retourner
s'il n'a qu'un seul élément; sinon, il s'exécuteq
et renvoie le résultat de cela.la source
q
etr
. Vous évitez le&&r
et l'expression de filtre se révèle également être un octet plus court.MATL , 20 octets
L'entrée est un vecteur de colonne, utilisé
;
comme séparateur.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Il s'agit d'une mise en œuvre directe de la procédure décrite dans le challenge. Une boucle
do
...while
supprime les éléments jusqu'à ce qu'un seul ait été supprimé; et celui-là est la sortie.Les éléments à supprimer sont détectés en reprenant les différences, le signal, puis les différences. Celles qui donnent une valeur négative sont celles à supprimer.
la source
Python3,
265260248243203121117112111 111 octetsMerci @ZacharyT, @orion et @mathmandan d'avoir économisé
545beaucoup d'octets!la source
Haskell, 85 octets
Exemple d'utilisation:
f [9,3,8,7,4,12,5]
->4
.Comment ça marche:
Une variante, également 85 octets:
Liez la liste de
b
(voir ci-dessus) à n et retournez l'éléments
ifx\\n
est une liste singleton etf n
sinon.la source
f x|y@(_:z)<-x++[0]=(#)=<<(x\\)$[b|(a,b,c)<-zip3(0:y)y z,b<a||b<c]
.\\
toujours besoin de l'importation. Btw,tails
peut également être remplacé par...|a:b:c:_<-scanr(:)[]$0:x++[0],...
.Mathematica,
107108 octetsExplication
Tout d'abord, réglez
x
ety
égal à l'entréeList
. La boucle continue jusqu'auLength@y==1
.x~Split~Less
est la liste des listes d'éléments consécutifs croissants,Split[x,#>#2&]
est la liste des listes d'éléments consécutifs décroissants. La priseMax
de toutes les listes de la première donne la liste des enfants plus grands que l'enfant à leur droite (avec l'enfant le plus à droite). La prise du premier argument (#&
) de toutes les listes de cette dernière donne la liste des enfants plus grands que l'enfant à gauche (avec l'enfant le plus à gauche). L'intersection de ces deux sera la liste des enfants qui ont levé la main. Définissez cette valeur sury
.x=DeleteCases[x,#|##&@@y]
supprime dex
tout élément correspondant à un élément dey
(#|##&
équivaut àAlternatives
). Une fois la boucle terminée, revenezy
. Si la sortie doit être un entier (plutôt qu'une liste contenant un seul entier), retournez#&@@y
(+4 octets).Merci à Martin Ender d'avoir sauvé 2 octets et de m'avoir fait respecter les règles. Ouvert aux suggestions.
la source
!Less
fonctionne comme prévu, car cela n'évalue pas réellement une fonction. Vous devrez probablement utiliserGreater
(ou#>#2&
) là-bas. Vous pouvez utiliserx~Split~Less
pour le premierSplit
bien et>
pour laLength
condition.Clear@y
entre les appels de fonction, je crains que ce ne soit pas valide . Vous devrez soit le réinitialiser vous-même, l'étendre mieux, ou le transformer en un programme complet avecInput
etPrint
.Perl 6 , 111 octets
Étendu:
la source
Python 2,
10098 octetsUtilise le retour de court-circuit comme dans la réponse de Yodle (par Zachary T)
la source
+=b,
au lieu de+=[b]
(crédit à mathmandan), en utilisantt=[0]
à utilisert
pour ajouter àA
, puis, puisque nous commençons maintenant avec 0 danst
, la vérificationt[-2]<1
est plus courte quelen(t)<2
, et utilisezt[1]
comme résultat dans ce cas.return t[-2]and f(l)or t[1]
.Mathematica, 101 octets
Fonction récursive sans nom prenant une liste de nombres en entrée et renvoyant une liste avec un seul numéro (le gagnant) en sortie.
Le cœur de l'algorithme est
Max/@Partition[#,3,1,{2,2},0]
, qui calcule le tableau des (les-max-de-moi-et-mes-voisins) à partir de la liste d'entrée.a=Position[...-#,0]
soustrait ensuite la liste d'origine et retourne où les 0 sont; ce sont les enfants qui élèvent la main.If[Equal@@a, #[[Last@a]], #0@Fold[Drop@##&,#,Reverse@a]]&
branches selon que tous les éléments dea
sont égaux ou non (dans ce cas, ils ne le seront que sia
est un singleton); si c'est le cas, alors cet enfant est le gagnant et nous sortons son numéro; sinon, nous appelons récursivement cette fonction sur la liste avec tous les éléments aux positionsa
supprimés.la source
Python 2, 99 octets
la source
PHP, 131 octets
Prend des nombres à partir des arguments de ligne de commande. Échoue si le nom de fichier commence par un nombre positif.
panne
la source
k, 40 octets
Explication:
$ est un if-else.
La condition est de savoir si 1 est la somme de B, qui est définie comme le minimum de deux listes générées en vérifiant si x est supérieur aux positions antérieure et postérieure (Pipe est inversé).
Si cela est vrai, nous renvoyons x où B est vrai.
Sinon, nous récurons sans les vraies positions.
la source
Scala 129 octets
Golfé
Ungolfed
En remplissant la liste de gauche et de droite avec des 0, vous pouvez ensuite regrouper en ensembles de 3 et partitionner la liste pour ceux où la main est levée, la plupart des éléments gauche et droit se comparent à 0 à l'extérieur, donc obtenez le nombre correct (en supposant la hauteur de nobodys est négatif!)
la source
C ++ 14, 182 octets
Appris que l'opérateur ternaire peut être utilisé avec des objets C ++. Nécessite l'entrée à un récipient d'accès aléatoire avec
push_back
, commevector
,deque
etlist
.Crée deux conteneurs
t
ets
du même type et ajoute le plus haut local aut
et le reste às
. S'il n'y a qu'un seul élément ent
retour celui-là, sinon récursif appelez-vous avecs
.Ungolfed:
la source
R, 83 octets
Deux versions différentes:
Celui-ci prend un vecteur N:
Celui-ci crée une fonction F définie récursivement:
la source
APL (Dyalog Unicode) , 28 octets SBCS
Essayez-le en ligne!
la source