Driftsortuj tablicę

25

Driftsort to prosty sposób na „sortowanie” tablicy. Działa poprzez „przesuwanie” lub „obracanie” elementów w tablicy, dopóki tablica nie zostanie posortowana lub dopóki tablica nie zostanie posortowana.

Przejrzyjmy dwa przykłady. Najpierw rozważ tablicę [10, 2, 3, 4, 7]. Ponieważ tablica nie jest posortowana, obracamy ją raz. (Może się to zdarzyć w dowolnym kierunku, pod warunkiem, że pozostaje ten sam kierunek.) Następnie tablica staje się:

[7, 10, 2, 3, 4]

To nie jest posortowane, więc obracamy ponownie.

[4, 7, 10, 2, 3]

I jeszcze raz:

[3, 4, 7, 10, 2]

I ostatni raz:

[2, 3, 4, 7, 10]

I to jest posortowane! Tak więc tablica [10, 2, 3, 4, 7]jest przenośna. Oto wszystkie obroty tablicy, dla przejrzystości:

[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]

Rozważ teraz tablicę [5, 3, 9, 2, 6, 7]. Spójrz na jego obroty:

[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]

Żadna z tych tablic nie jest sortowana, więc tablicy [5, 3, 9, 2, 6, 7]nie można przenosić.


Cel Biorąc pod uwagę niepustą tablicę / listę liczb całkowitych jako dane wejściowe do programu / funkcji, zaimplementuj driftsort na wejściu i wyślij go, lub wypisz wartość falsey ( lub pustą tablicę / listę), jeśli nie można go posortować. Liczby całkowite są przypisane do twoich języków max / min, ale musi to być co najmniej 255 dla maksimum i 0 dla min.

Możesz użyć wbudowanych metod sortowania, ale nie wbudowanego, który rozwiązuje problem.

To jest , więc najkrótszy program w bajtach.

Przypadki testowe

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
źródło
5
Łatwym sposobem sprawdzenia, czy lista jest dostępna do dryfowania, sorted(l)jest ciągła podlista l+l.
xnor 21.04.16
Wyjaśnij: jeśli nasz język obsługuje ujemne liczby całkowite, mogą wystąpić na wejściu, tak?
Dennis
@Dennis jest poprawny.
Conor O'Brien
Czy nie należy tego nazywać shiftsort?
Filip Haglund
@FilipHaglund Myślałem o tym, aby to tak nazwać, ale może to powodować zamieszanie w shiftoperacji, która usuwa pierwszy element tablicy.
Conor O'Brien

Odpowiedzi:

9

Galaretka , 6 bajtów

ṙỤċṢȧṢ

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ṙỤċṢȧṢ  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
źródło
1
Ahem, 19 bajtów UTF8.
rsaxvc
11
Jelly ma niestandardową stronę kodową, która koduje każdy z 256 znaków, które rozumie jako pojedyncze bajty. (Jest 16 bajtów z UTF-8 btw.)
Dennis
3
@Dennis: powinieneś skopiować / wkleić to we wszystkich swoich zgłoszeniach dotyczących Jelly, aby uniemożliwić nam (tj. Tym, którzy wcześniej tego nie wiedzieli) komentowanie? ;)
Olivier Dulac
18

Ruby, 33

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

a.any?odpala jeden raz dla każdego elementu w tablicy, z wyjątkiem tego, że zatrzymuje się (i zwraca wartość true), gdy tylko tablica zostanie zmutowana w posortowany stan. Jeśli tak się stanie, zwracamy zmutowaną tablicę. W przeciwnym razie zwracamy zwracaną wartość false any?.

histocrat
źródło
1
Jest to bardzo sprytne, szczególnie obracanie w miejscu. Dobra robota!
Alex A.
Niestety, moja własna odpowiedź Ruby została pokonana. +1
Wartość tuszu
3
Ach tak, stara technika „sortuj to, dopóki nie dowiesz się, czy można to posortować”.
corsiKa
14

