Le tri n'a aucun sens pour un tableau à deux dimensions ... ou pas?
Votre tâche consiste à prendre une grille d'entrée et à lui appliquer un algorithme de type bulle jusqu'à ce que toutes les valeurs de la grille ne diminuent pas de gauche à droite et de haut en bas le long de chaque ligne et colonne.
L'algorithme fonctionne comme suit:
- Chaque passe va ligne par ligne, de haut en bas, en comparant / échangeant chaque cellule avec ses voisins droit et inférieur.
- si la cellule est supérieure à un seul de ses voisins droit et inférieur, échangez avec celle dont elle est supérieure à
- si la cellule est supérieure à ses voisins droit et inférieur, échangez avec le voisin plus petit
- si la cellule est supérieure à ses voisins droit et inférieur, qui sont de la même valeur, échangez avec le voisin inférieur.
- si la cellule n'est pas plus grande que ses voisins droit et inférieur, ne faites rien
- Continuez jusqu'à ce qu'aucun échange ne soit effectué tout au long du passage. Ce sera lorsque chaque ligne et colonne sera dans l'ordre, de gauche à droite et de haut en bas.
Exemple
4 2 1
3 3 5
7 2 1
La première rangée de la passe permutera le 4 et le 2, puis le 4 avec le 1.
2 1 4
3 3 5
7 2 1
Lorsque nous aurons le 3 du milieu, il sera échangé avec le 2 ci-dessous
2 1 4
3 2 5
7 3 1
Ensuite, le 5 est échangé avec le 1 ci-dessous
2 1 4
3 2 1
7 3 5
La dernière rangée de la première passe déplace le 7 complètement à droite
2 1 4
3 2 1
3 5 7
Ensuite, nous revenons à la rangée du haut
1 2 1
3 2 4
3 5 7
Et continuez ligne par ligne ...
1 2 1
2 3 4
3 5 7
... jusqu'à ce que la grille soit "triée"
1 1 2
2 3 4
3 5 7
Un autre exemple
3 1 1
1 1 1
1 8 9
devient
1 1 1
1 1 1
3 8 9
plutôt que
1 1 1
1 1 3
1 8 9
car l'échange vers le bas est prioritaire lorsque les voisins droit et inférieur d'une cellule sont égaux.
Une implémentation de référence étape par étape peut être trouvée ici .
Cas de test
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
devient
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
devient
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
Règles
- Vous pouvez prendre la grille d'entrée dans n'importe quel format pratique
- Vous pouvez supposer que les valeurs de la grille sont toutes des entiers non négatifs dans la plage de 16 bits non signée (0-65535).
- Vous pouvez supposer que la grille est un rectangle parfait et non un tableau dentelé. La grille sera au moins 2x2.
- Si vous utilisez un autre algorithme de tri, vous devez fournir une preuve qu'il produira toujours le même ordre résultant que cette marque particulière de tri à bulles 2D, quelle que soit l'entrée. Je m'attends à ce que ce soit une preuve non triviale, donc vous feriez probablement mieux d'utiliser l'algorithme décrit.
Bon golf!
Réponses:
JavaScript (Node.js) , 129 octets
Essayez-le en ligne!
la source
APL (Dyalog Unicode) , 75 octets SBCS
Merci à @ Adám pour avoir économisé 11 octets.
Essayez-le en ligne!
la source
Langue Wolfram (Mathematica) , 183 octets
Essayez-le en ligne!
Je ne suis pas un expert de Mathematica, je suis sûr que cela peut être fait plus rapidement. En particulier, je pense que la double déclaration if pourrait être raccourcie en utilisant
Transpose
mais je ne sais pas comment.la source
R ,
169165144132 132 octetsEssayez-le en ligne!
la source
Propre , 240 octets
Essayez-le en ligne!
Implémente l'algorithme exactement comme décrit.
Le lien inclut l'analyse syntaxique d'entrée pour prendre le format dans la question.
la source
Python 2 ,
215208 octetsEssayez-le en ligne!
-7 octets, grâce aux ovs
la source
C # (.NET Core) , 310 octets
Sans LINQ. Utilise System.Collections.Generic uniquement pour formater la sortie après le retour de la fonction. La chose est stupide énorme. Au plaisir des golfs!
Essayez-le en ligne!
la source
Python 2 , 198 octets
Essayez-le en ligne!
Développé indépendamment de la réponse de TFeld, présente quelques différences.
la source
Fusain , 118 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. J'ai également passé quelques octets sur un formatage plus joli. Explication:
JavaScript a la propriété pratique qui
a[i]>a[i+1]
est false sii
est le dernier élément du tableau. Pour imiter cela dans le charbon de bois, je calcule unnan
en lançant9.e999
pour flotter puis en le soustrayant de lui-même. (Charcoal ne prend pas en charge les constantes flottantes exponentielles.) Je remplis ensuite le tableau d'origine à droite avec lenan
et ajoute également une ligne supplémentaire contenant uniquement lenan
. (L'indexation cyclique du charbon de bois signifie que je n'ai besoin que d'un élément dans cette ligne.)Boucle pour chaque élément du tableau. Cela devrait être plus que suffisant de boucles pour faire le travail, car j'inclus également tous les extras
nan
.Faites une boucle sur chaque index de ligne et obtenez la ligne à cet index. (Charcoal peut faire les deux avec une expression mais pas avec une commande.) Cela inclut la ligne fictive mais ce n'est pas un problème car toutes les comparaisons échoueront.
Faites une boucle sur chaque index de colonne et obtenez la valeur à cet index. Encore une fois, cela bouclera sur les valeurs fictives mais les comparaisons échoueront à nouveau.
Obtenez également les valeurs à droite et en dessous.
Si la cellule est supérieure à la valeur ci-dessous et qu'il n'est pas vrai que la valeur ci-dessous soit supérieure à la valeur à droite, échangez la cellule avec la valeur ci-dessous.
Sinon, si la cellule est supérieure à la valeur de droite, échangez-les.
Supprimez les
nan
valeurs et formatez le tableau pour une sortie implicite.la source
Kotlin , 325 octets
Essayez-le en ligne!
la source