Дрифтсорт массив


25

Driftsort - это простой способ «сортировки» массива. Он работает путем «скольжения» или «вращения» элементов в массиве до тех пор, пока массив не будет отсортирован или пока массив не будет отсортирован.

Давайте пройдемся по двум примерам. Сначала рассмотрим массив [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]

И это отсортировано! Таким образом, массив [10, 2, 3, 4, 7]является дрейфующим. Вот все вращения массива для ясности:

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

Рассмотрим теперь массив [5, 3, 9, 2, 6, 7]. Посмотрите на его вращения:

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

Ни один из этих массивов не отсортирован, поэтому массив [5, 3, 9, 2, 6, 7]не может быть перемещен.


Цель. Задать непустой массив / список целых чисел в качестве входных данных для программы / функции, реализовать на входе функцию дрейфовой сортировки и вывести ее или вывести значение Фолси ( или пустой массив / список), если оно не может быть дрейфовано. Целые числа привязаны к вашим языкам max / min, но это должно быть не менее 255 для максимума и 0 для минимума.

Вы можете использовать встроенные методы сортировки, но не встроенные, которые решают проблему.

Это , поэтому самая короткая программа в байтах.

Контрольные примеры

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
Самый простой способ проверить, является ли список дрейфующим, если sorted(l)это непрерывный подсписок из l+l.
xnor

Просто чтобы уточнить: если наш язык поддерживает отрицательные целые числа, они могут появляться во входных данных, да?
Деннис

@ Денис, это правильно.
Конор О'Брайен

Разве это не должно называться shiftsort?
Филип Хаглунд

@FilipHaglund Я думал о том, чтобы называть это так, но это может вызвать путаницу с shiftоперацией, которая удаляет первый элемент массива.
Конор О'Брайен

Ответы:


9

Желе , 6 байт

ṙỤċṢȧṢ

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

ṙỤċṢȧṢ  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
Гм, 19 байтов UTF8.
rsaxvc

11
Jelly имеет собственную кодовую страницу, которая кодирует каждый из 256 символов, которые он понимает как отдельные байты. (Это 16 байтов с UTF-8 между прочим.)
Деннис

3
@Dennis: вы должны скопировать / вставить это во все ваши представления Jelly, чтобы помешать нам (то есть тем, кто не знал этого раньше) делать одинаковые комментарии? ;)
Оливье Дюлак

18

Руби, 33

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

a.any?запускается до одного раза для каждого элемента в массиве, за исключением того, что он останавливается (и возвращает true), как только массив был преобразован в отсортированное состояние. Если это произойдет, мы возвращаем мутированный массив. В противном случае мы возвращаем ложное значение, которое any?возвращается.


1
Это очень умно, особенно вращение на месте. Хорошо сделано!
Алекс А.

Увы, мой собственный ответ Ruby превзошел все ожидания. +1
Value Ink

3
Ах да, старая методика "сортируй, пока не скажешь, можно ли ее отсортировать".
corsiKa

14

Python 2, 51 байт

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

Не мешает вращаться. Вместо этого сортирует список, а затем проверяет, может ли оригинал быть отсортирован по дрейфу, проверяя, есть ли не более одного уменьшения среди последовательных элементов циклического списка. Это объясняется <3тем, mapчто Noneв конце добавляется более короткий список , добавляя ложное уменьшение.


2
[1, 3, 2, 4]имеет только одно уменьшение среди последовательных элементов, но оно не сортируется по дрейфу.
Нил

1
@ Нил О, стреляй.
xnor

@ Нил, я думаю, это все исправит. Не могли бы вы взглянуть?
xnor

10
О, мы <3тоже тебя
Фонд Моника иск

Я не могу сказать, что я эксперт в Python, но это кажется разумным, если предположить, что <3нужно избегать точного поворота списка.
Нил


6

Матлаб, 61 47 41 байт

Спасибо @Suever за -6 байт!

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

Если strfind([a,a],sort(a))попытаться найти отсортированный входной вектор как «подстроку» несортированного, он был добавлен к себе. Если true, входные данные являются дрейфующими и мы получаем вектор длины 2, если нет, то мы получаем пустой вектор. minпросто преобразует это в число / пустой вектор. Добавление отсортированного вектора к 0 просто отображает его, добавление к пустому вектору приводит к ошибке.


Проверяет ли подстрока, что [2, 3]не является подсписком [12, 34]?
xnor

Да, каждый целочисленный массив также можно интерпретировать как строку, где каждое число рассматривается как один символ, независимо от того, насколько велико число.
flawr

@flawr Моя интерпретация заключается в том, что он strfindможет работать напрямую с числами, а не только с символами (даже если это не задокументировано). Если бы числа интерпретировались как символы, они были бы ограничены 65535(попробуйте, например +char(1e5))
Луис Мендо

@ LuisMendo Вы правы, это работает даже с числами с плавающей запятой. Обратите внимание, что числа выше 65535 будут отображаться в виде пробела, если рассматривать их как часть строки.
flawr

5

Юлия, 71 66 52 байта

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

