Dériver un tableau

25

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 , 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]
Conor O'Brien
la source
5
Un moyen simple de vérifier si une liste peut être triée est si sorted(l)est une sous-liste contiguë de l+l.
xnor
Juste pour clarifier: si notre langage prend en charge les entiers négatifs, ils peuvent apparaître dans l'entrée, oui?
Dennis
@Dennis c'est correct.
Conor O'Brien
Cela ne devrait-il pas être appelé shiftsort?
Filip Haglund du
@FilipHaglund J'ai pensé à l'appeler ainsi, mais cela peut provoquer une confusion avec l' shiftopération qui supprime le premier élément d'un tableau.
Conor O'Brien

Réponses:

9

Gelée , 6 octets

ṙỤċṢȧṢ

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

ṙỤċṢȧṢ  Main link. Argument: A (list)

 Ụ      Grade up; return the indices of A, sorted by their corresponding values.
ṛ       Rotate A by each index, yielding the list of all rotations.
   Ṣ    Yield A, sorted.
  ċ     Count the number of times sorted(A) appears in the rotations.
        This gives 0 if the list isn't driftsortable.
    ȧṢ  Logical AND with sorted(A); replaces a positive count with the sorted list.
Dennis
la source
1
Ahem, 19 octets de UTF8.
rsaxvc
11
Jelly possède une page de codes personnalisée qui code chacun des 256 caractères qu'il comprend comme des octets uniques. (C'est 16 octets avec UTF-8 btw.)
Dennis
3
@Dennis: vous devriez copier / coller ceci dans toutes vos soumissions Jelly pour nous empêcher (c'est-à-dire ceux qui ne le savaient pas auparavant) de faire les mêmes commentaires? ;)
Olivier Dulac
18

Rubis, 33

->a{a.any?{a.sort==a.rotate!}&&a}

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 qui any?revient.

histocrate
la source
1
C'est super intelligent, en particulier la rotation en place. Bon travail!
Alex A.
Hélas, ma propre réponse Ruby a été battue. +1
Value Ink
3
Ah oui, l'ancienne technique du "trier jusqu'à ce que vous puissiez dire si elle peut être triée".
corsiKa
14

Python 2, 51 octets

lambda l:sorted(l)*(map(cmp,l[-1:]+l,l).count(1)<3)

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 <3dû au fait que mapla liste la plus courte est remplie Noneà la fin, ce qui ajoute une fausse diminution.

xnor
la source
2
[1, 3, 2, 4]n'a qu'une diminution parmi les éléments consécutifs, mais il n'est pas triable par dérive.
Neil
1
@Neil Oh shoot.
xnor
@Neil Je pense que cela le corrige. Pourriez-vous s'il vous plaît jeter un oeil?
xnor
10
Aw we <3you too
Fund Monica's Lawsuit
Je ne peux pas dire que je suis un expert de Python, mais cela semble raisonnable en supposant que <3c'est pour éviter d'avoir à faire tourner la liste avec précision.
Neil
10

Pyth, 9 octets

*SQ}SQ.:+

Explication:

           - Q = eval(input())
         + -    Q+Q
       .:  -   sublists(^)
   }       -  V in ^
    SQ     -   sorted(Q)
*SQ        - ^ * sorted(Q) (return sorted(Q) if ^ True)

Essayez-le ici!

Ou utilisez une suite de tests!

Bleu
la source
1
Je pense que vous voulez dire des sous-chaînes (sous-listes) .:. Les combinaisons comprendraient des éléments non contigus.
xnor
6

Matlab, 61 47 41 octets

Merci @Suever pour -6 octets!

@(a)sort(a)+0*min(strfind([a,a],sort(a)))

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. mintransforme 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.

flawr
la source
La vérification de la sous-chaîne [2, 3]n'est-elle pas une sous-liste de [12, 34]?
xnor
Oui, chaque tableau d'entiers peut également être interprété comme une chaîne, où chaque nombre est traité comme un caractère, quelle que soit sa taille.
flawr
@flawr Mon interprétation est que cela strfindpeut 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))
Luis Mendo
@LuisMendo Vous avez raison, cela fonctionne même avec des nombres à virgule flottante. Notez que les nombres supérieurs à 65535 seront simplement affichés comme un espace lorsqu'ils sont considérés comme faisant partie d'une chaîne.
flawr
5

