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


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 за название!


Будет ли вход всегда сортироваться?
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

Ṣṙ-также работает (просто хотел сказать, что; вы, вероятно, знали: 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


... Как я не увидел эту основную логику. >.>
полностью человек

@totallyhuman LOL все 3 из моих ответов делают то же самое. но ха: P Также я объединил ваш пиар для iOS -> MacOS: P
HyperNeutrino

Да, я заметил и удалил свою ветку. : P
полностью человек

Помещение minв конец сохраняет байт.
xnor


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





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

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

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


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

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




2

R, 33 32 29 байт

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

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

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

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

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




1

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

O#`
O^#-2`

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

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

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


1

Рубин, 18 байт

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

->a{a.sort.rotate}






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"].


Можете ли вы объяснить, почему [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том, что было более компактным, но я не могу

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.