Driftsort est un moyen simple de "trier" un tableau. Il fonctionne en «faisant glisser» ou en «tournant» les éléments dans le tableau jusqu'à ce que le tableau soit trié ou jusqu'à ce que le tableau ne soit pas trié.
Passons en revue deux exemples. Tout d'abord, considérez le tableau [10, 2, 3, 4, 7]
. Comme le tableau n'est pas trié, nous le faisons pivoter une fois. (Cela peut se produire dans les deux sens, tant qu'il reste dans la même direction.) Ensuite, le tableau devient:
[7, 10, 2, 3, 4]
Ce n'est pas trié, alors nous tournons à nouveau.
[4, 7, 10, 2, 3]
Et encore:
[3, 4, 7, 10, 2]
Et une dernière fois:
[2, 3, 4, 7, 10]
Et c'est trié! Le tableau [10, 2, 3, 4, 7]
est donc dérivable. Voici toutes les rotations du tableau, pour plus de clarté:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
Considérez maintenant le tableau [5, 3, 9, 2, 6, 7]
. Regardez ses rotations:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
Aucun de ces tableaux n'est trié, donc le tableau [5, 3, 9, 2, 6, 7]
n'est pas dérivable.
Objectif Étant donné un tableau / une liste d'entiers non vides comme entrée dans un programme / une fonction, implémentez la dérive sur l'entrée et la sortie, ou affichez une valeur de falsey ( ou un tableau / liste vide) si elle ne peut pas être dérivée. Les entiers sont liés à vos langues max / min, mais cela doit être au moins 255 pour le max et 0 pour le min.
Vous pouvez utiliser des méthodes de tri intégrées, mais pas une méthode intégrée qui résout le problème.
Il s'agit d'un code-golf , donc le programme le plus court en octets.
Cas de test
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
sorted(l)
est une sous-liste contiguë del+l
.shiftsort
?shift
opération qui supprime le premier élément d'un tableau.Réponses:
Gelée , 6 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Rubis, 33
a.any?
se déclenche jusqu'à une fois pour chaque élément du tableau, sauf qu'il s'arrête (et renvoie vrai) dès que le tableau a été muté dans un état trié. Si cela se produit, nous renvoyons le tableau muté. Sinon, nous retournons la fausse valeur quiany?
revient.la source
Python 2, 51 octets
Ne prend pas la peine de tourner. Au lieu de cela, trie la liste, puis voit si l'original est triable par dérive en vérifiant s'il y a au plus une diminution parmi les éléments consécutifs de la liste cyclifiée. Le nombre est
<3
dû au fait quemap
la liste la plus courte est remplieNone
à la fin, ce qui ajoute une fausse diminution.la source
[1, 3, 2, 4]
n'a qu'une diminution parmi les éléments consécutifs, mais il n'est pas triable par dérive.<3
you too<3
c'est pour éviter d'avoir à faire tourner la liste avec précision.Pyth, 9 octets
Explication:
Essayez-le ici!
Ou utilisez une suite de tests!
la source
.:
. Les combinaisons comprendraient des éléments non contigus.Matlab,
614741 octetsMerci @Suever pour -6 octets!
Si
strfind([a,a],sort(a))
essaie de trouver le vecteur d'entrée trié en tant que «sous-chaîne» de l'élément non trié, il a été ajouté à lui-même. Si vrai, l'entrée est dérivable et nous obtenons un vecteur de longueur 2, sinon nous obtenons un vecteur vide.min
transforme simplement cela en un nombre / vecteur vide. L'ajout du vecteur trié à 0 l'affiche simplement, l'ajout à un vecteur vide génère une erreur.la source
[2, 3]
n'est-elle pas une sous-liste de[12, 34]
?strfind
peut fonctionner directement avec des nombres, pas seulement avec des caractères (même si ce n'est pas documenté). Si les nombres étaient interprétés comme des caractères, ils seraient limités à65535
(essayez par exemple+char(1e5)
)Julia,
716652 octetsIl s'agit d'une fonction anonyme qui accepte un tableau et renvoie un tableau ou un booléen. Pour l'appeler, affectez-le à une variable.
Pour un tableau d'entrée x , nous construisons l'ensemble de toutes les rotations de x et vérifions si la version triée x est un élément de cette liste. Si c'est le cas, nous renvoyons x trié, sinon nous retournons faux.
19 octets enregistrés grâce à Dennis!
la source
Pip , 15 + 1 =
1716 octetsUgh, les autres langues de golf soufflent cela hors de l'eau. Cependant, puisque je l'ai déjà écrit ...
Prend les entrées sous forme d'arguments de ligne de commande séparés par des espaces. Nécessite
-p
ou un autre indicateur de formatage de tableau pour afficher le résultat de manière lisible plutôt que concaténé. Le faux cas produit une chaîne vide, qui est visible grâce à la nouvelle ligne de fin.la source
JavaScript (ES6),
727065 octetsRetourne
0
en cas d'échec. La version précédente de858380 octets évitait d'appelersort
:Modifier: enregistré 2 octets en initialisant
c
à-1
au lieu de0
. 5 octets enregistrés en passant dereduce
àmap
, soupir ...la source
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
et[75, 230, 30, 42, 50]
.sort
, qui a provoqué l'échec du troisième test. Les deux autres échecs de test ont été causés par un golf excessif; Je suis revenu à la version précédente.05AB1E , 12 octets
Code:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
Snowman 1.0.2 , 27 octets
Il s'agit d'un sous-programme qui prend des entrées et des sorties vers le permavar actuel.
Essayez-le en ligne!
la source
MATL,
1312109 octetsLa même idée que la réponse de @ flawr où nous détournons
strfind
(Xf
) pour trouver la version triée de l'entrée dans la concaténation de deux copies de l'entrée.Essayez-le en ligne!
Explication
la source
g
? Ou remplacezng
para
n
parce quen
pourrait être> 1. fonctionnea
définitivement . J'ai pensé qu'il y avait une meilleure façon. Merci!Julia, 33 octets
Essayez-le en ligne!
Comment ça marche
Cela concatène le tableau x avec lui-même et compte le nombre de paires qui sont en désordre, c'est-à-dire le nombre de sous-réseaux contigus [a, b] pour lesquels b - a <0 . Si c est le nombre de paires non ordonnées de x lui-même et t est 1 si le dernier élément de x est plus grand que son premier,
sum
renverra 2c + t .Le tableau x est dérivable ssi (c, t) = (1, 0) ( x doit être tourné à la plus petite valeur de la seule paire non ordonnée), (c, t) = (0, 1) ( x est trié) ou (c, t) = (0, 0) ( x est trié et tous ses éléments sont égaux), ce qui est vrai si 2c + t <3 .
la source
Javascript ES6,
484543 caractèresTester:
la source
(x+[,x])
et un octet supplémentaire en utilisant~
au lieu de1+
dans votre condition.Brachylog , 39 octets
J'ai vraiment besoin d'ajouter un argument facultatif à
$( - circular permute left
pour permuter plus d'une fois ... cela aurait été de 13 octets. Cela attendra après avoir implémenté un nouveau transpilateur stable dans Prolog.Explication
la source
Rubis, 47 octets
Fonction récursive. Renvoie
nil
si le tableau d'entrée ne peut pas être dérivé.la source
CJam,
17 ans13 octetsMerci à Dennis d'avoir économisé 4 octets.
Un bloc sans nom (fonction) qui prend et renvoie une liste.
Suite de tests.
Explication
Cela utilise essentiellement l'observation de xnor que la liste triée apparaît deux fois dans la liste d'origine si sa dérive est triable:
la source
C ++ 14, 242 caractères
Si je ne peux pas laisser la sortie vide, 252 caractères http://ideone.com/HAzJ5V
Version non golfée http://ideone.com/Dsbs8W
PS: Basé sur l' idée de @ MichelfrancisBustillos .
la source
Java 7, 207 octets
Essai détaillé ici
la source
Java 175
imprime la sortie sous forme de valeurs séparées par des espaces ou imprime
f
pour une valeur de falsey.parcourt toutes les combinaisons du tableau d'entiers jusqu'à ce qu'il trouve la séquence valide ou qu'il manque de combinaisons. le tableau n'est pas modifié, mais à la place la séquence dérivée est stockée sous forme de chaîne délimitée par des espaces.
un peu plus lisible:
essayez-le en ligne
la source
C, 105 octets
Cela accepte les entiers d'entrée comme arguments de ligne de commande séparés et imprime la liste de sortie sous la forme d'un entier par ligne.
Si la liste n'est pas dérivable, le programme se ferme prématurément en raison d'une exception à virgule flottante, donc sa sortie vide représente une liste vide.
Vérification
la source
Rubis, 28
Renvoie le tableau trié ou
nil
(qui est une valeur fausse) si l'entrée n'est pas triable par dérive.la source
Python, 53 octets
Si vous voulez tester cette tête sur https://www.repl.it/languages/python3 et copiez-collez ceci:
Comment ça marche:
s
est une variable stockant lesorted
fonction python qui trie les listesN
est la fonction principales(x)
est multipliée par la possibilité ou non de dériver la listestr(s(x))[1:-1]in str(x+x)
(grâce à @xnor)[1,2,3,4]*false
résultats dans une liste vide[]
[1,2,3,4]*true
traduit par[1,2,3,4]
la source
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
44 octets.Python, 83 octets
Cela a été honteux par les autres réponses en python, mais je pourrais aussi bien le poster de toute façon. Je n'aime vraiment pas
partie. Existe-t-il un moyen plus rapide de parcourir la liste?
la source
l.append(l.pop(0))or g==l for _ in l
économise un octet sur l'approche range-len. L'utilisation d'unlambda
permettrait d'économiser 14 octets supplémentaires.MATLAB / Octave, 118 octets
la source
input('')
. Évitez également les espaces inutiles et les parenthèses! Et vous pouvez à nouveau perdre quelques octets en définissant d'abordf=@issorted
.PowerShell v2 +,
8780 octetsParcourt la liste d'entrée
$a
, vérifiant chaque élément par paire (y compris le dernier et le premier) pour voir s'il y a plus d'une paire décroissante. Si la paire particulière diminue, nous décrémentons$c
. Génère la liste triée ou un élément unique0
, en fonction de la valeur de$c
à la fin. Si plus d'une "mauvaise" paire est présente, alors elle++$c
sera toujours négative, sinon ce sera au moins0
, donc le deuxième élément du pseudo-ternaire est choisi ($a|sort
).Je vois que xnor a fait quelque chose de similaire , mais je l'ai trouvé indépendamment.
la source
Facteur, 47 octets
joindre la séquence sur elle-même, puis vérifier si le rendu trié de l'original est une sous-séquence.
la source
dup dup append \\ natural sort \\ dip subseq?
s'adapte même au modèle 4-4-3 :)C ++, 313
359370octetsUn grand merci à @Qwertiy pour avoir fait fonctionner cela et pour m'avoir enseigné d'excellentes méthodes de golf!
Golfé:
Non golfé:
la source
using namespace std;
est 20 caractères quandstd::
6 fois est 30.bool s = False;
- pourquoi pas=0
? Vous pouvez laisser tomberreturn 0;
. Pourquoi les parenthèses sont-elles ici!s&&(c<=v.size())
?std::
etreturn 0;
) sont devenues une habitude dans les cours de programmation. J'ai vraiment besoin de mieux vérifier mes programmes.True
etFalse
au lieu detrue
etfalse
. ideone.com/kVTI25 - votre version, ideone.com/y8s44A - corrigé et préparé pour la version golf.True
etFalse
est de Python. Je ne savais même pas que tu pouvais écrireif
comme ça!Mathcad, à déterminer
Dans Mathcad, 0 (scalaire) == false.
Le nombre d'octets (équivalent) est à déterminer jusqu'à ce que la méthode de comptage soit convenue. Environ 52 octets en utilisant un octet = équivalence clavier opérateur / symbole.
la source
Mathematica
55 50 6158 octetsAvec 3 octets enregistrés grâce à Martin Büttner.
Mes tentatives précédentes n'ont pas réussi tous les tests. Je devais ajouter
Union
pour éviter les répétitions dans la liste qui étaient entrées dans l'ordre.Les tests
Explication
Faites pivoter vers la droite la liste d'entrée de 1 à
n
fois, oùn
est la longueur de la liste d'entrée. Si la liste d'entrée triée fait partie des listes tournées en sortie, renvoyez-la; sinon retournez une liste vide.la source
@@
et/@
sur des listes vides.Join@@
devrait encore être plus court queFlatten@
si.PHP, 98 octets
Produit un
1
si dérivable, sinon rienla source