introduction
Supposons que vous vouliez calculer les maxima de queue d'une liste de nombres, c'est-à-dire le maximum de chaque suffixe non vide. Une façon de le faire est de choisir à plusieurs reprises un numéro et de le remplacer par un nombre plus élevé se produisant après, jusqu'à ce que ce ne soit plus possible. Dans ce défi, votre tâche consiste à effectuer une étape de cet algorithme.
La tâche
Votre entrée est une liste d'entiers L , qui peut être vide. Votre sortie sera la liste L où exactement un nombre L i a été remplacé par un autre L j , où L i <L j et i <j .
En d'autres termes, vous devez remplacer un nombre par un nombre plus élevé qui se produit après.
Vous pouvez choisir i et j librement parmi toutes les paires valides, et le choix peut être non déterministe.
Si ces i et j n'existent pas (c'est-à-dire que L est non croissant), votre sortie doit être L inchangée.
Exemple
Considérez l'entrée L = [3, 1, 4, -1, 2] . Les opérations possibles sont de remplacer 3 par 4 , de remplacer 1 par 4 , de remplacer 1 par 2 ou de remplacer -1 par 2 . Ainsi, les sorties possibles sont:
[ 3 , 1 , 4 , -1 , 2 ]
------------------------------
[( 4), 1 ,( 4), -1 , 2 ]
[ 3 ,( 4),( 4), -1 , 2 ]
[ 3 ,( 2), 4 , -1 ,( 2)]
[ 3 , 1 , 4 ,( 2),( 2)]
Si vous répétez les temps assez d'opération, le résultat final sera [4,4,4,2,2] , ce qui est précisément la liste des maxima de queue de L .
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Dans ce dernier cas, vous pouvez modifier l'entrée en place au lieu de renvoyer un nouveau tableau, si votre langue le permet. Les formats d'entrée et de sortie sont flexibles dans des limites raisonnables.
Le nombre d'octets le plus bas gagne.
Cas de test
Toutes les sorties possibles sont affichées.
[] -> []
[1] -> [1]
[1,2] -> [2,2]
[2,1] -> [2,1]
[4,4,4,4] -> [4,4,4,4]
[-1,-3,-10] -> [-1,-3,-10]
[1,3,10] -> [3,3,10] [10,3,10] [1,10,10]
[1,1,2,1] -> [2,1,2,1] [1,2,2,1]
[998,64,2,-94,-789] -> [998,64,2,-94,-789]
[998,2,64,-94,-789] -> [998,64,64,-94,-789]
[3,1,4,-1,2] -> [4,1,4,-1,2] [3,4,4,-1,2] [3,2,4,-1,2] [3,1,4,2,2]
[-1,4,0,4,7,2,3] -> [4,4,0,4,7,2,3] [0,4,0,4,7,2,3] [-1,4,4,4,7,2,3] [7,4,0,4,7,2,3] [-1,7,0,4,7,2,3] [-1,4,7,4,7,2,3] [-1,4,0,7,7,2,3] [2,4,0,4,7,2,3] [-1,4,2,4,7,2,3] [3,4,0,4,7,2,3] [-1,4,3,4,7,2,3] [-1,4,0,4,7,3,3]
[3542,-12311,7662,1672,6081] -> [7662,-12311,7662,1672,6081] [3542,7662,7662,1672,6081] [3542,1672,7662,1672,6081] [6081,-12311,7662,1672,6081] [3542,6081,7662,1672,6081] [3542,-12311,7662,6081,6081]
x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)
?x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)
(38 octets) devrait fonctionner.Mathematica, 37 octets
Fonction pure prenant même une liste de nombres réels et renvoyant une liste de nombres réels. Recherche la première paire d'entrées consécutives dans le "mauvais" ordre et remplace la première de cette paire par la seconde. Le comportement par défaut de Nice
/.
signifie qu'il retourne l'entrée inchangée le cas échéant.Note amusante: si nous remplaçons
b<c
par!OrderedQ[{c,b}]
, alors la fonction fonctionne sur les chaînes (et vraiment n'importe quel type de données une fois que l'ordre approprié est décrit). Par exemple,#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&
sur les{"programming", "puzzles", "code", "golf"}
retours d' entrée{"puzzles", "puzzles", "code", "golf"}
.la source
Sort[FromCharacterCode /@ Range[32, 127]]
. Cela devient bizarre une fois que vous avez des chaînes avec plusieurs mots, car alors il ignore les espaces et les choses.JavaScript (ES6),
433938 octetsSorties en modifiant le tableau sur place. Edit: 4 octets enregistrés grâce à @ETHproductions. 1 octet enregistré grâce à @ user81655.
la source
a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]
pour 39.a=>a.map((_,b)=>Math.max(...a.slice(b)))
findIndex
parsome
(38 octets):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
Haskell , 36 octets
Essayez-le en ligne!
Parcourez la liste des éléments consécutifs
a,b
aveca<b
et remplacez-les parb,b
.Amélioré de 37 octets:
la source
f(a:r@(b:_))=max(b:r)(a:f r)
fonctionne et est de deux octets plus court.f r >= r
.Gelée ,
1311 octetsRemplace le plus à droite de tous les nombres possibles.
Essayez-le en ligne!
Comment ça marche
la source
MATL , 15 octets
Essayez-le en ligne!
Je ne suis pas un grand fan de cette solution. Cela me semble horriblement inefficace. En particulier les sections
whY>d*
et0h+
.la source
Python 2,
13913493 bytesTerriblement long, mais c'est une première tentative.
-5 octets grâce à TemporalWolf
-41 (!!) octets grâce à Value Ink
la source
[1,2]
donne[2,1]
au lieu de[2,2]
print
et utiliser un\t
onglet au lieu d'un espace supplémentaire pour la boucle intérieure. En outre, vous pouvez déposer le 0exit()
pour un supplémentaire. Cela devrait vous ramener à 132.if a[i]<a[j]:a[i]=a[j];print a;exit()
est encore plus court. Heck, il vaut mieux fairefor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
MATL , 13 octets
Essayez-le en ligne!
Explication
Les deux conditions suivantes sont équivalentes:
Le code utilise la condition 2, qui est plus simple. Il calcule les incréments consécutifs et trouve le dernier positif, le cas échéant. Pour les deux entrées impliquées, il écrit la valeur de la deuxième entrée dans la première.
Cette astuce est utilisée pour gérer le cas où aucune substitution ne peut être effectuée. Notez également que l'indexation MATL est
1
basée sur.Prenons l'entrée
[3,1,4,-1,2]
comme exemple.la source
Haskell ,
3433 octetsCeci est basé sur la réponse de xnor , qui m'a suggéré de le poster moi-même.
EDIT: xnor a trouvé un octet à enregistrer.
Essayez-le en ligne!
Fondamentalement, j'ai observé que la ramification de la méthode de xnor finit toujours par choisir la plus grande des expressions de branche, car Haskell utilise l'ordre lexicographique pour les listes. (Le cas
a==b
fonctionne également parce quef r>=r
, ce qui peut être prouvé séparément par induction.)Autrement dit, à chaque fois
b:r > a:f r
, alorsb:r
c'est une bonne réponse, et sinon nous pouvons reculera:f r
.Donc, au lieu de vérifier
a<b
à l'avance, je calcule simplement les deux expressions et je prends le maximum. Cela pourrait donner une explosion exponentielle, bien que la paresse de Haskell évite cela à moins quea
etb
soient égaux.la source
max(b:r)$a:f r
enregistre un octet.Python 3, 79 octets
Mute le tableau d'origine (liste) qui lui est donné. Je ne suis pas content que ce ne soit pas un lambda et je suis sûr qu'il y a de meilleures optimisations; J'espère que j'y répondrai plus tard.
Brève explication
Il prend le maximum du tableau au-delà de l'élément actuel (en commençant par le zéro). Il compare ensuite cela à l'élément lui-même: si le max est supérieur, remplacez l'élément actuel par lui et arrêtez, sinon, incrémentez-le de un et continuez d'essayer.
la source
Rubis,
6661 octetsEssayez-le en ligne!
la source
C, 47 octets
Implémentation récursive prenant comme entrée un pointeur sur le premier élément d'un tableau et la longueur du tableau. Modifie le tableau en place.
la source
SWI-Prolog, 70 octets
La première clause remplace le premier élément de la liste par la valeur maximale du reste de la liste, mais uniquement si ce max est plus grand. La deuxième clause appelle récursivement le prédicat pour la fin de la liste. Si aucune de ces clauses ne réussit, la troisième clause renvoie simplement l'entrée.
Ce retour n'est qu'une des solutions possibles. Il est trivial de les trouver tous avec un code très similaire, mais le cas où aucun changement n'est possible prend beaucoup plus d'octets à gérer.
Exemple:
la source
R, 71 octets
la source
C, 80 octets
Appeler avec:
la source
Python 2, 89 octets
Essayez-le en ligne -1 octet grâce à @TemporalWolf
-25 octets grâce à @ValueInk
-7 octets grâce à @Cole
Fonction qui mute le tableau d'entrée
S'il n'y avait pas besoin d'arrêter après la première itération, ce serait un peu plus joli
la source
[1, 3, 5, 7]
; il revient[3, 3, 5, 7]
.A[i]<y and
=>y>A[i]and
enregistre 1r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];break
à réduire votre score à 96!input()
.Python 2, 60 octets
Essayez-le en ligne!
Explication: Vérifie récursivement si un élément donné est inférieur à l'
max
élément du reste de la liste. Si tel est le cas, renvoie la liste enmax
remplaçant le premier élément.la source
TI-Basic, 72 octets
Explication:
la source
sh, 118 octets
Les entiers d'entrée sont passés comme arguments au script.
Panne:
la source
PHP, 88 octets
Panne
la source
Haskell, 48 octets
Exemple d'utilisation:
f [1,1,2,1]
->[2,1,2,1]
. Essayez-le en ligne! .Si la liste d'entrée contient au moins un élément, associez-le
b
au premier élément etl
au reste de la liste. Sil
n'est pas vide etb
inférieur au maximum del
, retourne le maximum suivi del
, sinon retourb
suivi d'un appel récursif def l
. Si la liste d'entrée est vide, renvoyez-la.la source
Raquette 202 octets
Non golfé:
Essai:
Sortie:
la source
C, 67 octets
Exécution unique, 67 octets en direct
Étape unique, 78 octets en direct
Tail Maxima, 96 bytes Live
la source
Python 3 ,
103102 octetsEssayez-le en ligne!
la source