Python 2, 51 bajtów

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

Nie przeszkadza w obracaniu. Zamiast tego sortuje listę, a następnie sprawdza, czy oryginał można posortować dryfując, sprawdzając, czy występuje co najmniej jeden spadek między kolejnymi elementami cyklicznej listy. Liczy się, <3ponieważ uzupełnia mapkrótszą listę Nonena końcu, dodając fałszywy spadek.

xnor
źródło
2
[1, 3, 2, 4]ma tylko jeden spadek między kolejnymi elementami, ale nie można go posortować.
Neil
1
@Neil Oh strzelać.
xnor 21.04.16
@ Neil Myślę, że to rozwiązuje problem. Czy mógłbyś spojrzeć?
xnor 21.04.16
10
Aw my <3też
pozew fundacji Moniki
Nie mogę powiedzieć, że jestem ekspertem w Pythonie, ale wydaje się to rozsądne, zakładając, że <3unikniesz konieczności precyzyjnego obracania listy.
Neil
10

Pyth, 9 bajtów

*SQ}SQ.:+

Wyjaśnienie:

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

Wypróbuj tutaj!

Lub użyj pakietu testowego!

niebieski
źródło
1
Myślę, że masz na myśli podciągi (podlisty) .:. Kombinacje obejmowałyby niesąsiadujące elementy.
xnor
6

Matlab, 61 47 41 bajtów

Dzięki @Suever za -6 bajtów!

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

Jeśli strfind([a,a],sort(a))spróbuje znaleźć posortowany wektor wejściowy jako „podłańcuch” nieposortowanego, zostanie on dołączony do siebie. Jeśli to prawda, dane wejściowe można przenosić i otrzymujemy wektor o długości 2, jeśli nie, otrzymujemy pusty wektor. minpo prostu przekształca to w wektor liczbowy / pusty. Dodanie posortowanego wektora do 0 po prostu wyświetla go, dodanie go do pustego wektora powoduje błąd.

wada
źródło
Czy sprawdzanie podciągów [2, 3]nie obsługuje podlisty [12, 34]?
xnor 21.04.16
Tak, każdą tablicę liczb całkowitych można również interpretować jako ciąg znaków, przy czym każda liczba jest traktowana jako jeden znak, bez względu na to, jak duża jest liczba.
flawr 21.04.16
@flawr Moja interpretacja jest taka, że strfindmoże pracować bezpośrednio z liczbami, nie tylko z znakami (nawet jeśli nie jest to udokumentowane). Gdyby liczby były interpretowane jako znaki, byłyby ograniczone do 65535(spróbuj na przykład +char(1e5))
Luis Mendo
@LuisMendo Masz rację, działa nawet z liczbami zmiennoprzecinkowymi. Zauważ, że liczby powyżej 65535 będą tylko wyświetlane jako spacja, jeśli będą traktowane jako część łańcucha.
flawr 22.04.16
5

Julia, 71 66 52 bajtów

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

Jest to anonimowa funkcja, która przyjmuje tablicę i zwraca tablicę lub wartość logiczną. Aby go wywołać, przypisz go do zmiennej.

Dla tablicy wejściowej x tworzymy zestaw wszystkich obrotów x i sprawdzamy, czy posortowana wersja x jest elementem tej listy. Jeśli tak, zwracamy x posortowane, w przeciwnym razie zwracamy fałsz.

Zaoszczędź 19 bajtów dzięki Dennis!

Alex A.
źródło
4

Pip , 15 + 1 = 17 16 bajtów

Ugh, inne języki gry w golfa wydmuchują to z wody. Jednak skoro już to napisałem ...

L#gI$<gPBPOgYgy

Pobiera dane wejściowe jako rozdzielone spacjami argumenty wiersza polecenia. Wymaga -plub innej flagi formatującej tablicę, aby wyświetlać wynik czytelnie, a nie konkatenowany. Fałszywy przypadek wyświetla pusty ciąg znaków, który jest widoczny dzięki końcowemu znakowi nowej linii.

                 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
