Driftsort un array


25

Driftsort è un modo semplice per "ordinare" un array. Funziona "facendo scorrere" o "ruotando" gli elementi nell'array fino a quando l'array non viene ordinato o fino a quando l'array non riesce a essere ordinato.

Camminiamo attraverso due esempi. Innanzitutto, considera l'array [10, 2, 3, 4, 7]. Poiché l'array non è ordinato, lo ruotiamo una volta. (Ciò può accadere in entrambe le direzioni, purché rimanga nella stessa direzione.) Quindi, l'array diventa:

[7, 10, 2, 3, 4]

Questo non è ordinato, quindi ruotiamo di nuovo.

[4, 7, 10, 2, 3]

E di nuovo:

[3, 4, 7, 10, 2]

E un'ultima volta:

[2, 3, 4, 7, 10]

Ed è ordinato! Quindi l'array [10, 2, 3, 4, 7]è maneggevole. Ecco tutte le rotazioni dell'array, per chiarezza:

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

Considera ora l'array [5, 3, 9, 2, 6, 7]. Guarda le sue rotazioni:

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

Nessuno di questi array è ordinato, quindi l'array [5, 3, 9, 2, 6, 7]non è trasferibile.


Obiettivo Dato un array / elenco non vuoto di numeri interi come input per un programma / funzione, implementare Driftsort sull'input e output, oppure emettere un valore di falso ( o un array / elenco vuoto) se non può essere deviato. I numeri interi sono associati alle tue lingue max / min, ma questo deve essere almeno 255 per il massimo e 0 per il minimo.

È possibile utilizzare metodi di ordinamento integrati, ma non un metodo integrato che risolva la sfida.

Questo è un , quindi il programma più breve in byte.

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

5
Un modo semplice per verificare se un elenco è trasferibile è se si sorted(l)tratta di un elenco secondario contiguo di l+l.
xnor

Solo per chiarire: se la nostra lingua supporta numeri interi negativi, possono verificarsi nell'input, sì?
Dennis,

@Dennis, è corretto.
Conor O'Brien,

Non dovrebbe essere chiamato shiftsort?
Filip Haglund,

@FilipHaglund Ho pensato di chiamarlo così, ma potrebbe creare confusione con l' shiftoperazione che rimuove il primo elemento di un array.
Conor O'Brien,

Risposte:


9

Gelatina , 6 byte

ṙỤċṢȧṢ

Provalo online! o verifica tutti i casi di test .

Come funziona

ṙỤċṢȧṢ  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.

1
Ahem, 19 byte di UTF8.
rsaxvc,

11
Jelly ha una code page personalizzata che codifica ciascuno dei 256 caratteri che comprende come singoli byte. (Sono 16 byte con UTF-8 tra.)
Dennis

3
@Dennis: dovresti copiarlo / incollarlo in tutte le tue osservazioni su Jelly per impedirci (cioè quelli che non lo sapevano prima) di fare gli stessi commenti? ;)
Olivier Dulac il

18

Ruby, 33

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

a.any?viene attivato fino a una volta per ogni elemento dell'array, tranne per il fatto che si arresta (e restituisce true) non appena l'array è stato trasformato in uno stato ordinato. Se ciò accade, restituiamo l'array mutato. Altrimenti restituiamo il valore falso che any?restituisce.


1
Questo è super intelligente, in particolare la rotazione sul posto. Bel lavoro!
Alex A.

Purtroppo, la mia risposta su Ruby è stata superata. +1
Valore inchiostro

3
Ah sì, la vecchia tecnica "ordina fino a quando non sai se è possibile ordinare".
corsiKa

14

Python 2, 51 byte

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

Non si preoccupa di ruotare. Invece, ordina l'elenco, quindi verifica se l'originale è ordinabile alla deriva controllando se esiste al massimo una riduzione tra gli elementi consecutivi dell'elenco ciclico. Il conteggio è <3perché mapriempie l'elenco più breve con Nonealla fine, aggiungendo una riduzione fasulla.


2
[1, 3, 2, 4]ha solo una diminuzione tra gli elementi consecutivi ma non è ordinabile per la deriva.
Neil,

1
@Neil Oh sparare.
xnor

@Neil Penso che questo risolva il problema. Potresti dare un'occhiata?
xnor

