Надійно зламаний сорт


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

Ні, це повинен бути один єдиний масив / список.
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()?
geokavel

1
@geokavel: Тому що sortметод JS сортує лексикографічно.
Кудлатий

3
Тож тому, що це вже ненадійно зламано? = D
jpmc26


7

Ṣṙ-також працює (просто відчувалося, що це говорили; ви, напевно, знали: P)
HyperNeutrino

@HyperNeutrino Так, це теж працює, той же самий рахунок: p
Ерік the Outgolfer

У якому кодуванні Ṣṙ1всього три байти? У UTF-8 це 7 байт.
heinrich5991

2
@ heinrich5991 Jelly використовує власну кодову сторінку .
cole

Я відчуваю, що кожен, хто використовує Jelly, повинен мати розширення для браузера, яке додає кнопку для автоматичного розміщення коментаря "Jelly використовує користувацьку кодову сторінку".
травня



5

Python 3 , 31 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки xnor


... Як я не бачив цієї основної логіки. >.>
повністюлюдський

@totallyhuman lol всі 3 мої відповіді роблять точно те саме. але ha: P Також я об'єднав ваш PR для 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)метод ..)

Змінює введення 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 байт.
Невай

2
Крім того, ви можете використовувати l->{l.sort(null);l.add(l.remove(0));}для збереження 31 байт (потрібне використання списку не фіксованого розміру).
Невай

@Nevay приємний, але ... дужки трохи недоступні щодо документації: реальність полягає в тому, що необов'язкові операції addі removeповинні бути виконані; про список фіксованого розміру нічого не сказано ... Кевін Круїссен, враховуючи, що в попередніх коментарях є набагато кращі альтернативи, я зачекаю редагування перед +1.
Олів'є Грегоар

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коротший.
Laikoni

Я якось не думав про необхідний прапор. Напевно, я їх так сильно використовую, що забув, що вмикаю його у своїх файлах Cabal і що це не частина мови.
typedrat




2

R, 33 32 29 байт

Бере вхід з stdin. Сортує список і потім переміщує перший елемент до кінця, переконуючись, що він більше не сортується. Збережено три байти завдяки Джузеппе.

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

Ще одна реалізація, те саме кількість байтів:

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

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





1

Рубін, 18 байт

Надіслано на мобільний телефон. Будь ласка, не вбивайте мене через проблеми.

->a{a.sort.rotate}

1

Pyth, 5 байт

.>SQ1

Пояснення

SQ - сортувати список введення

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






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.