L'algorithme de tri va comme ceci:
Tant que la liste n'est pas triée, alignez la moitié des éléments (supprimez-les de la liste). Continuez jusqu'à ce que la liste soit triée ou qu'il ne reste qu'un élément (trié par défaut). Cet algorithme de tri peut donner des résultats différents en fonction de la mise en œuvre.
La procédure de suppression d’élément est laissée à l’implémentation, mais la liste doit être deux fois moins longue qu’avant la fin de la procédure de suppression d’élément. Votre algorithme peut décider de supprimer la première moitié ou la liste, la dernière moitié de la liste, tous les éléments impairs, tous les éléments pairs, un à la fois jusqu'à ce que la liste soit deux fois moins longue, ou tout élément non mentionné.
La liste d'entrées peut contenir un nombre d'éléments arbitraire (dans des limites raisonnables, disons jusqu'à 1000 éléments), pas seulement des listes parfaitement divisibles de 2 ^ n éléments. Vous devrez supprimer (n + 1) / 2 ou (n-1) / 2 éléments si la liste est impaire, codée en dur ou décidée de manière aléatoire au cours de l'exécution. Décidez vous-même: que ferait Thanos si l'univers contenait une quantité étrange de créatures vivantes?
La liste est triée si aucun élément n'est plus petit qu'un élément précédent. Des doublons peuvent apparaître dans l’entrée et dans la sortie.
Votre programme doit prendre un tableau d’entiers (via stdin ou en tant que paramètres, soit des éléments individuels, soit un paramètre de tableau), et renvoyer le tableau trié (ou l’imprimer sur stdout).
Exemples:
// A sorted list remains sorted
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
// A list with duplicates may keep duplicates in the result
[1, 2, 3, 4, 3] -> [1, 3, 3] // Removing every second item
[1, 2, 3, 4, 3] -> [3, 4, 3] -> [4, 3] -> [3] // Removing the first half
[1, 2, 3, 4, 3] -> [1, 2] // Removing the last half
[1, 2, 4, 3, 5]
pourrait donner des résultats différents:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
ou:
// Removing the first half of the list
[1, 2, 4, 3, 5] -> [3, 5] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [4, 3, 5] -> [3, 5] // With (n-1)/2 items removed
ou:
// Removing the last half of the list
[1, 2, 4, 3, 5] -> [1, 2] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [1, 2, 4] // With (n-1)/2 items removed
ou:
// Taking random items away until half (in this case (n-1)/2) of the items remain
[1, 2, 4, 3, 5] -> [1, 4, 3] -> [4, 3] -> [4]
[9, 1, 1, 1, 1]
. Mon propre algorithme a échoué sur cette entréeRéponses:
R , 41 octets
Essayez-le en ligne!
la source
is.unsorted
plutôt queany(...)
serait également 41 octets.Python 3 ,
384239 octetsEssayez-le en ligne!
-3 bytes
grâce à @JoKing et @Quuxplusonela source
!= sorted(t)
doit être> sorted(t)
.Python 2 , 39 octets
Essayez-le en ligne!
la source
Brachylog (v2), 6 octets
Essayez-le en ligne!
Ceci est une soumission de fonction. Entrée de gauche, sortie de droite, comme d’habitude. (Le lien TIO utilise un argument de ligne de commande qui englobe automatiquement la fonction dans un programme complet afin que vous puissiez la voir en action.)
Explication
Tour bonus
Essayez-le en ligne!
Le claquement est censé être aléatoire, n'est-ce pas? Voici une version du programme qui choisit les éléments survivants au hasard (tout en veillant à ce que la moitié survive à chaque tour).
Ce serait plutôt plus court si nous pouvions réorganiser les éléments, mais whyever serait un algorithme de tri voulez faire cela ?
la source
Perl 6 , 30 octets
Essayez-le en ligne!
Fonction récursive qui supprime la seconde moitié de la liste jusqu'à ce que la liste soit triée.
Explication:
la source
C # (compilateur interactif Visual C #) , 76 octets
Essayez-le en ligne!
la source
Java 10,
106 à97 octets-9 octets grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Ne laissez que la première moitié de la liste à chaque itération et supprimen + 12 éléments si la taille de la liste est impair.
Explication:
la source
n->{for(;n.reduce((1<<31)+0d,(a,b)->a==.5|b<a?.5:b)==.5;n=n.skip(n.count()/2));return n;}
est plus court en utilisant des flux, mais je n'ai pas été en mesure de comprendre comment éviter l'java.lang.IllegalStateException: stream has already been operated upon or closed
erreur après avoir renvoyé le fluxreduce
s'agit d'une opération de terminal qui ferme le flux. Vous ne pourrez jamais appelerreduce
deux fois sur le même flux. Vous pouvez cependant créer un nouveau flux.Wolfram Language (Mathematica) , 30 octets
Essayez-le en ligne!
@Doorknob a enregistré 12 octets
la source
x[[;;;;2]]
).OrderedQ
, mais ne pourrait pas le faire fonctionnerOrderedQ
dans ma toute première approche (voir modifications)JavaScript (ES6),
4948 octetsSauvegardé 1 octet grâce à @tsh
Supprime chaque 2ème élément.
Essayez-le en ligne!
la source
p++&1
->a^=1
Ruby , 37 octets
Essayez-le en ligne!
la source
05AB1E ,
87 octets-1 octet grâce à @Emigna .
Essayez-le en ligne ou vérifiez quelques autres cas de test (ou vérifiez-les étape par étape pour chaque itération ).
Alternative de 7 octets par @Grimy :
Essayez-le en ligne ou vérifiez quelques autres cas de test (ou vérifiez-les étape par étape pour chaque itération ).
Explication:
la source
ι
au lieu de2ä
si vous passez à une stratégie de garder tous les autres éléments .ΔÐ{Ê>äн
TI-BASIC (TI-84),
47424544 octets-1 octet grâce à @SolomonUcko!
La liste des entrées est en
Ans
.La sortie est
Ans
entrée et est imprimée implicitement.Explication:
Remarque: TI-BASIC est un langage à jeton. Le nombre de caractères ne correspond pas au nombre d'octets.
la source
not(min(L1=Ans
parmax(L1≠Ans
pour sauvegarder un octet.Gelée , 7 octets
Essayez-le en ligne!
la source
Haskell ,
57 à55 octets (uniquement grâce à ASCII)Essayez-le en ligne!
Code d'origine:
Essayez-le en ligne!
Ungolfed:
la source
Octave , 49 octets
Essayez-le en ligne! Ce fut un voyage où plus ennuyeux, c'est mieux. Notez les deux entrées beaucoup plus intéressantes ci-dessous:
50 octets
Essayez-le en ligne! Au lieu de la solution impérative sans intérêt, nous pouvons faire une solution récursive, pour un seul octet supplémentaire.
53 octets
Essayez-le en ligne! Oui. Une fonction anonyme récursive, grâce à la réponse brillante de @ ceilingcat sur ma question de conseils . Une fonction anonyme qui retourne une fonction anonyme récursive en se définissant dans sa liste d'arguments. J'aime les fonctions anonymes. Mmmmm.
la source
MATL , 11 octets
Essayez-le en ligne!
Cela fonctionne en supprimant chaque deuxième élément.
Explication
la source
Japt , 10 octets
L'essayer
la source
Java (JDK) , 102 octets
Il y a déjà une réponse C #, alors j'ai décidé de tenter ma chance avec une réponse Java.
Essayez-le en ligne!
la source
Crystal , 58 octets
Avec
Array#sort
( 58 octets ):Essayez-le en ligne!
Sans
Array#sort
( 101 octets ):Essayez-le en ligne!
la source
Husk ,
6 à5 octets1 octet économisé grâce à Zgarb
Essayez-le en ligne!
Explication
la source
Ċ2
au lieu de(←½
pour sauvegarder un octet.Gaia ,
9 à8 octetsEssayez-le en ligne!
Explication:
la source
Julia 1.0 , 30 octets
Essayez-le en ligne!
Prend chaque deuxième élément du tableau s'il n'est pas trié.
la source
-
pour 20 octets. aussi nous ne comptons presque toujours pas les caractères: | donc ce serait bien si cela était retiré de l'en-têteC ++ (gcc) , 103 octets
Je ne peux pas commenter, mais j'ai amélioré la version de movatica en réduisant le nombre d'inclusions et en utilisant auto.
-2 octets: ceilingcat
-2 octets: uniquement en ASCII
Essayez-le en ligne!
la source
l.size()/2
?(n+1)/2
ou(n-1)/2
sont les deux valides. hmm ....VDM-SL , 99 octets
Jamais soumis dans vdm auparavant, donc pas sûr des règles spécifiques à la langue. Donc, j'ai soumis comme une définition de fonction qui prend un
seq of int
et retourne unseq of int
Un programme complet à exécuter pourrait ressembler à ceci:
la source
Pyth, 10 octets
Essayez-le en ligne ici . Cela supprime la seconde moitié à chaque itération, en arrondissant au bas. Pour le changer, supprimer la première moitié, en arrondissant vers le haut, changer le
h
ene
.la source
hc
par%
. Cela vous permet également de supprimer la variable lambda de finZ
et de laisser Pyth la remplir implicitement, pour un total de 2 octets enregistrés.C ++ (gcc) ,
139137116 octets-2 octets merci à ceilingcat, -21 octets merci à PeterZuger
Redimensionnez le vecteur à sa première moitié jusqu'à ce qu'il soit trié.
Essayez-le en ligne!
la source
include
sK (oK) ,
22 à20 octetsSolution:
Essayez-le en ligne!
Parcourez l'entrée jusqu'à ce qu'elle soit triée ... Si ce n'est pas le cas, prenez d'abord n / 2 éléments.
Modifications:
la source
(.5*#x)#x
->*2 0N#x
2 0N
mais j'ai supposé que ce serait plus long (sans test), merci!Julia 1.0 , 33 octets
Essayez-le en ligne!
la source
Retina , 38 octets
Essayez-le en ligne! Prend des nombres séparés par des virgules. Explication:
Convertir en unaire.
Répétez l'opération tant que la liste n'est pas triée ...
... supprimer tous les éléments pairs.
Convertir en décimal.
la source
C (gcc) , 66 octets
Détache la deuxième moitié de la liste à chaque itération (
n/2+1
éléments si la longueur est impair).Essayez-le en ligne!
Prend l'entrée comme un pointeur au début d'un tableau de
int
suivi de sa longueur. Les sorties en retournant la nouvelle longueur du tableau (trie sur place).Version non-golfée:
la source
~i+n
lieu dei<n-1