10
AW abbiamo <3anche voi
querela del Fondo Monica

Non posso dire di essere esperto di Python, ma sembra ragionevole supporre che <3sia necessario evitare di ruotare con precisione l'elenco.
Neil,

10

Pyth, 9 byte

*SQ}SQ.:+

Spiegazione:

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

Provalo qui!

O usa una suite di test!


1
Penso che intendi sottostringhe (liste) per .:. Le combinazioni includerebbero elementi non contigui.
xnor

6

Matlab, 61 47 41 byte

Grazie @Suever per -6 byte!

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

Se strfind([a,a],sort(a))tenta di trovare il vettore di input ordinato come 'sottostringa' del non ordinato, viene aggiunto a se stesso. Se vero, l'input è modificabile e otteniamo un vettore di lunghezza 2, altrimenti otteniamo un vettore vuoto. mintrasforma questo in un numero / vettore vuoto. L'aggiunta del vettore ordinato a 0 lo visualizza e lo aggiunge a un vettore vuoto genera un errore.


Il controllo di sottostringa gestisce [2, 3]non essere un elenco secondario di [12, 34]?
xnor

Sì, ogni array intero può anche essere interpretato come stringa, in cui ogni numero viene trattato come un carattere, indipendentemente dalla dimensione del numero.
Flawr,

@flawr La mia interpretazione è che strfindpuò funzionare direttamente con i numeri, non solo con i caratteri (anche se non è documentato). Se i numeri fossero interpretati come caratteri, verrebbero limitati a 65535(provare ad esempio +char(1e5))
Luis Mendo,

@LuisMendo Hai ragione, funziona anche con numeri in virgola mobile. Si noti che i numeri superiori a 65535 verranno visualizzati come uno spazio se considerati come parte di una stringa.
flawr

5

Julia, 71 66 52 byte

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

Questa è una funzione anonima che accetta un array e restituisce un array o un valore booleano. Per chiamarlo, assegnarlo a una variabile.

Per un array di input x , costruiamo l'insieme di tutte le rotazioni di x e controlliamo se la versione ordinata x è un elemento di tale elenco. In tal caso, restituiamo x ordinati, altrimenti restituiamo false.

Risparmiato 19 byte grazie a Dennis!


4

Pip , 15 + 1 = 17 16 byte

Uff, le altre lingue del golf lo stanno soffiando fuori dall'acqua. Tuttavia, poiché l'ho già scritto ...

L#gI$<gPBPOgYgy

Accetta input come argomenti della riga di comando separati da spazi. Richiede -po un altro flag di formattazione dell'array per visualizzare il risultato in modo leggibile anziché concatenato. Il caso falso genera una stringa vuota, che è visibile in virtù della nuova riga finale.

                 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

4

JavaScript (ES6), 72 70 65 byte

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

Restituisce 0in caso di fallimento. La precedente versione 85 83 80 byte evitava di chiamare 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)

Edit: Salvato 2 byte per l'inizializzazione cal -1posto di 0. Salvati 5 byte passando da reducea map, sospiro ...


Vedi la modifica;)
Conor O'Brien,

La chiamata per ordinare i numeri non è corretta. Controlla sul campione [10, 2, 3, 4, 7].
Qwertiy,

Questo codice failes anche 3 prove: [1], [0, 0, 0, 0, 0, 0, 0]e [75, 230, 30, 42, 50].
Qwertiy,

@Qwertiy Mi dispiace per la sortsvista, che ha causato il terzo fallimento del test. Gli altri due fallimenti del test sono stati causati da un eccesso di golf; Sono tornato alla versione precedente.
Neil,


3

Snowman 1.0.2 , 27 byte

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

Questa è una subroutine che porta input e output al permavar corrente.

Provalo 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

3

MATL, 13 12 10 9 byte

SGthyXfa*

La stessa idea della risposta di @ flawr in cui dirottiamostrfind (Xf ) per trovare la versione ordinata dell'input all'interno della concatenazione di due copie dell'input.

Provalo online!

Spiegazione

        % 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

1
Non puoi rimuovere g? Oppure sostituisci ngcona
Luis Mendo il

@LuisMendo Non posso sostituirlo con un solo nperché npotrebbe essere> 1. a sicuramente funziona. Ho pensato che ci fosse un modo migliore. Grazie!
Suever,

