Défi
Étant donné un tableau d'entiers non vide, par exemple:
[5, 2, 7, 6, 4, 1, 3]
Commencez par diviser le tableau en tableaux où aucun élément n’est plus volumineux que le précédent (tableaux non ascendants):
[5, 2] [7, 6, 4, 1] [3]
Ensuite, inversez chaque tableau:
[2, 5] [1, 4, 6, 7] [3]
Enfin, concaténez-les tous ensemble:
[2, 5, 1, 4, 6, 7, 3]
Cela devrait correspondre aux résultats / fonctions de votre programme. Répétez cette procédure suffisamment de fois et le tableau sera entièrement trié.
Règles
- L'entrée et la sortie peuvent être données par n'importe quelle méthode standard et dans n'importe quel format de tableau raisonnable.
- Le tableau en entrée ne sera jamais vide, mais peut contenir des négatifs et / ou des doublons.
- La valeur absolue de chaque entier sera toujours inférieure à 2 31 .
Cas de test
Espérons que ceux-ci couvrent tous les cas extrêmes:
[1] -> [1]
[1, 1] -> [1, 1]
[1, 2] -> [1, 2]
[2, 1] -> [1, 2]
[2, 3, 1] -> [2, 1, 3]
[2, 1, 3] -> [1, 2, 3]
[2, 1, 2] -> [1, 2, 2]
[2, 1, 1] -> [1, 1, 2]
[3, 1, 1, 2] -> [1, 1, 3, 2]
[3, 2, 1, 2] -> [1, 2, 3, 2]
[3, 1, 2, 2] -> [1, 3, 2, 2]
[1, 3, 2, 2] -> [1, 2, 2, 3]
[1, 0, 5, -234] -> [0, 1, -234, 5]
[1, 0, 1, 0, 1] -> [0, 1, 0, 1, 1]
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1] -> [1, 2, 3, 4, 5]
[2, 1, 5, 4, 3] -> [1, 2, 3, 4, 5]
[2, 3, 1, 5, 4] -> [2, 1, 3, 4, 5]
[5, 1, 4, 2, 3] -> [1, 5, 2, 4, 3]
[5, 2, 7, 6, 4, 1, 3] -> [2, 5, 1, 4, 6, 7, 3]
[-5, -2, -7, -6, -4, -1, -3] -> [-5, -7, -2, -6, -4, -3, -1]
[14, 5, 3, 8, 15, 7, 4, 19, 12, 0, 2, 18, 6, 11, 13, 1, 17, 16, 10, 9] -> [3, 5, 14, 8, 4, 7, 15, 0, 12, 19, 2, 6, 18, 11, 1, 13, 9, 10, 16, 17]
Notation
C'est le code-golf , donc le code le plus court en octets gagne.
code-golf
array-manipulation
sorting
ETHproductions
la source
la source
O(n^2)
O(n)
. permutez les premier et dernier éléments puis échangez les deuxième et deuxième derniers éléments, etc., lorsque vous arrivez au milieu.O(n)
, mais l'inversion peut être intégrée directement dans l'algorithme (c'est ce que ma réponse JS fait); étant donné que chaque itération effectue une boucle sur chaque élément du tableau une seule fois, une seule itération l’estO(n)
. (Je pense ...)Réponses:
JavaScript (ES6), 64 octets
Récursion FTW! L'algorithme de base utilisé ici consiste à garder une trace de l'exécution actuelle non ascendante dans un tableau, en la "renvoyant" à chaque fois qu'un élément ascendant est trouvé. Nous procédons de manière récursive en continuant à concaténer les résultats jusqu'à épuisement des éléments. En créant chaque exécution en sens inverse (
[n,...z]
au lieu de[...z,n]
), nous pouvons éviter les longs.reverse()
sans frais.Extrait de test
Afficher l'extrait de code
la source
[n,...a]
. C'est quoin
? Est-ce juste le premier élément de votre tableau?n
est le premier élément du tableau eta
constitue le reste du tableau. Vous pouvez trouver plus d'informations ici ....a
? Est-ce juste pour que vous puissiez en profitern
? Une dernière chose, quand vous appelezf(a,q)
, estq
réglé sur le paramètrez
?f=([n])=>...
ne capturerait que le premier élément etf=([n,a])=>...
capturerait uniquement le premiern
et le seconda
. Une autre façon de faire ce que cef=([n,...a])=>,,,
seraitf=a=>(n=a.unshift(),...
.z
est le deuxième paramètre de la fonction, quandf(a,q)
est appelé, lef
voit commez
. J'espère que cela t'aides!Python 3 , 63 octets
Essayez-le en ligne!
la source
Gelée , 8 octets
Essayez-le en ligne!
Explication:
la source
JavaScript (ES6), 70 octets
Bien sûr, cela est déjà dépassé par la réponse d'ETHproductions , mais c'est le mieux que je pourrais trouver jusqu'à présent sans utiliser de récursivité.
Remarque: initialiser les deux
r
eto
exactement sur le même objetr = o = []
peut ressembler à une idée hasardeuse. Mais il est prudent de le faire ici, carr
sa propre instance (contenant le premier élément dea
) est immédiatement affectée à la première itération avecr = [n, ...r]
.Cas de test
Afficher l'extrait de code
la source
MATL , 15 octets
L'entrée est un vecteur de colonne, au format
[5; 2; 7; 6; 4; 1; 3]
(le point-virgule est le séparateur de lignes).Essayez-le en ligne!
Prenons l’entrée
[5; 2; 7; 6; 4; 1; 3]
comme exemple.Explication
la source
Mathematica,
3027 octets3 octets enregistrés à cause de @Martin Ender .
Fonction anonyme. Prend une liste de nombres en entrée et renvoie une liste de nombres en sortie.
la source
Python 2, 100 octets
Un golf vraiment épouvantable, mais je voulais poster ma solution (on ne dépasse pas simplement le golfe Dennis) ...
Testez sur repl.it!
L'entrée doit être donnée sous forme de littéral de liste Python, tel que
[5, 3, 4, 2, 6, 1]
.L'idée de base est d'utiliser intensivement la syntaxe de découpage de Python, découpant chaque section nécessaire du tableau, l'inversant et l'ajoutant au nouveau tableau.
la source
d,L,x=input(),[],0;d+=...
.Pyke,
118 octets ( ancienne version )Essayez-le ici! (fonctionne sur la dernière version)
la source
Retina , 163 octets
Oui, je sais à quel point c'est horrible. Soutenir les zéros et les négatifs était super amusant. Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne
Explication:
la source
05AB1E ,
19181614 octets2 octets enregistrés en utilisant le truc de tri de Luis Mendo
Essayez-le en ligne!
Explication
Exemple d'entrée
[5, 2, 7, 6, 4, 1, 3]
Solution précédente de 16 octets
la source
JavaScript (ECMA 6),
121128125119108 108 octetsExpression Lambda prend un seul
Array
paramètre,a
.Merci à @ETHproductions pour m'aider à voir ma première erreur.
la source
return(b+","+c).split`,`
pour sauver quelques octets à la fin.c.unshift
au lieu dec.push
supprimer le besoin d’inverserc
. Après cela, j'ai 94 octets .Ruby,
60 à55 octetsÀ peu près ce que le défi demandait. J'ai défini un lambda
s
, qui prend un tableaux
, et le divise (en tranches) en morceaux plus petits où l'élément suivant serait supérieur à. Cela rend un énumérateur, sur lequel on peut appeler map et inverser l'ordre des pièces, avant de finalement tout mettre ensemble avec flatten, ce qui concatène les éléments de l'ordre défini dans un tableau.Des tests
la source
Brachylog , 10 octets
Essayez-le en ligne!
Explication
la source
c
, lorsqu'il est exécuté en sens inverse, essaie nécessairement de se scinder en moins de listes en premier?Dyalog APL ,
7 à15 octetsRequiert
⎕ML←3
, qui est la valeur par défaut sur de nombreux systèmes. *∊
enrôler (aplatir)⌽¨
chacun inversé⍵⊂⍨
l'argument partitionné * en coupant où chaque élément correspondant est plus grand que son prédécesseur dans1+
un plus⍵-
l'argument moins⌊/⍵
le plus petit élément de l'argumentL'ancienne solution de 7 octets échoue avec des entiers non positifs:
Requiert
⎕ML←3
, qui est la valeur par défaut sur de nombreux systèmes. *∊
enrôler le⌽¨
chacun inversé⊂⍨
auto-partitionné ** Partition (
⊂
) est une fonction qui coupe son argument de droite lorsque l'argument de gauche correspondant est plus grand que le précédent. (Malheureusement, il accepte uniquement les entiers non négatifs, et zéro a une signification particulière.) À partir de la version 16, cette fonctionnalité de⊂
est disponible sur tous les systèmes (même ceux où⎕ML≠3
), à l'aide du glyphe⊆
.la source
Haskell, 49 octets
Exemple d'utilisation:
(%[]) [5,2,7,6,4,1,3]
->[2,5,1,4,6,7,3]
.Approche récursive La fonction
%
prend la liste d'entrée comme premier paramètre et un accumulateurl
qui garde la trace du morceau non ascendant jusqu'à présent (dans l'ordre inverse). Le cas de base est atteint lorsque la liste d'entrée est vide et que le résultat est l'accumulateur. Si la liste d'entrée n'est pas vide et que le premier élémenta
ne rentre pas dans le chunk actuel (any(<a)l
), renvoyez l'accumulateur et ajoutez un appel récursif au reste de la liste et ena
tant que nouvel accumulateur (l++b%[a]
). Sinon, faites un appel récursif sur le reste de la liste eta
préfixé à tha accumulator (b%(a:l)
). La fonction principale(%[])
appelle%
avec un accumulateur vide.la source
Rétine , 98 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
la source
R, 64 octets
Lit les entrées de stdin. Nous divisons l’entrée en une liste de vecteurs utilisant
split()
une variable facteur qui regroupe l’entrée. Le facteur est créé en prenant la somme cumulée du vecteur logique pour lequel la différence est positive.Considérons le vecteur:
Maintenant, en prenant la différence et en ajoutant des points
F
en exécutant, ony=c(F,diff(x)>0)
obtiendrait le vecteur logique suivant:La somme cumulée
cumsum(y)
produit un vecteur où chaque groupe est représenté par un facteur unique sur lequel on peut combiner avec lasplit
fonction:la source
diffinv
plutôt quecumsum
.Octave,
7544 octetsBasé sur la réponse MATL de @LuisMendo
Essayez-le en ligne!
Réponse précédente
Essayez-le en ligne!
inverser le tableau
prendre la première différence de
f
trouver la position d'où l'élément suivant est inférieur à l'élément précédent
première différence des positions retourne la longueur de chaque sous-tableau
utilisez la longueur de chaque sous-tableau
mat2cell
pour diviser le tableau en liste imbriquée de tableauxinverser la liste imbriquée
aplatir la liste imbriquée
la source
Pyth - 15 octets
Essayez-le en ligne ici .
la source
Perl 6 , 59 octets
Solution basée sur regex.
Parce que c'est
SpartaPerl !!m/ /
: Stringify le tableau en entrée et associe une expression rationnelle à celle-ci.(\-? \d+)
: Correspond à un nombre et capture le comme$0
.<?{ [>=] $0 }>
: Assertion de largeur nulle qui correspond uniquement si tous les$0
objets capturés jusqu'à présent dans la sous-correspondance actuelle sont dans un ordre non croissant.([ ] +)+
: Répétez les deux dernières étapes aussi souvent que possible, sinon commencez une nouvelle sous-correspondance.map , [0]
: Itérer sur les sous-correspondances.|+«*.[0].reverse
: Pour chacune d'elles, prenez la liste des valeurs correspondant$0
, renversez-la, forcez-la en nombres (+«
) et glissez-les dans la liste externe (|
).Perl 6 , 63 octets
Solution de traitement de liste récursive.
Plus laborieux que je ne l'avais espéré.
Bien que le langage comporte de nombreuses fonctions intégrées pratiques, il ne semble pas exister de partitionnement de liste (comme par exemple Ruby's
slice_when
ou HaskelltakeWhile
).la source
Empilé , non compétitif, 34 octets
Développer constamment ce langage.
L'argument repose sur TOS. Essayez-le ici!
chunkby
prend une fonction et collecte des tableaux de données contiguës qui satisfont la fonction. La fonction est alors:Cela donne un tableau strictement décroissant.
$revmap
est fondamentalement[rev]map
et renverse chaque élément.flat
aplatit enfin le tableau.Un peu de plaisir pour trier le tableau:
Cette sortie (par exemple):
la source
Python,
151139 octetsSauvegardé 12 octets grâce à @ Flp.Tkc!
Nulle part près de @ Flp.Tkc, encore moins ...
la source
+= data,
la virgule de fin construit implicitement un tuple, qui est ensuite concaténé avec la liste, en ajoutant les données en tant que dernier élément de la liste. Dans ce contexte, faitesr+=l[i:j+1][::-1],
Python 2, 74 octets
Entrée
a
, sortiec
la source
Python 3, 191 octets
Je ne suis pas sûr si l'utilisation de la
sorted
fonction pour vérifier est autorisée ici, mais je ne pouvais pas penser à une bonne raison contre cela, et cela a réduit mon nombre d'octets d'environ 30 octets.la source
Clojure, 105 octets
Les partitions en paires sur des numéros consécutifs, met
true
oufalse
entre eux, partitionsnot
pourtrue
et les numéros deviennentfalse
etfalse
true
intervertit les partitions et conserve des valeurs numériques.la source