Julia, 71 66 52 octets

x->(y=sort(x))∈[circshift(x,i)for i=1:endof(x)]&&y

Il 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!

Alex A.
la source
4

Pip , 15 + 1 = 17 16 octets

Ugh, les autres langues de golf soufflent cela hors de l'eau. Cependant, puisque je l'ai déjà écrit ...

L#gI$<gPBPOgYgy

Prend les entrées sous forme d'arguments de ligne de commande séparés par des espaces. Nécessite -pou 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.

                 Implicit: g is array of cmdline args; y is empty string
L#g              Loop len(g) times:
         POg       Pop the first item from g
      gPB          Push it onto the back of g
    $<             Fold on < (true if g is now sorted)
   I        Yg     If true, yank g into y
              y  Autoprint y
DLosc
la source
4

JavaScript (ES6), 72 70 65 octets

a=>a.map(y=>{c+=x>y;x=y},x=a.slice(c=-1))|c<1&&a.sort((a,b)=>a-b)

Retourne 0en cas d'échec. La version précédente de 85 83 80 octets évitait d'appeler sort:

a=>a.map((y,i)=>{x>y&&(c++,j=i);x=y},x=a.slice(c=-1))|c<1&&a.splice(j).concat(a)

Modifier: enregistré 2 octets en initialisant cà -1au lieu de 0. 5 octets enregistrés en passant de reduceà map, soupir ...

Neil
la source
Voir le montage;)
Conor O'Brien
L'appel pour trier les numéros est incorrect. Vérifiez l'échantillon [10, 2, 3, 4, 7].
Qwertiy
Ce code failes aussi 3 tests: [1], [0, 0, 0, 0, 0, 0, 0]et [75, 230, 30, 42, 50].
Qwertiy
@Qwertiy Désolé pour cette erreur 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.
Neil
3

Snowman 1.0.2 , 27 octets