3

Julia, 33 byte

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

Provalo online!

Come funziona

Ciò concatena l'array x con se stesso e conta il numero di coppie fuori servizio, ovvero il numero di sottoarray contigui [a, b] per i quali b - a <0 . Se c è il numero di coppie non ordinate di x stesso e t è 1 se l'ultimo elemento di x è maggiore del suo primo, sumrestituirà 2c + t .

L'array x è trasferibile iff (c, t) = (1, 0) ( x deve essere ruotato sul valore più piccolo dell'unica coppia non ordinata), (c, t) = (0, 1) ( x è ordinato) oppure (c, t) = (0, 0) ( x è ordinato e tutti i suoi elementi sono uguali), che è vero sef 2c + t <3 .


3

Javascript ES6, 48 45 43 caratteri

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)

Penso che puoi salvare due byte usando (x+[,x])e un ulteriore byte usando ~invece che 1+nelle tue condizioni.
Neil,

@ user6188402, sì, grazie.
Qwertiy,

2

Brachylog , 39 byte

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

Ho davvero bisogno di aggiungere un argomento facoltativo a $( - circular permute left per permutare più di una volta ... questo sarebbe stato di 13 byte. Ciò attenderà dopo l'implementazione di un nuovo transpiler stabile in Prolog.

Spiegazione

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

2

Rubino, 47 byte

Funzione ricorsiva. Restituisce nilse l'array di input non può essere deviato.

f=->a,i=0{a.sort==a ?a:a[i+=1]?f[a.rotate,i]:p}

2

CJam, 17 13 byte

Grazie a Dennis per aver salvato 4 byte.

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

Un blocco senza nome (funzione) che accetta e restituisce un elenco.

Suite di test.

Spiegazione

Questo essenzialmente utilizza l'osservazione di xnor che l'elenco ordinato appare due volte nell'elenco originale se la sua deriva è ordinabile:

_$   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.

@Dennis oh, sembra che ce l'abbiamo fatta indipendentemente. Grazie comunque. :)
Martin Ender,

2

C ++ 14, 242 caratteri

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

Se non riesco a lasciare vuoto l'output, 252 caratteri 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<<'-';}

Versione non registrata 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: Sulla base di @ MichelfrancisBustillos idea .


2

Java 7, 207 byte

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

Prova dettagliata qui

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

2

Java 175

stampa l'output come valori separati da spazio o stampa fper un valore falso.

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

passa attraverso tutte le combinazioni dell'array di numeri interi fino a quando non trova la sequenza valida o esaurisce le combinazioni. l'array non viene modificato, ma invece la sequenza dinamica viene memorizzata come stringa delimitata da spazi.

un po 'più leggibile:

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

provalo online


2

C, 105 byte

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

Ciò accetta gli interi di input come argomenti della riga di comando separati e stampa l'elenco di output come un numero intero per riga.

Se l'elenco non è modificabile, il programma esce prematuramente a causa di un'eccezione in virgola mobile, quindi il suo output vuoto rappresenta un elenco vuoto.

Verifica

$ 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

2

Ruby, 28 anni

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

Restituisce l'array ordinato o nil(che è un valore errato) se l'input non è ordinabile per la deriva.


2

Python, 53 byte

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

Se vuoi testare questo capo su https://www.repl.it/languages/python3 e copia incolla questo:

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

Come funziona:

  • sè una variabile che memorizza la sortedfunzione python che ordina gli elenchi
  • N è la funzione principale
  • Elenco di input ordinato: s(x)viene moltiplicato per il fatto che l'elenco sia trasferibile o menostr(s(x))[1:-1]in str(x+x) (grazie a @xnor)
    • Questo funziona perché [1,2,3,4]*falserisulta in un elenco vuoto[]
    • e [1,2,3,4]*truerisulta in[1,2,3,4]

1
In Python 2, puoi accorciarlo a lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)44 byte.
Dennis,

1

Python, 83 byte

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

Questo è stato fatto vergognare dalle altre risposte di Python, ma potrei anche pubblicarlo comunque. Non mi piace molto il

range(len(l)))

parte. Esiste un modo più veloce per scorrere l'elenco?


1
Non è molto, ma l.append(l.pop(0))or g==l for _ in lsalva un byte sull'approccio range-len. L'uso di a lambdaconsente di risparmiare 14 byte aggiuntivi.
Dennis,

