Je suis censé trier une liste de chiffres, mais je suis super paresseux. Il est très difficile de trouver comment échanger tous les nombres jusqu'à ce qu'ils soient tous dans un ordre croissant. J'ai donc créé mon propre algorithme qui garantira que la nouvelle liste sera triée¹. Voici comment cela fonctionne:
Pour une liste de taille N , nous aurons besoin de N-1 itérations. A chaque itération,
Vérifiez si le nième nombre est plus petit que le n + lième nombre. Si tel est le cas, ces deux nombres sont déjà triés et nous pouvons ignorer cette itération.
S'ils ne le sont pas, vous devez continuellement décrémenter les N premiers nombres jusqu'à ce que ces deux nombres soient en ordre.
Prenons un exemple concret. Disons que l'entrée était
10 5 7 6 1
Lors de la première itération, nous comparerons 10 et 5. 10 étant supérieur à 5, nous le décrémentons jusqu'à ce qu'il soit plus petit:
4 5 7 6 1
Nous comparons maintenant 5 et 7. 5 est inférieur à 7, nous n'avons donc rien à faire avec cette itération. Nous allons donc au suivant et comparons 7 et 6. 7 est supérieur à 6, nous décrémentons donc les trois premiers nombres jusqu'à ce qu'il soit inférieur à 6, et nous obtenons ceci:
2 3 5 6 1
Maintenant nous comparons 6 et 1. Encore une fois, 6 est supérieur à 1, nous décrémentons donc les quatre premiers nombres jusqu'à ce qu'il soit inférieur à 1, et nous obtenons ceci:
-4 -3 -1 0 1
Et nous avons fini! Maintenant, notre liste est en parfait ordre de tri. Et, pour améliorer encore les choses, il nous suffisait de parcourir la liste N-1 fois. Cet algorithme trie donc les listes en un temps O (N-1) , ce qui, j'en suis presque sûr, est l'algorithme le plus rapide qui soit.²
Votre défi pour aujourd'hui est de mettre en œuvre ce tri paresseux. Votre programme ou fonction recevra un tableau d’entiers dans le format standard de votre choix. Vous devez effectuer ce tri paresseux et renvoyer la nouvelle liste "triés" . Le tableau ne sera jamais vide ou ne contiendra pas des entiers.
Voici quelques exemples:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Comme toujours, c'est du code-golf , alors écrivez le programme le plus court possible!
¹ Cela ne veut pas dire à quoi ça ressemble, mais c'est techniquement vrai
² Je plaisante complètement, s'il vous plaît ne me déteste pas
la source
<sarcasm>
En réalité, cet algorithme de tri est toujoursO(N^2)
complexe, car vous devez parcourir tous les éléments de la liste auxquels vous avez déjà accédé pour les décrémenter. Je recommande de parcourir la liste à l' envers et de ne décrémenter qu'un nombre par étape si nécessaire. Cela vous donnera une vraieO(N)
complexité!</sarcasm>
O(n^2)
en termes d'accès mémoire, mais n'est-ce pasO(n)
pour les comparaisons?O(N^2)
.Réponses:
Jelly ,
14 12 119 octets-2 octets grâce aux ETHproductions (utilisez la dyade minimale,
«
)Un lien monadique prenant et renvoyant des listes d'entiers.
Essayez-le en ligne! ou voir la suite de tests .
Je ne pense vraiment pas que c'est assez Lazy ™!
Comment?
la source
Haskell , 40 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 61 octets
Cas de test
Afficher l'extrait de code
la source
Gelée , 12 octets
Essayez-le en ligne!
Comment ça marche
L'idée de base en jeu est la suivante: si vous inversez les tableaux d'entrée et de sortie, la sortie est simplement l'entrée avec chaque delta de 0 ou plus remplacé par -1. Par exemple:
la source
k, 20 octets
Essayez-le en ligne.
Explication:
la source
Haskell, 56 octets
Essayez-le en ligne!
Conservez la première partie de la liste en paramètre
a
. A chaque étape, ajoutez l'élément suivantx
à la fin dea
et augmentez tous les éléments de a au minimum de(y-x-1)
et0
.la source
Python , 54 octets
Essayez-le en ligne!
Prend une entrée éclaboussée comme
f(1,2,3)
. Affiche une liste. Utilise le temps exponentiel.la source
C #, 76 octets
Cela modifie la liste en place. Il parcourt la liste en arrière et conserve un total cumulé du delta à appliquer à chaque numéro.
la source
JavaScript (ES6), 59 octets
la source
f=
réponses JS économiser deux octetsf(a)
), elle a donc toujours besoin du nom.Brain-Flak , 153 octets
Essayez-le en ligne!
Cela inclut
+1
pour le-r
drapeau.la source
R, 56 octets
function(s){s-c(rev(cumsum(rev(pmax(0,-diff(s)+1)))),0)}
la source
diff
, j’essayais de comprendre comment le faire fonctionner ... Soit dit en passant, vous pouvez vous débarrasser des accolades autour du corps de la fonction pour -2 octets, mais mieux encore, vous pouvez utiliser las=scan()
place d’une fonction définition pour économiser quelques octets de plus. Ce serait bien si vous incluiez un lien vers Essayez-le en ligne afin que d'autres personnes puissent vérifier que ce code fonctionne pour tous les cas de test.JavaScript (ES6), 68 octets
L'entrée et la sortie est un tableau d'entiers.
Test Snippet
la source
JavaScript (ES6), 50 octets
Explication:
Il s'agit d'une solution récursive, qui clone d'abord le tableau, puis diminue toutes les valeurs jusqu'à ce qu'un élément soit supérieur ou égal à l'élément suivant du tableau.
La fonction s’appelle elle-même tant que tous les éléments sont en panne. Lorsque les éléments sont enfin triés, le clone est renvoyé. (Nous ne pouvons pas renvoyer le tableau lui-même, car la
some()
méthode aurait décrémenté tous ses éléments, ce qui les aurait tous rendus par -1.)Cas de test:
la source
SWI-Prolog, 194 octets
Peut-être en mesure de l'essayer en ligne ici: http://swish.swi-prolog.org/p/LazySort.pl
Vous demandez
l(L, [10,5,7,6,1]).
qui dit "résoudre pour L, où L est la version triée paresseuse de cette liste".Les deux fonctions sont:
l
azysorted (A, B) - indique que A est la version de B lazysorted, s'il s'agit de deux listes vides, ou si A peut être obtenu en inversant B, en appelant une fonction d'assistance pour parcourir la liste et effectuer une soustraction avec un accumulateur. en poussant chaque valeur plus basse que la précédente et en inversant le résultat de cette manière.f
helper fait correspondre deux listes, la valeur du numéro précédent dans la liste et un accumulateur de différence en continu, et résout pour la nouvelle valeur de la position actuelle de la liste étant la valeur d'origine moins l'accumulateur de différence, éventuellement une nouvelle valeur nécessaire pour forcer valeur inférieure au numéro précédent dans la liste, etf
doit résoudre pour la queue de la liste de manière récursive avec l’accumulateur de différence désormais augmenté.Capture d'écran des cas de test sur Swish:
la source
JavaScript (ES6), 61 octets
Pas la solution la plus courte, mais je ne pouvais pas laisser passer l'occasion d'utiliser
reduceRight
.la source
C # (.NET Core) ,
89 88 8679 octetsfor
s.Essayez-le en ligne!
Il
for
parcourt d'abord le tableau, puis calcule le décrément et enfin le secondfor
décrémente les éléments, si nécessaire, jusqu'à lai
position th.Est-il valide de simplement modifier le tableau d'origine au lieu d'en retourner un nouveau (en s'habituant toujours aux règles)?
la source