źródło
4

JavaScript (ES6), 72 70 65 bajtów

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

Zwraca 0w przypadku awarii. Poprzednia 85 83 80-bajtowa wersja unikała wywoływania 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)

Edycja: Zapisano 2 bajty, inicjując cna -1zamiast 0. Zapisane 5 bajtów poprzez przełączenie od reducecelu map, ech ...

Neil
źródło
Zobacz edycję;)
Conor O'Brien
Wywołanie w celu sortowania numerów jest nieprawidłowe. Sprawdź próbkę [10, 2, 3, 4, 7].
Qwertiy 21.04.16
Ten kod failes również 3 testy: [1], [0, 0, 0, 0, 0, 0, 0]i [75, 230, 30, 42, 50].
Qwertiy 21.04.16
@Qwertiy Przepraszamy za sortniedopatrzenie, które spowodowało trzeci błąd testu. Pozostałe dwie porażki testowe były spowodowane przez mnie nadmiernym golfem; Wróciłem do poprzedniej wersji.
Neil
3

Snowman 1.0.2 , 27 bajtów

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

Jest to podprogram, który pobiera dane wejściowe i wyjściowe do bieżącego permawaru.

Wypróbuj online!

((                       ))  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
Klamka
źródło
3

MATL, 13 12 10 9 bajtów

SGthyXfa*

Ten sam pomysł, co odpowiedź @ flawr, w której przechwytujemy strfind( Xf), aby znaleźć posortowaną wersję danych wejściowych w ramach konkatenacji dwóch kopii danych wejściowych.

Wypróbuj online!

Wyjaśnienie

        % 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
źródło
1
Nie można usunąć g? Lub zastąp ngprzeza
Luis Mendo
@LuisMendo Nie można zastąpić tylko nponieważ nmoże być> 1. a zdecydowanie działa. Uznałem, że jest lepszy sposób. Dzięki!
Suever
3

Julia, 33 bajty

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

Wypróbuj online!

Jak to działa

To konkatenuje tablicę x z samym sobą i zlicza liczbę par, które są nieuporządkowane, tj. Liczbę sąsiadujących podrzędnych [a, b], dla których b - a <0 . Jeśli c jest liczbą nieuporządkowanych par samego x , a t wynosi 1, jeśli ostatni element x jest większy niż jego pierwszy, sumzwróci 2c + t .

Tablica x nadaje się do dryfowania iff (c, t) = (1, 0) ( x należy obrócić do mniejszej wartości jedynej nieuporządkowanej pary), (c, t) = (0, 1) ( x jest sortowane) lub (c, t) = (0, 0) ( x jest posortowane, a wszystkie jego elementy są równe), co jest prawdą, jeśli iff 2c + t <3 .

Dennis
źródło
3

JavaScript ES6, 48 45 43 znaków

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

Test:

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
źródło
Myślę, że możesz zapisać dwa bajty, używając, (x+[,x])a kolejny bajt, używając ~zamiast 1+w twoim stanie.
Neil
@ user6188402, tak, dziękuję.
Qwertiy,
2

Brachylog , 39 bajtów

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

Naprawdę muszę dodać opcjonalny argument, aby $( - circular permute leftpermutować więcej niż raz ... To byłoby 13 bajtów. Poczeka to po wdrożeniu nowego stabilnego transpilera w Prologu.

Wyjaśnienie

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
Fatalizować
źródło
2

Ruby, 47 bajtów

Funkcja rekurencyjna. Zwraca, niljeśli tablica wejściowa nie może być dzielona.

f=->a,i=0{a.sort==a ?a:a[i+=1]?f[a.rotate,i]:p}
Wartość tuszu
źródło
2

CJam, 17 lat 13 bajtów

Dzięki Dennis za oszczędność 4 bajtów.

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

Nienazwany blok (funkcja), który pobiera i zwraca listę.

Zestaw testowy.

Wyjaśnienie

Zasadniczo wykorzystuje to obserwację xnor, że posortowana lista pojawia się dwukrotnie na liście oryginalnej, jeśli można ją posortować:

_$   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
źródło
@Dennis, wygląda na to, że wymyśliliśmy to niezależnie. W każdym razie dzięki. :)
Martin Ender
2