1

MATLAB / Octave, 118 byte

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

2
Penso che tu possa già salvare alcuni byte scrivendo tutto su una riga e usando input(''). Evita anche spazi e parentesi non necessari! E puoi ancora perdere alcuni byte definendo prima f=@issorted.
Flawr,

1

PowerShell v2 +, 87 80 byte

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

Passa attraverso l'elenco di input $a, controllando ogni elemento a coppie (incluso l'ultimo e il primo) per vedere se c'è più di una coppia decrescente. Se la coppia particolare sta diminuendo, diminuiamo $c. Emette un elenco ordinato o un singolo elemento0 , in base al valore di $calla fine. Se è presente più di una coppia "cattiva", allora ++$csarà comunque negativa, altrimenti lo sarà almeno 0, quindi viene scelto il secondo elemento dello pseudo-ternario ( $a|sort).

Vedo che xnor ha fatto qualcosa di simile , ma l'ho inventato in modo indipendente.


1

Fattore, 47 byte

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

unire la sequenza su se stessa, quindi verificare se la resa ordinata dell'originale è una sottosequenza.


1
Sembra un haiku filosofico: si dup dup append \\ natural sort \\ dip subseq?adatta anche al modello 4-4-3 :)
Akiiino

@Akiiino: le lingue senza punto D sono così poetiche.
cat

1

C ++, 313 359 370 byte

Enorme acquisizione a @Qwertiy per farlo funzionare e insegnarmi alcuni metodi di golf fantastici!

golfed:

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

Ungolfed:

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

1
Il golf non è solo la rimozione di spazi. using namespace std;è di 20 caratteri quando std::6 volte è 30. bool s = False;- perché no =0? Puoi lasciar perdere return 0;. Perché le parentesi sono qui !s&&(c<=v.size())? Figura di parentesi graffe e senza virgole ...
Qwertiy,

Wow grazie! Molte cose (come std::e return 0;) sono diventate abitudine dalle lezioni di programmazione. Ho davvero bisogno di iniziare a controllare meglio i miei programmi.
Michelfrancis Bustillos,

1
Inoltre c'è una serie di bug. Perché leggi fino a zero e lo metti nei dati? Perché output in formato inclusivo? Perché Truee Falseinvece di truee false. ideone.com/kVTI25 - la tua versione, ideone.com/y8s44A - risolto e preparato per la versione golf.
Qwertiy,

Grazie ancora! Caping Trueed Falseè di Python. Non sapevo nemmeno che potessi scrivere ifcosì!
Michelfrancis Bustillos,

1
E molto altro ancora abbreviato: ideone.com/Dsbs8W e golf ideone.com/HAzJ5V (<s> 255 </s> 252 caratteri). Usato C ++ 14 per loop foreach.
Qwertiy,

1

Mathcad, TBD

enter image description here

In Mathcad, 0 (scalare) == false.

Il conteggio dei byte (equivalente) è TBD fino al concordato metodo di conteggio. Circa 52 byte usando l'equivalenza tastiera byte = operatore / simbolo.


1

Mathematica 55 50 61 58 byte

Con 3 byte salvati grazie a Martin Büttner.

I miei precedenti tentativi non hanno superato tutti i casi di test. Ho dovuto aggiungere Unionper evitare le ripetizioni nell'elenco che sono state inserite in ordine.

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

test

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


Spiegazione

Ruota a destra l'elenco di input da 1 a nvolte, dove si ntrova la lunghezza dell'elenco di input. Se l'elenco di input ordinato è compreso tra gli elenchi ruotati di output, restituirlo; altrimenti restituisce un elenco vuoto.


@ MartinBüttner, il tuo suggerimento è fallito in alcuni dei casi di test, in particolare # 3,4,7,8.
DavidC,

@DavidC Ah, dannazione, hai ragione, ho confuso il comportamento di @@e /@su liste vuote. Join@@dovrebbe essere ancora più breve di quanto Flatten@però.
Martin Ender,

1

PHP, 98 byte

Emette un valore 1se non è trasportabile, altrimenti niente

$a=$argv[1];$b=$a;sort($a);foreach($a as $v){echo($a===$b?1:'');array_unshift($b, array_pop($b));}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.