Driftsort sebuah array

25

Driftsort adalah cara sederhana untuk "mengurutkan" sebuah array. Ia bekerja dengan "geser" atau "memutar" elemen-elemen dalam array sampai array diurutkan, atau sampai array gagal diurutkan.

Mari kita telusuri dua contoh. Pertama, pertimbangkan array [10, 2, 3, 4, 7]. Karena array tidak diurutkan, kami memutarnya sekali. (Ini bisa terjadi di kedua arah, asalkan tetap arah yang sama.) Kemudian, array menjadi:

[7, 10, 2, 3, 4]

Ini tidak diurutkan, jadi kami memutar lagi.

[4, 7, 10, 2, 3]

Dan lagi:

[3, 4, 7, 10, 2]

Dan terakhir kali:

[2, 3, 4, 7, 10]

Dan itu disortir! Jadi array [10, 2, 3, 4, 7]dapat di-driftsortable. Berikut ini semua rotasi array, untuk kejelasan:

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

Pertimbangkan sekarang array [5, 3, 9, 2, 6, 7]. Lihatlah rotasinya:

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

Tidak satu pun dari array ini yang diurutkan, sehingga array [5, 3, 9, 2, 6, 7]tidak dapat dipindahkan.


Objective Diberikan array kosong / daftar bilangan bulat sebagai input untuk suatu program / fungsi, mengimplementasikan driftsort pada input dan output itu, atau output nilai falsey ( atau array / daftar kosong) jika tidak dapat driftsort. Bilangan bulat terikat ke bahasa Anda maks / mnt, tetapi ini harus minimal 255 untuk maks, dan 0 untuk mnt.

Anda dapat menggunakan metode pemilahan bawaan, tetapi bukan bawaan yang memecahkan tantangan.

Ini adalah , jadi program terpendek dalam byte.

Uji kasus

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
sumber
5
Cara mudah untuk memeriksa apakah daftar dapat diakses adalah apakah sorted(l)adalah sublist yang berdekatan dari l+l.
xnor
Hanya untuk memperjelas: Jika bahasa kita mendukung bilangan bulat negatif, mereka dapat muncul di input, ya?
Dennis
@ Dennis itu benar.
Conor O'Brien
Bukankah ini seharusnya disebut shiftsort?
Filip Haglund
@FilipHaglund Saya berpikir untuk memanggil itu, tetapi mungkin menyebabkan kebingungan dengan shiftoperasi yang menghapus elemen pertama dari sebuah array.
Conor O'Brien

Jawaban:

9

Jelly , 6 byte

ṙỤċṢȧṢ

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ṙỤċṢȧṢ  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
sumber
1
Ahem, 19 byte dari UTF8.
rsaxvc
11
Jelly memiliki halaman kode khusus yang mengkodekan masing-masing dari 256 karakter yang dimengerti sebagai satu byte. (Ini 16 byte dengan UTF-8 btw.)
Dennis
3
@ Dennis: Anda harus menyalin / menempel ini di semua pengiriman Jelly Anda untuk mencegah kami (yaitu, orang yang tidak tahu ini sebelumnya) membuat komentar yang sama? ;)
Olivier Dulac
18

Ruby, 33

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

a.any?dijalankan hingga satu kali untuk setiap elemen dalam array, kecuali itu berhenti (dan mengembalikan true) segera setelah array telah dimutasi menjadi keadaan diurutkan. Jika ini terjadi, kami mengembalikan array yang dimutasi. Kalau tidak, kami mengembalikan nilai palsu yang any?mengembalikan.

histokrat
sumber
1
Ini sangat pintar, terutama rotasi di tempat. Kerja bagus!
Alex A.
Sayangnya, jawaban Ruby saya sendiri telah dikalahkan. +1
Nilai Tinta
3
Ah ya, teknik lama "sortir sampai Anda tahu apakah itu bisa disortir".
corsiKa
14

Python 2, 51 byte

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

Tidak repot berputar. Alih-alih, susun daftar, lalu lihat apakah dokumen aslinya dapat diurutkan berdasarkan drift dengan memeriksa apakah ada paling banyak satu penurunan di antara elemen berurutan dari daftar yang dikurifikasi. Hitungannya adalah <3karena mapmengisi daftar yang lebih pendek dengan Nonedi akhir, menambahkan penurunan palsu.

Tidak
sumber
2
[1, 3, 2, 4]hanya memiliki satu penurunan di antara elemen berurutan tetapi tidak dapat diurutkan berdasarkan drift.
Neil
1
@Neil Oh tembak.
xnor
@Neil Saya pikir ini memperbaikinya. Bisakah Anda melihatnya?
xnor
10
Ah, kami <3juga
Gugatan Monica
Saya tidak bisa mengatakan saya ahli di Python tetapi itu tampaknya masuk akal dengan asumsi <3untuk menghindari harus memutar daftar dengan tepat.
Neil
10