C ++ 14, 242 znaków

#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;}}

Jeśli nie mogę pozostawić pustego wyjścia, 252 znaków 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<<'-';}

Wersja bez golfa 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: W oparciu o pomysł @ MichelfrancisBustillos .

Qwertiy
źródło
2

Java 7, 207 bajtów

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;}

Szczegółowe spróbuj tutaj

// 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
źródło
2

Java 175

wypisuje dane wyjściowe jako wartości oddzielone spacjami lub drukuje fdla wartości 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);}

przechodzi przez wszystkie kombinacje tablicy liczb całkowitych, aż znajdzie prawidłową sekwencję lub zabraknie kombinacji. tablica nie jest modyfikowana, ale zamiast tego posortowana sekwencja jest przechowywana jako ciąg rozdzielany spacjami.

nieco bardziej czytelny:

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);
}

spróbuj online

Jack Ammo
źródło
2

C, 105 bajtów

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]);}

Akceptuje to wejściowe liczby całkowite jako osobne argumenty wiersza poleceń i drukuje listę wyników jako jedną liczbę całkowitą w wierszu.

Jeśli listy nie można przenosić, program kończy pracę przedwcześnie z powodu wyjątku zmiennoprzecinkowego, więc jego puste dane wyjściowe reprezentują pustą listę.

Weryfikacja

$ 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
źródło
2

Ruby, 28 lat

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

Zwraca albo posortowaną tablicę, albo nil(co jest wartością falsy), jeśli danych wejściowych nie można posortować.

Ventero
źródło
2

Python, 53 bajty

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

Jeśli chcesz przetestować to, przejdź na https://www.repl.it/languages/python3 i skopiuj to:

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

Jak to działa:

  • sto zmienna przechowująca funkcję sortedpythona, która sortuje listy
  • N jest główną funkcją
  • s(x)Posortowana lista wejściowa: jest mnożona przez to, czy lista jest dostępna do driftustr(s(x))[1:-1]in str(x+x) do driftu (dzięki @xnor)
    • Działa to, ponieważ [1,2,3,4]*false powoduje powstanie pustej listy[]
    • i [1,2,3,4]*truewyniki w[1,2,3,4]
Samy Bencherif
źródło
1
W Pythonie 2 możesz to skrócić do lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)44 bajtów.
Dennis
1

Python, 83 bajty

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

Zawstydzają to inne odpowiedzi pytona, ale i tak mogę to opublikować. Naprawdę nie lubię

range(len(l)))

część. Czy istnieje szybszy sposób na iterację po liście?

DJMcMayhem
źródło
1
To niewiele, ale l.append(l.pop(0))or g==l for _ in loszczędza bajt w stosunku do podejścia opartego na zakresie zasięgu. Użycie a lambdazaoszczędziłoby 14 dodatkowych bajtów.
Dennis
1

MATLAB / Octave, 118 bajtów

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
źródło
2
Myślę, że możesz już zaoszczędzić kilka bajtów, pisząc wszystko w jednym wierszu i używając input(''). Unikaj także niepotrzebnych spacji i nawiasów! Możesz ponownie zrzucić trochę bajtów, najpierw definiując f=@issorted.
flawr 21.04.16
1

PowerShell v2 +, 87 80 bajtów

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

Przechodzi przez listę wprowadzania $a, sprawdzając każdy element parami (w tym ostatni i pierwszy), aby sprawdzić, czy istnieje więcej niż jedna para malejąca. Jeśli konkretna para maleje, zmniejszamy $c. Zwraca posortowaną listę lub pojedynczy element 0na podstawie wartości $cna końcu. Jeśli występuje więcej niż jedna „zła” para, to ++$cnadal będzie ona ujemna, w przeciwnym razie będzie co najmniej 0, więc wybierany jest drugi element pseudo-trójki ($a|sort ).

