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]
sorted(l)
это непрерывный подсписок изl+l
.shiftsort
?shift
операцией, которая удаляет первый элемент массива.Ответы:
Желе , 6 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Руби, 33
a.any?
запускается до одного раза для каждого элемента в массиве, за исключением того, что он останавливается (и возвращает true), как только массив был преобразован в отсортированное состояние. Если это произойдет, мы возвращаем мутированный массив. В противном случае мы возвращаем ложное значение, котороеany?
возвращается.источник
Python 2, 51 байт
Не мешает вращаться. Вместо этого сортирует список, а затем проверяет, может ли оригинал быть отсортирован по дрейфу, проверяя, есть ли не более одного уменьшения среди последовательных элементов циклического списка. Это объясняется
<3
тем,map
чтоNone
в конце добавляется более короткий список , добавляя ложное уменьшение.источник
[1, 3, 2, 4]
имеет только одно уменьшение среди последовательных элементов, но оно не сортируется по дрейфу.<3
тоже тебя<3
нужно избегать точного поворота списка.Pyth, 9 байт
Объяснение:
Попробуй это здесь!
Или используйте набор тестов!
источник
.:
. Комбинации будут включать несмежные элементы.Матлаб,
614741 байтСпасибо @Suever за -6 байт!
Если
strfind([a,a],sort(a))
попытаться найти отсортированный входной вектор как «подстроку» несортированного, он был добавлен к себе. Если true, входные данные являются дрейфующими и мы получаем вектор длины 2, если нет, то мы получаем пустой вектор.min
просто преобразует это в число / пустой вектор. Добавление отсортированного вектора к 0 просто отображает его, добавление к пустому вектору приводит к ошибке.источник
[2, 3]
не является подсписком[12, 34]
?strfind
может работать напрямую с числами, а не только с символами (даже если это не задокументировано). Если бы числа интерпретировались как символы, они были бы ограничены65535
(попробуйте, например+char(1e5)
)Юлия,
716652 байтаЭто анонимная функция, которая принимает массив и возвращает массив или логическое значение. Чтобы вызвать его, присвойте его переменной.
Для входного массива x мы строим множество всех поворотов x и проверяем, является ли отсортированная версия x элементом этого списка. Если это так, мы возвращаем x отсортировано, в противном случае мы возвращаем false.
Благодаря Деннису сэкономлено 19 байт!
источник
Пип , 15 + 1 =
1716 байтТьфу, другие языки гольфа выдувают это из воды. Однако, так как я уже написал это ...
Принимает ввод как разделенные пробелами аргументы командной строки. Требуется
-p
или другой флаг форматирования массива, чтобы отобразить результат разборчиво, а не сцеплено. Ложный регистр выводит пустую строку, которая видна благодаря завершающей новой строке.источник
JavaScript (ES6),
727065 байтВозвращает
0
при неудаче. Предыдущая858380-байтовая версия избегала вызоваsort
:Edit: Сохраненный 2 байта на инициализацию ,
c
чтобы-1
вместо0
. Сохранено 5 байтов путем переключения сreduce
наmap
...источник
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
и[75, 230, 30, 42, 50]
.sort
упущение, вызвавшее третий сбой теста. Два других неудачных теста были вызваны тем, что я переиграл; Я вернулся к предыдущей версии.05AB1E , 12 байтов
Код:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Snowman 1.0.2 , 27 байт
Это подпрограмма, которая принимает входные данные и выводит их в текущий permavar.
Попробуйте онлайн!
источник
MATL,
1312109 байтТа же идея, что и у ответа @ flawr, когда мы угоняем
strfind
(Xf
), чтобы найти отсортированную версию входных данных в конкатенации двух копий входных данных.Попробуйте онлайн!
объяснение
источник
g
? Или заменитьng
наa
n
потому, чтоn
может быть> 1.a
определенно работает, хотя. Я подумал, что есть лучший способ. Благодарность!Юлия, 33 байта
Попробуйте онлайн!
Как это работает
Это объединяет массив 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 .
источник
Javascript ES6,
484543 символовТест:
источник
(x+[,x])
и еще один байт, используя~
вместо того, чтобы1+
в вашем состоянии.Brachylog , 39 байт
Мне действительно нужно добавить необязательный аргумент
$( - circular permute left
перестановки более одного раза ... это было бы 13 байтов. Это будет ждать после внедрения стабильного нового транспилятора в Прологе.объяснение
источник
Рубин, 47 байтов
Рекурсивная функция. Возвращает,
nil
если входной массив не может быть дрейфован.источник
CJam,
1713 байтовСпасибо Деннису за сохранение 4 байта.
Безымянный блок (функция), который принимает и возвращает список.
Тестирование.
объяснение
Это, по сути, использует наблюдение xnor о том, что отсортированный список появляется в два раза больше исходного списка, если его сортируемый дрейф:
источник
C ++ 14, 242 символа
Если я не могу оставить вывод пустым, 252 символа http://ideone.com/HAzJ5V
Неуправляемая версия http://ideone.com/Dsbs8W
PS: На основе @ MichelfrancisBustillos игровой идеи .
источник
Java 7, 207 байт
Подробная попытка здесь
источник
Java 175
выводит выходные данные в виде значений, разделенных пробелами, или печатает
f
для значения Falsey.проходит через все комбинации массива целых чисел, пока не найдет правильную последовательность или не исчерпает комбинации. массив не изменяется, но вместо этого отсортированная последовательность сохраняется в виде строки с разделителями-пробелами.
немного более читабельно:
попробуйте это онлайн
источник
C 105 байт
Это принимает входные целые числа как отдельные аргументы командной строки и печатает список вывода как одно целое число на строку.
Если список не может быть смещен, программа преждевременно завершает работу из-за исключения с плавающей запятой, поэтому ее пустой вывод представляет пустой список.
верификация
источник
Руби, 28
Возвращает либо отсортированный массив, либо
nil
(что является ложным значением), если входные данные не сортируются с помощью дрейфа.источник
Python, 53 байта
Если вы хотите проверить это на https://www.repl.it/languages/python3 и скопировать, вставьте это:
Как это работает:
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]
источник
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
44 байтов.Python, 83 байта
Это было опозорено другими ответами на Python, но я мог бы в любом случае опубликовать это. Мне очень не нравится
часть. Есть ли более быстрый способ перебора списка?
источник
l.append(l.pop(0))or g==l for _ in l
экономит байт по сравнению с диапазоном. Использованиеlambda
позволит сэкономить 14 дополнительных байтов.MATLAB / Octave, 118 байт
источник
input('')
. Также избегайте лишних пробелов и скобок! И вы можете снова сбросить несколько байтов, предварительно определивf=@issorted
.PowerShell v2 +,
8780 байтВыполняет пошаговый просмотр списка ввода
$a
, проверяя каждый попарный элемент (включая последний и первый), чтобы определить, существует ли более одной убывающей пары. Если конкретная пара уменьшается, мы уменьшаем$c
. Выводит отсортированный список или отдельный элемент0
на основе значения$c
в конце. Если присутствует более одной «плохой» пары, то++$c
она все равно будет отрицательной, иначе она будет как минимум0
, поэтому выбирается второй элемент псевдо-троицы ($a|sort
).Я вижу, что xnor сделал нечто подобное , но я придумал это самостоятельно.
источник
Фактор, 47 байтов
присоедините последовательность к себе, затем проверьте, является ли отсортированное представление оригинала подпоследовательностью.
источник
dup dup append \\ natural sort \\ dip subseq?
Даже соответствует шаблону 4-4-3» :)С ++, 313
359370байтОгромный привет @Qwertiy за то, что он работает и научил меня некоторым отличным методам игры в гольф!
Golfed:
Ungolfed:
источник
using namespace std;
20 символов, когдаstd::
6 раз - 30.bool s = False;
- Почему бы и нет=0
? Вы можете броситьreturn 0;
. Почему здесь скобки!s&&(c<=v.size())
? Фигурные скобки и без запятых ...std::
иreturn 0;
) стало привычкой из классов программирования. Мне действительно нужно начать проверять свои программы лучше.True
иFalse
вместоtrue
иfalse
. ideone.com/kVTI25 - ваша версия, ideone.com/y8s44A - исправлена и подготовлена для игры в гольф.True
иFalse
от Python. Я даже не знал, что ты можешь писатьif
так!Mathcad, TBD
В Mathcad 0 (скалярный) == ложь.
(Эквивалентное) количество байтов равно TBD до согласованного метода подсчета. Приблизительно 52 байта, используя эквивалентность клавиатуры byte = оператор / символ.
источник
Mathematica
55 50 6158 байтС сохранением 3 байтов благодаря Мартину Бюттнеру.
Мои предыдущие попытки не прошли весь тестовый случай. Мне нужно было добавить,
Union
чтобы избежать повторений в списке, которые были введены в порядке.тесты
объяснение
Поверните вправо список ввода от 1 до
n
раза, гдеn
длина списка ввода. Если отсортированный входной список находится среди выходных повернутых списков, вернуть его; в противном случае верните пустой список.источник
@@
и/@
пустые списки.Join@@
все равно должен быть короче, чемFlatten@
если бы.PHP, 98 байт
Выводит,
1
если дрифтсортабельно, иначе ничегоисточник