((}#AsO|##aC,as|aLNdE`aR*))

Il s'agit d'un sous-programme qui prend des entrées et des sorties vers le permavar actuel.

Essayez-le en ligne!

((                       ))  subroutine
  }                          set our active variables b, e, and g:
                              .[a] *[b] .[c]
                              .[d]      *[e]    (* represents an active variable)
                              .[f] *[g] .[h]
   #                         store the input in variable b
    AsO                      sort in-place
       |                     swap b with g; now sorted input is in g
        ##                   store the input again in b and e
          aC                 concat; now the input doubled is in b and e is empty
            ,                swap e/g; now b has 2*input and e has sorted input
             as              split 2*input on sort(input) and store result in g
               |             bring the result up to b (we no longer care about g)
                aLNdE        take length and decrement; now we have 0 in b if the
                               array is not driftsortable and 1 if it is
                     `aR     repeat e (the sorted array) b times:
                               if b is 0 (nondriftsortable), returns [] (falsy)
                               otherwise (b=1), returns sorted array unchanged
                        *    put this back into the permavar
Poignée de porte
la source
3

MATL, 13 12 10 9 octets

SGthyXfa*

La 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

        % Implicitly get input
S       % Sort the input
Gth     % Explicitly grab the input again and concatenate with itself
y       % Copy the sorted version from the bottom of the stack
Xf      % Look for the sorted version as a subset
a       % Gives a 1 if there were matches and 0 otherwise
*       % Multiply by the sorted array. Yields all zeros for no match and the
        % sorted array when a match was found
        % Implicitly display the stack contents
Suever
la source
1
Vous ne pouvez pas supprimer g? Ou remplacez ngpara
Luis Mendo
@LuisMendo Ne peut pas remplacer par juste un nparce que npourrait être> 1. fonctionne a définitivement . J'ai pensé qu'il y avait une meilleure façon. Merci!
Suever
3

Julia, 33 octets

x->sum(diff([x;x]).<0)<3&&sort(x)

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, sumrenverra 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 .

Dennis
la source
3

Javascript ES6, 48 45 43 caractères

x=>~(x+[,x]).indexOf(x.sort((a,b)=>a-b))&&x

Tester:

f=x=>~(x+[,x]).indexOf(x.sort((a,b)=>a-b))&&x
;`[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]`
.split`
`.map(t => t.replace(/^(.*) => (.*)$/, "f($1)+'' == $2")).every(eval)
Qwertiy
la source
Je pense que vous pouvez enregistrer deux octets en utilisant (x+[,x])et un octet supplémentaire en utilisant ~au lieu de 1+dans votre condition.
Neil
@ user6188402, oui, merci.
Qwertiy
2

Brachylog , 39 octets

l:0re:?{[0:L],!L.|rh$(L,?h-1=:L:1&.}.o.

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

l:0re                                     I = a number between 0 and the length of Input
     :?{[0:L],!L.|rh$(L,?h-1=:L:1&.}      All this mess is simply circular permutating the
                                          input I times
                                    .o.   Unify the Output with that circular permutation
                                          if it is sorted, else try another value of I
Fatalize
la source
2

Rubis, 47 octets

Fonction récursive. Renvoie nilsi le tableau d'entrée ne peut pas être dérivé.

f=->a,i=0{a.sort==a ?a:a[i+=1]?f[a.rotate,i]:p}
Encre de valeur
la source
2

CJam, 17 ans 13 octets

Merci à Dennis d'avoir économisé 4 octets.

{_$\_+1$#)g*}

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:

_$   e# Duplicate input and sort.
\_+  e# Get other copy and append to itself.
1$   e# Copy sorted list.
#    e# Find first position of sorted list in twice the original,
     e# of -1 if it's not found.
)g   e# Increment and take signum to map to 0 or 1.
*    e# Repeat sorted array that many times to turn it into an empty
     e# array if the input was not drift sortable.
Martin Ender
la source
@ Dennis oh, on dirait que nous avons trouvé ça de façon indépendante. Merci quand même. :)
Martin Ender
2

C ++ 14, 242 caractères

#include<iostream>
#include<vector>
#include<algorithm>
#define b v.begin()
using namespace std;int main(){vector<int>v;int x,n=0;for(;cin>>x;++n)v.push_back(x);for(x=n;x--;rotate(b,b+1,b+n))if(is_sorted(b,b+n)){for(x:v)cout<<x<<' ';return 0;}}

Si je ne peux pas laisser la sortie vide, 252 caractères http://ideone.com/HAzJ5V

#include<iostream>
#include<vector>
#include<algorithm>
#define b v.begin()
using namespace std;int main(){vector<int>v;int x,n=0;for(;cin>>x;++n)v.push_back(x);for(x=n;x--;rotate(b,b+1,b+n))if(is_sorted(b,b+n)){for(x:v)cout<<x<<' ';return 0;}cout<<'-';}

Version non golfée http://ideone.com/Dsbs8W

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

#define b v.begin()

int main()
{
  vector <int> v;
  int x, n=0;

  for(;cin>>x;++n)
    v.push_back(x);

  for(x=n;x--;rotate(b,b+1,b+n))
    if(is_sorted(b,b+n))
    {
      for(x:v) cout<<x<<' ';
      return 0;
    }

  cout << '-';
}

PS: Basé sur l' idée de @ MichelfrancisBustillos .

Qwertiy
la source
2

Java 7, 207 octets

int[]D(int[]i){int x,z;z=x=-1;int[]d=new int[i.length];while(++x<i.length)if(i[x]>i[(x+1)%i.length])if(z<0)z=(x+1)%i.length;else return null;if(z<0)z=0;x=-1;while(++x<d.length)d[x]=i[z++%i.length];return d;}

Essai détaillé ici

// driftsort in ascending-order
int[] D(int[]i)
{
    int x = -1,z = -1;
    int[] d = new int[i.length];

    while ((++x) < i.length)
    {
        if (i[x] > i[(x+1)%i.length])
        {
            if(z < 0) z = (x+1)%i.length;
            else return null; // not driftsortable
        }
    }

    if(z < 0) z = 0;
    x = -1;
    while ((++x) < d.length)
    {
        d[x] = i[(z++)%i.length];
    }

    return d;
}
Khaled.K
la source
2

Java 175

imprime la sortie sous forme de valeurs séparées par des espaces ou imprime fpour une valeur de falsey.

void d(int[]a){String s;for(int v,w,x=-1,y,z=a.length;++x<z;){v=a[x];s=""+v;for(y=0;++y<z;v=w){w=a[(x+y)%z];if(v>w){s="f";break;}s+=" "+w;}if(y==z)break;}System.out.print(s);}

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:

void driftsort(int[]array){
    String str;
    for(int previous,current,x=-1,y,len=array.length;++x<len;){
        previous=array[x];
        s=""+previous;
        for(y=0;++y<len;previous=current){
            current=array[(y+x)%len];
            if(previous>current){
                str="false";
                break;
            }
            str+=" "+current;
        }
        if(y==len)break;
    }
    System.out.print(str);
}

essayez-le en ligne

Jack Ammo
la source
2

C, 105 octets

i,s;main(c,v)char**v;{c--;while(i++<c)if(atoi(v[i])>atoi(v[i%c+1]))c*=!s,s=i;while(--i)puts(v[s++%c+1]);}

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

$ gcc -o driftsort driftsort.c 2>&-
$ ./driftsort 1 | cat
1
$ ./driftsort 5 0 5 | cat
0
5
5
$ ./driftsort 3 2 1 | cat
$ ./driftsort 0 9 3 | cat
$ ./driftsort 1 2 3 4 | cat
1
2
3
4
$ ./driftsort 4 1 2 3 | cat
1
2
3
4
$ ./driftsort 0 2 0 2 | cat
$ ./driftsort 5 3 9 2 6 7 | cat
$ ./driftsort 0 0 0 0 0 0 0 | cat
0
0
0
0
0
0
0
$ ./driftsort 75 230 30 42 50 | cat
30
42
50
75
230
$ ./driftsort 255 255 200 200 203 | cat
200
200
203
255
255
Dennis
la source
2

Rubis, 28

->a{(a*2*?,)[a.sort!*?,]&&a}

Renvoie le tableau trié ou nil(qui est une valeur fausse) si l'entrée n'est pas triable par dérive.

Ventero
la source
2

Python, 53 octets

s,N=sorted,lambda x:s(x)*(str(s(x))[1:-1]in str(x+x))

Si vous voulez tester cette tête sur https://www.repl.it/languages/python3 et copiez-collez ceci:

s,N=sorted,lambda x:s(x)*(str(s(x))[1:-1]in str(x+x))
print(N([1,2,3,4,5,0]))

Comment ça marche:

  • s est une variable stockant le sorted fonction python qui trie les listes
  • N est la fonction principale
  • La liste d'entrée triée: s(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)
    • Cela fonctionne parce que [1,2,3,4]*false résultats dans une liste vide[]
    • et se [1,2,3,4]*truetraduit par[1,2,3,4]
Samy Bencherif
la source
1
En Python 2, vous pouvez le raccourcir à lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)44 octets.
Dennis
1

Python, 83 octets

def f(l):g=sorted(l);return g if any(l[x:]+l[:x]==g for x in range(len(l)))else 1>2

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

range(len(l)))

partie. Existe-t-il un moyen plus rapide de parcourir la liste?

DJMcMayhem
la source
1
Ce n'est pas beaucoup, mais l.append(l.pop(0))or g==l for _ in léconomise un octet sur l'approche range-len. L'utilisation d'un lambdapermettrait d'économiser 14 octets supplémentaires.
Dennis
1

MATLAB / Octave, 118 octets

function r(a)
i=0
while (~issorted(a) && i<length(a))
    a=a([2:end 1]),i=i+1
end
if issorted(a)
    a
else
    0
end
costrom
la source
2
Je pense que vous pouvez déjà enregistrer quelques octets en écrivant tout sur une seule ligne et en utilisant input(''). Évitez également les espaces inutiles et les parenthèses! Et vous pouvez à nouveau perdre quelques octets en définissant d'abord f=@issorted.
flawr
1

PowerShell v2 +, 87 80 octets

param($a)0..($a.length-1)|%{if($a[$_-1]-gt$a[$_]){$c--}};(0,($a|sort))[++$c-ge0]

Parcourt 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 unique 0, en fonction de la valeur de $cà la fin. Si plus d'une "mauvaise" paire est présente, alors elle ++$csera toujours négative, sinon ce sera au moins 0, 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.

AdmBorkBork
la source
1

Facteur, 47 octets

[ dup dup append [ natural-sort ] dip subseq? ]

joindre la séquence sur elle-même, puis vérifier si le rendu trié de l'original est une sous-séquence.

chat
la source
1
Cela ressemble à un haïku philosophique: dup dup append \\ natural sort \\ dip subseq?s'adapte même au modèle 4-4-3 :)
Akiiino
@Akiiino: Les langues sans point D sont tellement poétiques.
chat
1

C ++, 313 359 370 octets

Un grand merci à @Qwertiy pour avoir fait fonctionner cela et pour m'avoir enseigné d'excellentes méthodes de golf!

Golfé:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){vector<int> v;int x,c=0,s=0,y;while(cin>>x)v.push_back(x);do if(rotate(v.begin(),v.begin()+1,v.end()),c++,is_sorted(v.begin(),v.end()))s=1;while(!s&c<=v.size());if(s)for(y=0;y<v.size();y++)cout<<v[y]<<" ";else cout<<"False";}

Non golfé:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
  vector <int> v;
  int x, c=0, s=0, y;

  while(cin>>x)
    v.push_back(x);

  do 
    if (
      rotate(v.begin(),v.begin()+1,v.end()),
      c++,
      is_sorted(v.begin(),v.end())
    ) s = 1;
  while(!s & c <= v.size());

  if (s)
    for(y=0; y<v.size(); y++)
      cout<<v[y]<<" ";
  else
    cout<<"False";
}
Michelfrancis Bustillos
la source
1
Le golf ne consiste pas seulement à supprimer des espaces. using namespace std;est 20 caractères quand std::6 fois est 30. bool s = False;- pourquoi pas =0? Vous pouvez laisser tomber return 0;. Pourquoi les parenthèses sont-elles ici !s&&(c<=v.size())?
Accolades
Ouah merci! Beaucoup de choses (comme std::et return 0;) sont devenues une habitude dans les cours de programmation. J'ai vraiment besoin de mieux vérifier mes programmes.
Michelfrancis Bustillos
1
Il existe également un ensemble de bogues. Pourquoi lisez-vous jusqu'à zéro et mettez-vous ce zéro dans les données? Pourquoi imprimez-vous à la taille incluse? Pourquoi Trueet Falseau lieu de trueet false. ideone.com/kVTI25 - votre version, ideone.com/y8s44A - corrigé et préparé pour la version golf.
Qwertiy
Merci encore! Caping Trueet Falseest de Python. Je ne savais même pas que tu pouvais écrire ifcomme ça!
Michelfrancis Bustillos
1
Et beaucoup plus abrégé: ideone.com/Dsbs8W et golfed ideone.com/HAzJ5V (<s> 255 </s> 252 caractères). C ++ 14 utilisé pour la boucle foreach.
Qwertiy
1

Mathcad, à déterminer

enter image description here

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.

Stuart Bruff
la source
1

Mathematica 55 50 61 58 octets

Avec 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 Unionpour éviter les répétitions dans la liste qui étaient entrées dans l'ordre.

Join@Union@Cases[NestList[RotateRight,#,Length@#],Sort@#]&

Les tests

Join@Union@Cases[NestList[RotateRight,#,Length@#],Sort@#]&/@
{{1},{5,0,5},{3,2,1},{0,9,3},{1,2,3,4},{4,1,2,3},{0,2,0,2},{5,3,9,2,6,7},
{0,0,0,0,0,0,0},{75,230,30,42,50},{255,255,200,200,203}}

{{1}, {0, 5, 5}, {}, {}, {1, 2, 3, 4}, {1, 2, 3, 4}, {}, {}, {0, 0, 0, 0, 0, 0, 0}, {30, 42, 50, 75, 230}, {200, 200, 203, 255, 255}}


Explication

Faites pivoter vers la droite la liste d'entrée de 1 à nfois, où nest 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.

DavidC
la source
@ MartinBüttner, Votre suggestion a échoué dans certains des cas de test, en particulier, #s 3,4,7,8.
DavidC
@DavidC Ah, bon sang, vous avez raison, j'ai mélangé le comportement de @@et /@sur des listes vides. Join@@devrait encore être plus court que Flatten@si.
Martin Ender
1

PHP, 98 octets

Produit un 1si dérivable, sinon rien

$a=$argv[1];$b=$a;sort($a);foreach($a as $v){echo($a===$b?1:'');array_unshift($b, array_pop($b));}
MonkeyZeus
la source