Pyth, 9 byte

*SQ}SQ.:+

Penjelasan:

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

Coba di sini!

Atau gunakan test suite!

Biru
sumber
1
Saya pikir maksud Anda substring (sublists) untuk .:. Kombinasi akan mencakup elemen yang tidak bersebelahan.
xnor
6

Matlab, 61 47 41 byte

Terima kasih @Suever untuk -6 byte!

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

Jika strfind([a,a],sort(a))mencoba untuk menemukan vektor input yang diurutkan sebagai 'substring' dari yang tidak disortir, itu ditambahkan ke dirinya sendiri. Jika benar, input adalah driftsortable dan kita mendapatkan vektor dengan panjang 2, jika tidak kita mendapatkan vektor kosong. minhanya mentransformasikannya ke angka / vektor kosong. Menambahkan vektor yang disortir ke 0 hanya menampilkannya, menambahkannya ke vektor kosong melempar kesalahan.

cacat
sumber
Apakah pegangan pemeriksaan substring [2, 3]tidak menjadi sublist [12, 34]?
xnor
Ya, setiap array integer juga dapat diartikan sebagai string, di mana setiap angka diperlakukan sebagai satu karakter, tidak peduli seberapa besar jumlahnya.
flawr
@ flawr Penafsiran saya adalah bahwa strfinddapat bekerja secara langsung dengan angka, tidak hanya dengan karakter (meskipun itu tidak didokumentasikan). Jika angka-angka itu ditafsirkan sebagai karakter mereka akan terbatas pada 65535(coba misalnya +char(1e5))
Luis Mendo
@LuisMendo Anda benar, bahkan berfungsi dengan angka floating point. Perhatikan bahwa angka di atas 65535 hanya akan ditampilkan sebagai spasi ketika dianggap sebagai bagian dari string.
flawr
5

Julia, 71 66 52 byte

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

Ini adalah fungsi anonim yang menerima array dan mengembalikan array atau boolean. Untuk menyebutnya, tetapkan ke variabel.

Untuk larik input x , kami membangun set semua rotasi x dan memeriksa apakah versi x yang diurutkan adalah elemen dari daftar itu. Jika ya, kita kembalikan x diurutkan, kalau tidak kita kembalikan salah.

Disimpan 19 byte berkat Dennis!

Alex A.
sumber
4

Pip , 15 + 1 = 17 16 byte

Ugh, bahasa golf lainnya meniup ini keluar dari air. Namun, karena saya sudah menulisnya ...

L#gI$<gPBPOgYgy

Mengambil input sebagai argumen baris perintah yang dipisahkan oleh spasi. Membutuhkan -patau flag pemformatan array lain untuk menampilkan hasil secara jelas dan bukan gabungan. Kasing palsu menghasilkan string kosong, yang terlihat berdasarkan baris baru yang tertinggal.

                 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
sumber
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)

Pengembalian 0gagal. Sebelumnya 85 83 versi 80-byte dihindari panggilan 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)

Sunting: Disimpan 2 byte dengan menginisialisasi cke -1alih-alih 0. Disimpan 5 byte dengan beralih dari reduceke map, ...

Neil
sumber
Lihat hasil edit;)
Conor O'Brien
Panggilan untuk menyortir nomor salah. Periksa sampel [10, 2, 3, 4, 7].
Qwertiy
Kode ini juga failes 3 tes: [1], [0, 0, 0, 0, 0, 0, 0]dan [75, 230, 30, 42, 50].
Qwertiy
@ Kualifikasi Maaf tentang sortpengawasan, yang menyebabkan kegagalan pengujian ketiga. Dua kegagalan tes lainnya disebabkan oleh saya terlalu bermain golf; Saya telah kembali ke versi sebelumnya.
Neil
3

Snowman 1.0.2 , 27 byte

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

Ini adalah subrutin yang mengambil input dari dan output ke permavar saat ini.

Cobalah 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
Gagang pintu
sumber
3

MATL, 13 12 10 9 byte

SGthyXfa*

Gagasan yang sama dengan jawaban @ flawr mana kami membajak strfind( Xf) untuk menemukan versi input yang diurutkan dalam gabungan dua salinan input.

Cobalah secara Online!

Penjelasan

        % 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
sumber
1
Tidak bisakah kamu menghapus g? Atau ganti ngdengana
Luis Mendo
@LuisMendo Tidak bisa mengganti dengan hanya nkarena nbisa> 1. a pasti berfungsi. Saya pikir ada cara yang lebih baik. Terima kasih!
Suever
3

