Disons que j'ai une liste telle que [3, 0, 4, 2, 1]
, et que j'utilise le tri par sélection pour le trier, je pourrais le visualiser comme ceci:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Ce défi consiste à visualiser le tri comme ceci.
Contribution
Votre entrée sera une liste d'entiers positifs, dans le format de votre choix.
Tâche
Votre soumission doit trier la liste d'entrée en échangeant uniquement deux éléments à la fois, et à chaque échange, la soumission doit afficher la liste et un caractère sous chacun des éléments en cours d'échange. Si un nombre qui a été échangé a plus d'un chiffre, le caractère peut être n'importe où en dessous. À la fin, la soumission devrait afficher la liste triée.
Autres règles
- Le tri doit utiliser moins de swaps que n 4 , où n est la longueur de la liste.
- Le tri n'a pas besoin d'être déterministe.
- Les caractères sous l'échange peuvent être n'importe quel caractère sauf l'espace.
n^4
? Vous êtes un peu généreux ici.0
(veuillez corriger uniquement l'exemple afin de ne pas invalider les réponses qui ne peuvent pas gérer 0)Réponses:
Perl, 62 octets
Comprend +3 pour
-p
Donnez une entrée sous forme d'une seule ligne de chiffres sur STDIN:
Échange à plusieurs reprises la première inversion. La complexité de l'échange est la
O(n^2)
complexité du tempsO(n^3)
. Utilise les numéros échangés comme marque:visisort.pl
:Le programme prend également en charge les valeurs négatives et les nombres à virgule flottante
Si vous insistez sur un caractère de connexion, le code devient 66 octets:
Mais maintenant, il ne prend plus en charge les nombres négatifs et 0 (mais le programme ne doit de toute façon que prendre en charge les entiers positifs. Dans
0
l'exemple, c'est une erreur)la source
The characters under the swapped can be any char except space.
vous ne devriez pas avoir d'espaces entre les nombres dans la ligne de repère_
sous le premier chiffre, ce qui signifie que tous les caractères entre les deux seraient en fait des espaces). Je maintiens donc mon interprétation (sauf si le PO est en désaccord bien sûr). Buit juste pour te faire plaisir J'ai aussi ajouté une version sans espace :-)JavaScript (ES6), 158 octets
Tri par bulle. Exemple de sortie:
la source
-
sous le,
et les deux|
s seront toujours sous les nombres adjacents.PHP, 248 octets
Bubblesort ennuyeux gagne
PHP, 266 octets par chemin avec array_slice et min
sortie modifiée
I X
au lieu de*~~*
282 octets
Comment ça fonctionne
Recherche le minimum dans un tableau et le prend sur la première position Recherchez le minimum sans première position .... et ainsi de suite Si une valeur est double, la première valeur sera permutée
Exemple de sortie
la source
echo$t."\n";
, vous pouvez utiliserecho"$t\n";
et enregistrer un octet.Haskell,
165164162 octetsCela visualise le tri de la sélection. Exemple d'utilisation:
Comment ça fonctionne:
s % c
est une fonction d'aide qui fait deslength (show s) - 2
copies de personnagec
. Il est utilisé pour l'espacement avant les deux|
, une fois avecc == ' '
et une fois avecc == '-'
.La fonction principale
#
prend une listep
qui est la partie triée de la liste etx
qui est la partie encore à trier. La correspondance de modèle(h,t:s)<-span(/=minimum x)x
fractionne la listex
à son élément minimum et se lieh
à la partie avant le minimum,t
au minimum lui-même ets
à la partie après le minimum. Le reste est formaté sur deux lignes: 1) la liste à son état actuel (p++x
) et 2) la|----|
partie suivie d'un appel récursif de#
avect
annexé àp
et la tête deh
inséré entre la queue deh
ets
.PS: fonctionne également avec les nombres à virgule négative et / ou flottante:
Modifier: @BlackCap a enregistré 2 octets. Merci!
la source
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 octets
Il fonctionne également avec des nombres décimaux et négatifs.
Exemple:
la source
JavaScript (ES6), 147
155Utiliser n * n compare, mais (je crois) le nombre minimum de swaps. Et les positions de swap sont plus variables par rapport au type de bulles ennuyeuses.
Moins de golf et, je l' espère, plus compréhensible
Tester
la source
Java 7,
256 241282 octetsMerci à @Geobits et @Axelh pour avoir économisé 15 octets
Non golfé
production
la source
out
, vous devez mettre quelque chose commePrintStream out=System.out;
quelque part dans votre code.out
, vous devez utiliser un ternaire au lieu deif/else
si vous allez imprimer sur les deux branches. Quelque chose commeout.print(a>b?a:b);
au lieu deif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
ou encore mieux avec un ternaireout.print((j==i|j==m?a[j]:" ")+" ");
et ensuite vous pouvez supprimer {} de la boucle PS: j'utilise une importation statique pour l'instance de sortie, si cela vousSystem.
devant leout
s), et il manque le2
et3
sur les deux dernières lignes de swap.for(j=0;j<=m&i!=l-1;j++)
Gelée , 36 octets
Essayez-le en ligne!
Explication
L'exemple montré dans le lien TIO est particulièrement difficile pour ce programme; le
;0
début proche est nécessaire pour garantir que la boucle se termine juste au point où l'entrée est triée. Normalement, cela n'est pas nécessaire (car il se terminera après une autre itération), mais si le dernier échange concerne les deux premiers éléments (comme on le voit ici), l'itération de plus ne se produira pas et rendra la finition impossible la liste de manière cohérente. En tant que tel, nous devons nous assurer de ne rien échanger lors de la dernière itération de la boucle.la source