Надежно сломанная сортировка

23

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

Примеры

1,2,3 -> 2,1,3 or 3,1,2 or 1,3,2 or 2,3,1
1,2,3,3 -> 2,1,3,3 or 3,1,2,3 or 1,3,2,3 etc..

Спасибо @Arnauld и @NoOneIsHere за название!

flawr
источник
Будет ли вход всегда сортироваться?
xnor
Должен ли сорт быть «надежным» в том смысле, что, учитывая заданный набор записей, он всегда производит ту же перестановку, что и выходные данные? Или он должен быть только «надежным» в том смысле, что вывод не отсортирован?
Wildcard
Это должно просто удовлетворить спецификации.
flawr
Будет ли вложенный массив разрешен в качестве вывода? например, [2,[1,3]].
Лохматый
Нет, это должен быть один массив / список.
flawr

Ответы:

14

JavaScript (ES6), 39 34 байта

a=>[a.sort((x,y)=>x-y).pop(),...a]

Сортируйте массив в порядке возрастания, вытолкните последний элемент и используйте его в качестве первого элемента нового массива. Затем деструктурируйте оставшиеся элементы исходного массива в новый массив (в JS оба sortи popизмените исходный массив).


Попробуй это

o.innerText=(f=

a=>[a.sort((x,y)=>x-y).pop(),...a]

)(i.value=[1,2,3]);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>

мохнатый
источник
Почему ты не можешь просто сделать a.sort()?
геокавель
1
@geokavel: потому что sortметод JS сортирует лексикографически.
Лохматый
3
Так потому что он уже ненадежно сломан? = D
jpmc26
7

Желе , 3 байта

Ṣṙ1

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

Эрик Outgolfer
источник
Ṣṙ-также работает (просто хотел сказать, что; вы, вероятно, знали: P)
HyperNeutrino
@HyperNeutrino Да, это тоже работает, тот же bytecount: p
Эрик Outgolfer
В какой кодировке Ṣṙ1только три байта? В UTF-8 это 7 байтов.
heinrich5991
2
@ heinrich5991 Jelly использует пользовательскую кодовую страницу .
Коул
Я чувствую, что у всех, кто использует Jelly, должно быть расширение для браузера, которое добавляет кнопку для автоматической публикации комментария «Jelly использует пользовательскую кодовую страницу».
12Me21
5

Python 3 , 31 байт

lambda a:sorted(a)[1:]+[min(a)]

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

-1 байт благодаря xnor

HyperNeutrino
источник
... Как я не увидел эту основную логику. >.>
полностью человек
@totallyhuman LOL все 3 из моих ответов делают то же самое. но ха: P Также я объединил ваш пиар для iOS -> MacOS: P
HyperNeutrino
Да, я заметил и удалил свою ветку. : P
полностью человек
Помещение minв конец сохраняет байт.
xnor
5

APL, 9 байт

{1⌽⍵[⍋⍵]}

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

Как?

⍵[⍋⍵] - отсортировать список

1⌽ - повернуть на 1

Уриэль
источник
Также работает в GNU и ngn!
Захари
@ Захари, думаю, я просто уберу диалог ...
Уриэль
5

TI-Basic (TI-84 Plus CE), 31 байт