Widzę, że Xnor zrobił coś podobnego , ale wymyśliłem to niezależnie.

AdmBorkBork
źródło
1

Współczynnik, 47 bajtów

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

połącz sekwencję z sobą, a następnie sprawdź, czy posortowane tłumaczenie oryginału jest podsekwencją.

kot
źródło
1
To brzmi jak filozoficzne haiku: dup dup append \\ natural sort \\ dip subseq?pasuje nawet do wzoru 4-4-3 :)
Akiiino
@Akiiino: D-wolne języki są tak poetyckie.
kot
1

C ++, 313 359 370 bajtów

Ogromne pozdrowienia dla @Qwertiy za to, że działał i nauczył mnie kilku świetnych metod gry w golfa!

Gra w golfa:

#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";}

Nie golfowany:

#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
źródło
1
Gra w golfa to nie tylko usuwanie przestrzeni. using namespace std;jest 20 znaków, gdy std::6 razy to 30. bool s = False;- dlaczego nie =0? Możesz upuścić return 0;. Dlaczego nawiasy są tutaj !s&&(c<=v.size())? Nawiasy klamrowe bez przecinków ...
Qwertiy 21.04.16
Wow, dzięki! Wiele rzeczy (takich jak std::i return 0;) stało się nawykiem z zajęć z programowania. Naprawdę muszę lepiej sprawdzać moje programy.
Michelfrancis Bustillos 21.04.16
1
Jest też zestaw błędów. Dlaczego czytasz do zera i zapisujesz to zero w danych? Dlaczego generujesz w tym formacie? Dlaczego Truei Falsezamiast truei false. ideone.com/kVTI25 - twoja wersja, ideone.com/y8s44A - naprawiona i przygotowana do gry w golfa.
Qwertiy
Jeszcze raz dziękuję! Caping Truei Falsepochodzi z Python. Nawet nie wiedziałem, że możesz tak pisać if!
Michelfrancis Bustillos 21.04.16
1
I znacznie więcej skróconych: ideone.com/Dsbs8W i golfed ideone.com/HAzJ5V (<s> 255 </s> 252 znaków). Użyto C ++ 14 dla pętli foreach.
Qwertiy
1

Mathcad, TBD

wprowadź opis zdjęcia tutaj

W Mathcad 0 (skalar) == false.

(Równoważna) liczba bajtów to TBD, dopóki nie zostanie uzgodniona metoda liczenia. Około 52 bajtów przy użyciu równoważnika bajt = operator / symbol.

Stuart Bruff
źródło
1

Mathematica 55 50 61 58 bajtów

Z 3 bajtami zaoszczędzonymi dzięki Martinowi Büttnerowi.

Moje wcześniejsze próby nie przeszły wszystkich przypadków testowych. Musiałem dodać, Unionaby uniknąć powtórzeń na liście, które były wprowadzane w kolejności.

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

Testy

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}}


Wyjaśnienie

Obróć listę wejściową w prawo od 1 do nrazy, gdzie njest długość listy wejściowej. Jeśli posortowana lista wejściowa znajduje się wśród wyjściowych list obróconych, zwróć ją; w przeciwnym razie zwróć pustą listę.

DavidC
źródło
@ MartinBüttner, Twoja sugestia nie powiodła się w niektórych przypadkach testowych, w szczególności #s 3,4,7,8.
DavidC
@DavidC Ach, cholera, masz rację, pomieszałem zachowanie @@i /@na pustych listach. Join@@powinien być jeszcze krótszy niż Flatten@chociaż.
Martin Ender
1

PHP, 98 bajtów

Wyprowadza, 1jeśli można dryfować, w przeciwnym razie nic

$a=$argv[1];$b=$a;sort($a);foreach($a as $v){echo($a===$b?1:'');array_unshift($b, array_pop($b));}
MonkeyZeus
źródło