Это анонимная функция, которая принимает массив и возвращает массив или логическое значение. Чтобы вызвать его, присвойте его переменной.

Для входного массива x мы строим множество всех поворотов x и проверяем, является ли отсортированная версия x элементом этого списка. Если это так, мы возвращаем x отсортировано, в противном случае мы возвращаем false.

Благодаря Деннису сэкономлено 19 байт!


4

Пип , 15 + 1 = 17 16 байт

Тьфу, другие языки гольфа выдувают это из воды. Однако, так как я уже написал это ...

L#gI$<gPBPOgYgy

Принимает ввод как разделенные пробелами аргументы командной строки. Требуется -pили другой флаг форматирования массива, чтобы отобразить результат разборчиво, а не сцеплено. Ложный регистр выводит пустую строку, которая видна благодаря завершающей новой строке.

                 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 байт

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

Возвращает 0при неудаче. Предыдущая 85 83 80-байтовая версия избегала вызова 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: Сохраненный 2 байта на инициализацию , cчтобы -1вместо0 . Сохранено 5 байтов путем переключения с reduceна map...


Смотрите правку;)
Конор О'Брайен

Вызывать сортировку по номерам неверно. Проверьте по образцу [10, 2, 3, 4, 7].
Qwertiy

Этот код также failes 3 тестов: [1], [0, 0, 0, 0, 0, 0, 0]и [75, 230, 30, 42, 50].
Qwertiy

@Qwertiy Извините за sortупущение, вызвавшее третий сбой теста. Два других неудачных теста были вызваны тем, что я переиграл; Я вернулся к предыдущей версии.
Нил


3

Snowman 1.0.2 , 27 байт

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

Это подпрограмма, которая принимает входные данные и выводит их в текущий permavar.

Попробуйте онлайн!

((                       ))  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 байт

SGthyXfa*

Та же идея, что и у ответа @ flawr, когда мы угоняем strfind( Xf), чтобы найти отсортированную версию входных данных в конкатенации двух копий входных данных.

Попробуйте онлайн!

объяснение

        % 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
Вы не можете удалить g? Или заменить ngнаa
Луис Мендо

@LuisMendo Не может заменить просто nпотому, что nможет быть> 1. a определенно работает, хотя. Я подумал, что есть лучший способ. Благодарность!
Suever

3

Юлия, 33 байта

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

Попробуйте онлайн!

Как это работает

Это объединяет массив x с самим собой и подсчитывает количество неупорядоченных пар, то есть количество смежных подмассивов [a, b], для которых b - a <0 . Если c - количество неупорядоченных пар самого x , а t равно 1, если последний элемент x больше его первого, sumвернет 2c + t .

Массив x дрейфует, если только (c, t) = (1, 0) ( x должен быть повернут до меньшего значения единственной неупорядоченной пары), (c, t) = (0, 1) ( x отсортирован) или (c, t) = (0, 0) ( x отсортирован и все его элементы равны), что верно, если 2c + t <3 .


3

Javascript ES6, 48 45 43 символов

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

Тест:

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)

Я думаю, что вы можете сохранить два байта с помощью (x+[,x])и еще один байт, используя ~вместо того, чтобы 1+в вашем состоянии.
Нил

@ user6188402, да, спасибо.
Qwertiy

2

Brachylog , 39 байт

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

Мне действительно нужно добавить необязательный аргумент $( - circular permute left перестановки более одного раза ... это было бы 13 байтов. Это будет ждать после внедрения стабильного нового транспилятора в Прологе.

объяснение

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

Рубин, 47 байтов

Рекурсивная функция. Возвращает, nilесли входной массив не может быть дрейфован.

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

2

CJam, 17 13 байтов

Спасибо Деннису за сохранение 4 байта.

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

Безымянный блок (функция), который принимает и возвращает список.

Тестирование.

объяснение

Это, по сути, использует наблюдение xnor о том, что отсортированный список появляется в два раза больше исходного списка, если его сортируемый дрейф:

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

@ Денис, похоже, мы придумали это самостоятельно. Спасибо хоть. :)
Мартин Эндер

2

C ++ 14, 242 символа

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

Если я не могу оставить вывод пустым, 252 символа 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<<'-';}

Неуправляемая версия 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: На основе @ MichelfrancisBustillos игровой идеи .


2

Java 7, 207 байт

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

Подробная попытка здесь

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

выводит выходные данные в виде значений, разделенных пробелами, или печатает fдля значения 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);}

проходит через все комбинации массива целых чисел, пока не найдет правильную последовательность или не исчерпает комбинации. массив не изменяется, но вместо этого отсортированная последовательность сохраняется в виде строки с разделителями-пробелами.

немного более читабельно:

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

попробуйте это онлайн


2

C 105 байт

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

Это принимает входные целые числа как отдельные аргументы командной строки и печатает список вывода как одно целое число на строку.

Если список не может быть смещен, программа преждевременно завершает работу из-за исключения с плавающей запятой, поэтому ее пустой вывод представляет пустой список.

верификация

$ 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

Руби, 28

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

Возвращает либо отсортированный массив, либо nil(что является ложным значением), если входные данные не сортируются с помощью дрейфа.