Julia, 33 byte

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

Cobalah online!

Bagaimana itu bekerja

Ini menggabungkan larik x dengan dirinya sendiri dan menghitung jumlah pasangan yang tidak berurutan, yaitu jumlah sub-susun yang berdekatan [a, b] dengan b - a <0 . Jika c adalah jumlah pasangan unordered dari x itu sendiri dan t adalah 1 jika elemen terakhir x lebih besar dari yang pertama, sumakan mengembalikan 2c + t .

Array x adalah driftsortable iff (c, t) = (1, 0) ( x harus diputar ke nilai yang lebih kecil dari satu-satunya pasangan yang tidak terurut), (c, t) = (0, 1) ( x diurutkan) atau (c, t) = (0, 0) ( x diurutkan dan semua elemennya sama), yang benar iff 2c + t <3 .

Dennis
sumber
3

Javascript ES6, 48 45 43 karakter

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

Uji:

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
sumber
Saya pikir Anda dapat menyimpan dua byte dengan menggunakan (x+[,x])dan byte lebih lanjut dengan menggunakan ~daripada 1+dalam kondisi Anda.
Neil
@ user6188402, ya, terima kasih.
Qwertiy
2

Brachylog , 39 byte

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

Saya benar-benar perlu menambahkan argumen opsional ke $( - circular permute left untuk permutasi lebih dari sekali ... ini akan menjadi 13 byte. Ini akan menunggu setelah menerapkan transpiler baru yang stabil di Prolog.

Penjelasan

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
Fatalisasi
sumber
2

Ruby, 47 byte

Fungsi rekursif. Kembali niljika array input tidak dapat diseret.

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

CJam, 17 13 byte

Terima kasih kepada Dennis karena telah menghemat 4 byte.

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

Blok (fungsi) tanpa nama yang mengambil dan mengembalikan daftar.

Suite uji.

Penjelasan

Ini pada dasarnya menggunakan observasi xnor bahwa daftar yang diurutkan muncul dua kali dari daftar aslinya jika driftnya dapat diurutkan:

_$   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
sumber
@ Dennis oh, sepertinya kita datang dengan itu secara mandiri. Terimakasih Meskipun. :)
Martin Ender
2

C ++ 14, 242 karakter

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

Jika saya tidak dapat membiarkan output kosong, 252 karakter 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<<'-';}

Versi tidak resmi 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: Berdasarkan ide @ MichelfrancisBustillos .

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

Detail coba di sini

// 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
sumber
2

Jawa 175

mencetak output sebagai nilai yang dipisahkan ruang, atau mencetak funtuk nilai 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);}

melewati semua kombinasi array bilangan bulat sampai menemukan urutan yang valid atau kehabisan kombinasi. array tidak dimodifikasi, melainkan urutan driftsorted disimpan sebagai string dibatasi ruang.

sedikit lebih mudah dibaca:

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

coba online

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

Ini menerima integer input sebagai argumen baris perintah yang terpisah dan mencetak daftar output sebagai satu integer per baris.

Jika daftar tidak dapat dipindahkan, program keluar sebelum waktunya karena pengecualian floating point, sehingga output kosongnya mewakili daftar kosong.

Verifikasi

$ 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
sumber
2

Ruby, 28

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

Mengembalikan array yang diurutkan, atau nil(yang merupakan nilai falsy) jika input tidak drift-sortable.

Ventero
sumber
2

Python, 53 byte

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

Jika Anda ingin menguji kepala ini ke https://www.repl.it/languages/python3 dan salin tempel ini:

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

Bagaimana itu bekerja:

  • sadalah variabel yang menyimpan sortedfungsi python yang mengurutkan daftar
  • N adalah fungsi utama
  • Daftar input diurutkan: s(x)dikalikan dengan apakah daftar tersebut driftsortable atau tidak str(s(x))[1:-1]in str(x+x)(terima kasih kepada @xnor)
    • Ini berfungsi karena [1,2,3,4]*falsemenghasilkan daftar kosong[]
    • dan [1,2,3,4]*truemenghasilkan[1,2,3,4]
Samy Bencherif
sumber
1
Dalam Python 2, Anda dapat mempersingkat ini menjadi 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

Hal ini dipermalukan oleh jawaban python lainnya, tapi saya mungkin juga mempostingnya. Saya sangat tidak suka

range(len(l)))

bagian. Apakah ada cara yang lebih cepat untuk beralih melalui daftar?