Prompt A
SortA(LA
max(LA→B
dim(LA)-1→dim(LA
augment({B},LA

Запрашивает ввод в формате {1,2,3,4}.

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

Объяснение:

Prompt A         # 3 bytes, store user input in LA
SortA(LA         # 4 bytes, sort LA ascending
max(LA→B         # 6 bytes, save the last value in the sorted list to B
dim(LA)-1→dim(LA # 11 bytes, remove the last value from LA
augment({B},LA   # 7 bytes, prepend B to LA and implicitly print the result
pizzapants184
источник
5

Pyth , 7 5 4 байта

.P1S

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

-1 байт благодаря FryAmTheEggman

NoOneIsHere
источник
Вы можете сохранить байт, используя перестановки: pyth.herokuapp.com/…
FryAmTheEggman
@FryAmTheEggman спасибо, я обновлю его, когда доберусь до компьютера.
NoOneIsHere
3

Java 8, 68 37 байт

l->{l.sort(null);l.add(l.remove(0));}

-31 байт благодаря @Nevay (забыл, у Java 8 был List#sort(Comparator)метод ..)

Изменяет input- ArrayList, вместо того, чтобы возвращать новый.

Объяснение:

Попробуй это здесь.

l->{                   // Method with ArrayList parameter and no return-type
  l.sort(null);        //  Sort the input-list (no need for a Comparator, thus null)
  l.add(l.remove(0));  //  Remove the first element, and add it last
}                      // End of method
Кевин Круйссен
источник
Вы можете использовать, l->{l.sort(null);java.util.Collections.rotate(l,1);}чтобы сохранить 16 байтов.
Nevay
2
В качестве альтернативы вы можете использовать l->{l.sort(null);l.add(l.remove(0));}для сохранения 31 байта (требуется использование списка не фиксированного размера).
Nevay
@Nevay хороший, но ... круглые скобки откусили в отношении документации: реальность такова , что дополнительные операции addи removeдолжны быть реализованы; ничего не сказано о списке фиксированного размера ... Кевин Круйссен, учитывая, что в предыдущих комментариях есть намного лучшие альтернативы, я буду ждать редактирования до + 1ing.
Оливье Грегуар
3

Haskell, 36 37 байт

import Data.List
f(a:b)=b++[a];f.sort

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

Шаблоны просмотра не стоят того. Сортируйте список, снимите голову, добавьте ее в конец. В этом случае оказывается, что наивное решение, набранное компактно, является лучшим.

typedrat
источник
1
Добро пожаловать в PPCG! Отличная идея использовать шаблоны просмотра, я не знал о них раньше. К сожалению, они не включены в стандартном Haskell, поэтому в соответствии с правилами сайта необходимо включать байты для флага командной строки -XViewPatterns. Подсчет тех стандартным способом f(a:b)=b++[a];f.sortкороче.
Лайкони
Я почему-то не думал о необходимом флаге. Я полагаю, что использую их так сильно, что забыл, что включаю его в файлах Cabal и что это не является частью языка.
напечатано
2

Perl 6 ,  43  19 байт

{first {![<=]($_)&&![>=] $_},.permutations}

Попытайся

*.sort[1..*,0].flat

Попытайся

Обратите внимание, [1..*,0]что в результате ((2,3),1), так .flatчто есть, чтобы превратить его в(2,3,1)

Брэд Гилберт b2gills
источник
2

Ly , 7 байт

&nasprl

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

Тьфу, испортить сорт так дорого!

Объяснение:

&nasprl

&n      # take input as a list of numbers
  a     # sort
   sp   # save top of stack and pop
     r  # reverse stack
      l # load saved item
LyricLy
источник
2

R, 33 32 29 байт

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

c(sort(x<-scan())[-1],min(x))

Другая реализация с тем же количеством байтов:

c((x<-sort(scan()))[-1],x[1])
rturnbull
источник
c(sort(x<-scan())[-1],min(x))29 байтов, используя, по сути, ту же идею, что и ваша.
Джузеппе
1

Ом , 2 байта

S╜

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

Я думаю, что это достаточно отличается от поста полностью человеческого, чтобы опубликовать новый ответ; Я надеюсь, что вы не возражаете: P РЕДАКТИРОВАТЬ : DAMMIT ВЫ NINJA'D ME

HyperNeutrino
источник
Ниндзя ты. ;)
полностью человек
1

Python, 31 байт

def f(a):a[1:]=a[a.sort():0:-1]

Еще одно решение Python.

К сожалению, у этого есть та же самая длина к ответу HyperNeutrino .

ТТГ
источник
1

Сетчатка , 10 байт

O#`
O^#-2`

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

O#`     Sort the list
O^#-2`  Reverse sort the list other than the last element

Это оставляет список со вторым самым высоким элементом первым и самым высоким элементом последним, который никогда не сортируется правильно

PunPun1000
источник
1

Рубин, 18 байт

Представлено на мобильном телефоне. Пожалуйста, не убивайте меня за проблемы.

->a{a.sort.rotate}
dkudriavtsev
источник
1

Pyth, 5 байт

.>SQ1

объяснение

SQ - сортировать список ввода

.>SQ1 - вращать список ввода циклически на 1

Каран Елангован
источник
1

Python 3 , 28 байт

lambda a:a[1:a.sort()]+a[:1]

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

a.sort()сортирует aна месте и возвращает None. Noneможет использоваться в качестве индекса среза и аналогично пропуску этого индекса.

Бизнес Кот
источник
1

PHP, 44 байта

требует PHP 5.4 или более поздней версии для синтаксиса короткого массива.

sort($a=&$argv);print_r([array_pop($a)]+$a);

сортировка аргументов, замена 0-го аргумента удаленным последним аргументом, печать.
Запустите -nrили попробуйте онлайн .


0-й аргумент - это имя файла скрипта, "-"если вы вызываете PHP с помощью -r. "-"сравнивается с другими аргументами в виде строки, и, поскольку ord("-")==45она меньше любого числа. Сами числа, хотя и строки, сравниваются как числа:"12" > "2" .

php -nr '<code>' 3 4 2 5 1и sort($a=&$argv)привести к $a=["-","1","2","3","4","5"]
[array_pop($a)]+$aесть [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"],
что приводит к [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].

Titus
источник
Можете ли вы объяснить, почему [array_pop ($ a)] + $ a не перезаписывает 0-й индекс $ a? Например: $ a = [1,2,3,4,5], array_pop ($ a) = 5, $ a = [1,2,3,4]. Если вы сделаете [5] + [1,2,3,4], разве это не должно получиться [5,2,3,4], потому что оба массива имеют 0-й индекс? Я запутался, потому что в руководстве по PHP написано: «Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива и соответствующие элементы из правого массива будут игнорироваться. "
Jstnthms
@jstnthms +Оператор не добавляется, он сливается (без переупорядочения индексов, но здесь это не имеет значения). Важным моментом является то, что он $aуказывает на имя файла скрипта $argvи $argv[0]содержит его, аргументы начинаются с индекса 1. Я расширил описание. Спасибо за вопрос.
Титус
1

Юлия, 23 байта

f(x)=sort(x)[[2:end;1]]

Чуть короче, но эквивалентно f(x)=circshift(sort(x),1). Хотелось бы, чтобы я мог сделать метод, основанный на selectтом, что было более компактным, но я не могу

Линдон Уайт
источник