2

Python, 53 байта

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

Если вы хотите проверить это на https://www.repl.it/languages/python3 и скопировать, вставьте это:

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

Как это работает:

  • sпеременная, хранящая sortedфункцию python, которая сортирует списки
  • N это основная функция
  • Список входных данных отсортирован: s(x)умножается на то, может ли список быть перемещаемымstr(s(x))[1:-1]in str(x+x) (спасибо @xnor)
    • Это работает, потому что [1,2,3,4]*falseприводит к пустому списку[]
    • и [1,2,3,4]*trueприводит к[1,2,3,4]

1
В Python 2 вы можете сократить это до lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)44 байтов.
Деннис

1

Python, 83 байта

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

Это было опозорено другими ответами на Python, но я мог бы в любом случае опубликовать это. Мне очень не нравится

range(len(l)))

часть. Есть ли более быстрый способ перебора списка?


1
Это не так много, но l.append(l.pop(0))or g==l for _ in lэкономит байт по сравнению с диапазоном. Использование lambdaпозволит сэкономить 14 дополнительных байтов.
Деннис

1

MATLAB / Octave, 118 байт

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
Я думаю, что вы уже можете сохранить несколько байтов, написав все в одной строке и используя input(''). Также избегайте лишних пробелов и скобок! И вы можете снова сбросить несколько байтов, предварительно определив f=@issorted.
flawr

1

PowerShell v2 +, 87 80 байт

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

Выполняет пошаговый просмотр списка ввода $a, проверяя каждый попарный элемент (включая последний и первый), чтобы определить, существует ли более одной убывающей пары. Если конкретная пара уменьшается, мы уменьшаем $c. Выводит отсортированный список или отдельный элемент 0на основе значения $cв конце. Если присутствует более одной «плохой» пары, то++$c она все равно будет отрицательной, иначе она будет как минимум 0, поэтому выбирается второй элемент псевдо-троицы ($a|sort ).

Я вижу, что xnor сделал нечто подобное , но я придумал это самостоятельно.


1

Фактор, 47 байтов

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

присоедините последовательность к себе, затем проверьте, является ли отсортированное представление оригинала подпоследовательностью.


1
Это звучит как философское хайку: « dup dup append \\ natural sort \\ dip subseq?Даже соответствует шаблону 4-4-3» :)
Akiiino

@Akiiino: D языки без точек настолько поэтичны.
кот

1

С ++, 313 359 370 байт

Огромный привет @Qwertiy за то, что он работает и научил меня некоторым отличным методам игры в гольф!

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
Гольф это не просто удаление пробелов. using namespace std;20 символов, когда std::6 раз - 30. bool s = False;- Почему бы и нет =0? Вы можете бросить return 0;. Почему здесь скобки !s&&(c<=v.size())? Фигурные скобки и без запятых ...
Qwertiy

Вау, спасибо! Много вещей (как std::и return 0;) стало привычкой из классов программирования. Мне действительно нужно начать проверять свои программы лучше.
Мишельфрансис Бустильос

1
Также есть множество багов. Почему вы читаете до нуля и помещаете этот ноль в данные? Почему вы выводите в размер включительно? Почему Trueи Falseвместо trueи false. ideone.com/kVTI25 - ваша версия, ideone.com/y8s44A - исправлена ​​и подготовлена ​​для игры в гольф.
Qwertiy

Еще раз спасибо! Caping Trueи Falseот Python. Я даже не знал, что ты можешь писать ifтак!
Мишельфрансис Бустильос

1
И намного больше сокращено: ideone.com/Dsbs8W и golfed ideone.com/HAzJ5V (<s> 255 </ s> 252 символа). Использовал C ++ 14 для цикла foreach.
Qwertiy

1

Mathcad, TBD

введите описание изображения здесь

В Mathcad 0 (скалярный) == ложь.

(Эквивалентное) количество байтов равно TBD до согласованного метода подсчета. Приблизительно 52 байта, используя эквивалентность клавиатуры byte = оператор / символ.


1

Mathematica 55 50 61 58 байт

С сохранением 3 байтов благодаря Мартину Бюттнеру.

Мои предыдущие попытки не прошли весь тестовый случай. Мне нужно было добавить, Unionчтобы избежать повторений в списке, которые были введены в порядке.

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

тесты

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


объяснение

Поверните вправо список ввода от 1 до nраза, где nдлина списка ввода. Если отсортированный входной список находится среди выходных повернутых списков, вернуть его; в противном случае верните пустой список.


@ MartinBüttner, Ваше предложение провалилось в некоторых тестовых случаях, в частности, # 3,4,7,8.
DavidC

@DavidC Ах, блин, ты прав, я перепутал поведение @@и /@пустые списки. Join@@все равно должен быть короче, чем Flatten@если бы.
Мартин Эндер

1

PHP, 98 байт

Выводит, 1если дрифтсортабельно, иначе ничего

$a=$argv[1];$b=$a;sort($a);foreach($a as $v){echo($a===$b?1:'');array_unshift($b, array_pop($b));}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.