DJMcMayhem
sumber
1
Tidak banyak, tetapi l.append(l.pop(0))or g==l for _ in lmenyimpan byte lebih dari pendekatan range-len. Menggunakan a lambdaakan menghemat 14 byte tambahan.
Dennis
1

MATLAB / Oktaf, 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
costrom
sumber
2
Saya pikir Anda sudah dapat menyimpan beberapa byte dengan menulis semuanya pada satu baris dan menggunakan input(''). Juga hindari spasi dan tanda kurung yang tidak perlu! Dan Anda dapat kembali menumpahkan beberapa byte dengan terlebih dahulu mendefinisikan 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]

Langkah-langkah melalui daftar input $a, memeriksa setiap elemen berpasangan (termasuk yang terakhir dan yang pertama) untuk melihat apakah ada lebih dari satu pasangan yang menurun. Jika pasangan tertentu menurun, kami menurun $c. Keluaran baik daftar diurutkan, atau elemen tunggal 0, berdasarkan pada nilai $cdi akhir. Jika lebih dari satu pasangan "buruk" hadir, maka ++$cakan tetap negatif, jika tidak setidaknya akan ada 0, maka elemen kedua dari pseudo-ternary dipilih ( $a|sort).

Saya melihat xnor melakukan sesuatu yang serupa , tetapi saya datang dengan ini secara mandiri.

AdmBorkBork
sumber
1

Faktor, 47 byte

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

gabungkan urutan ke dirinya sendiri, lalu periksa apakah rendisi yang diurutkan dari yang asli adalah urutan.

kucing
sumber
1
Ini kedengarannya seperti haiku filosofis: dup dup append \\ natural sort \\ dip subseq?Bahkan cocok dengan pola 4-4-3 :)
Akiiino
@Akiiino: Bahasa bebas titik D sangat puitis.
kucing
1

C ++, 313 359 370 byte

Teriakan besar ke @Qwertiy karena berhasil dan mengajari saya beberapa metode bermain golf yang hebat!

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

Tidak Disatukan:

#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
sumber
1
Golf tidak hanya menghilangkan ruang. using namespace std;adalah 20 karakter saat std::6 kali 30. bool s = False;- mengapa tidak =0? Anda bisa jatuh return 0;. Mengapa tanda kurung ada di sini !s&&(c<=v.size())? Figur kawat gigi dan tidak ada koma ...
Qwertiy
Wow terima kasih! Banyak hal (seperti std::dan return 0;) telah menjadi kebiasaan dari kelas pemrograman. Saya benar-benar harus mulai memeriksa program saya dengan lebih baik.
Michelfrancis Bustillos
1
Juga ada satu set bug. Mengapa Anda membaca sampai nol dan memasukkan nol itu ke dalam data? Mengapa Anda menampilkan ukuran inklusif? Mengapa Truedan Falsebukannya truedan false. ideone.com/kVTI25 - versi Anda, ideone.com/y8s44A - diperbaiki dan disiapkan untuk versi golf.
Qwertiy
Terima kasih lagi! Caping Truedan Falsedari Python. Aku bahkan tidak tahu kamu bisa menulis ifseperti itu!
Michelfrancis Bustillos
1
Dan jauh lebih singkat: ideone.com/Dsbs8W dan golf ideone.com/HAzJ5V (<s> 255 </s> 252 karakter). Digunakan C ++ 14 untuk foreach loop.
Qwertiy
1

Mathcad, TBD

masukkan deskripsi gambar di sini

Dalam Mathcad, 0 (skalar) == false.

Penghitungan byte (Setara) adalah TBD sampai metode penghitungan disetujui. Kira-kira 52 byte menggunakan byte = operator / simbol keyboard equivalence.

Stuart Bruff
sumber
1

Mathematica 55 50 61 58 byte

Dengan 3 byte disimpan, terima kasih kepada Martin Büttner.

Upaya saya sebelumnya tidak lulus semua test case. Saya perlu menambahkan Unionuntuk menghindari pengulangan dalam daftar yang dimasukkan secara berurutan.

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

Tes

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


Penjelasan

Putar kanan daftar input dari 1 hingga nkali, di mana npanjang daftar input. Jika daftar input yang diurutkan adalah di antara daftar yang diputar, kembalikan; jika tidak, kembalikan daftar kosong.

DavidC
sumber
@ MartinBüttner, Saran Anda gagal dalam beberapa kasus uji, khususnya, #s 3,4,7,8.
DavidC
@ David C, sial, kau benar, aku mencampuradukkan perilaku @@dan /@daftar kosong. Join@@seharusnya masih lebih pendek dari itu Flatten@.
Martin Ender
1

PHP, 98 byte

Outputs 1jika driftsortable, kalau tidak apa-apa

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