Niezawodnie zepsuty sort

23

Biorąc pod uwagę listę dodatnich liczb całkowitych, która zawiera co najmniej 3 różne wpisy, wypisz permutację tej listy, która nie jest posortowana w kolejności rosnącej lub malejącej.

Przykłady

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

Dzięki @Arnauld i @NoOneIsHere za tytuł!

wada
źródło
Czy dane wejściowe zawsze będą sortowane?
xnor
Czy sortowanie musi być „niezawodne” pod tym względem, że przy danym zestawie wpisów zawsze daje taką samą permutację jak wyjście? A może musi to być „niezawodne”, ponieważ dane wyjściowe nie są sortowane?
Wildcard,
Musi po prostu spełniać specyfikacje.
flawr
Czy zagnieżdżona tablica byłaby dozwolona jako wynik? np [2,[1,3]].
Shaggy
Nie, powinna to być jedna tablica / lista.
wada

Odpowiedzi:

14

JavaScript (ES6), 39 34 bajtów

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

Posortuj tablicę w porządku rosnącym, pop ostatni element i użyj go jako pierwszego elementu nowej tablicy. Następnie zniszcz pozostałe elementy oryginalnej tablicy do nowej tablicy (zarówno w JS, jak sorti popzmodyfikuj oryginalną tablicę).


Sprawdź to

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>

Kudłaty
źródło
Dlaczego po prostu nie możesz a.sort()?
geokavel
1
@geokavel: Ponieważ sortmetoda JS sortuje leksykograficznie.
Kudłaty
3
Więc ponieważ jest już niewiarygodnie zepsuty? = D
jpmc26
7

Galaretka , 3 bajty

Ṣṙ1

Wypróbuj online!

Erik the Outgolfer
źródło
Ṣṙ-działa również (po prostu
chciałem
@HyperNeutrino Tak, to też działa, ta sama liczba bajtów: p
Erik the Outgolfer
W którym kodowaniu są Ṣṙ1tylko trzy bajty? W UTF-8 jest to 7 bajtów.
heinrich5991
2
@ heinrich5991 Jelly używa niestandardowej strony kodowej .
cole
Wydaje mi się, że każdy, kto korzysta z Jelly, musi mieć rozszerzenie przeglądarki, które dodaje przycisk do automatycznego publikowania komentarza „Jelly używa niestandardowej strony kodowej”.
12Me21
6

Ohm , 2 bajty

S╙

Wypróbuj online!

Sortuj i obracaj w prawo.

całkowicie ludzki
źródło
6

Japt , 3 bajty

n é

Sprawdź to

Sortuje ( n) tablicę i obraca ją ( é) o jeden element w prawo.

Kudłaty
źródło
5

Python 3 , 31 bajtów

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

Wypróbuj online!

-1 bajt dzięki xnor

HyperNeutrino
źródło
... Jak nie widziałem tej podstawowej logiki. >.>
całkowicie ludzki,
@totallyhuman lol wszystkie 3 moje odpowiedzi robią dokładnie to samo. ale ha: P Również połączyłem twój PR na iOS -> MacOS: P
HyperNeutrino
Tak, zauważyłem i usunąłem swój oddział. : P
totalnie ludzki,
Umieszczenie minna końcu oszczędza bajt.
xnor
5

APL, 9 bajtów

{1⌽⍵[⍋⍵]}

Wypróbuj online!

W jaki sposób?

⍵[⍋⍵] - posortuj listę

1⌽ - obróć o 1

Uriel
źródło
Also works in GNU and ngn!
Zacharý
@Zacharý guess I'll just remove the dyalog...
Uriel
5

TI-Basic (TI-84 Plus CE), 31 bytes

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

Prompts for input in the format {1,2,3,4}.

TI-Basic is a tokenized language, all tokens used here are one-byte.

Explanation:

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
źródło
5

Pyth, 7 5 4 bytes

.P1S

Try it online!

-1 byte thanks to FryAmTheEggman

NoOneIsHere
źródło
You can save a byte by using permutations: pyth.herokuapp.com/…
FryAmTheEggman
@FryAmTheEggman thanks, I'll update it when I get to a computer.
NoOneIsHere
3

Retina, 21 bytes

O#`
s`(.*)¶(.*)
$2¶$1

Try it online! Sort and rotate as per usual. At least there's no unary conversion this time.

Neil
źródło
3

Java 8, 68 37 bytes

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

-31 bytes thanks to @Nevay (forgot Java 8 had a List#sort(Comparator) method..)

Modifies the input-ArrayList, instead of returning a new one.

Explanation:

Try it here.

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
Kevin Cruijssen
źródło
You can use l->{l.sort(null);java.util.Collections.rotate(l,1);} to save 16 bytes.
Nevay
2
Alternatively you can use l->{l.sort(null);l.add(l.remove(0));} to save 31 bytes (requires the usage of a not fixed sized list).
Nevay
@Nevay nice one, but... the parentheses are a bit off in regards to the documentation: the reality is that the optional operations add and remove must be implemented; nothing is said about fixed-sized list... Kevin Cruijssen, given that there are much better alternatives in the previous comments, I'll wait for an edit before +1ing.
Olivier Grégoire
3

Haskell, 36 37 bytes

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

Use view patterns to match on the head of a sorted version of the input list, then append the first item of the list to the tail of the remaining list.

View patterns aren't worth it. Sort the list, take the head off, append it to the end. In this case, it turns out that the naive solution typed out compactly is the best.

typedrat
źródło
1
Welcome to PPCG! Great idea to use view patterns, I didn't know about them before. Unfortunately, they are not enabled in standard Haskell, so per site rules you need to include the bytes for the command line flag -XViewPatterns. Counting those the standard way f(a:b)=b++[a];f.sort is shorter.
Laikoni
I somehow wasn't thinking about the flag needed. I guess I use them so much that I forgot that I turn it on in my Cabal files and that it's not part of the language.
typedrat
2

Perl 6,  43  19 bytes

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

Try it

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

Try it

Note that [1..*,0] would result in ((2,3),1), so .flat is there to turn it into (2,3,1)

Brad Gilbert b2gills
źródło
2

Mathematica, 18 bytes

RotateLeft@Sort@#&

Try it online!

J42161217
źródło
4
Shorter: RotateLeft@*Sort
JungHwan Min
2

Ly, 7 bytes

&nasprl

Try it online!

Ugh, ruining the sort is so expensive!

Explanation:

&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
źródło
2

R, 33 32 29 bytes

Takes input from stdin. Sorts the list and then moves the first element to the end, ensuring that it is no longer sorted. Saved three bytes due to Giuseppe.

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

Another implementation, same byte count:

c((x<-sort(scan()))[-1],x[1])
rturnbull
źródło
c(sort(x<-scan())[-1],min(x)) is 29 bytes using essentially the same idea as yours.
Giuseppe
1

Ohm, 2 bytes

S╜

Try it online!

I think this is dissimilar enough from totallyhuman's post to post a new answer; I hope you don't mind :P EDIT: DAMMIT YOU NINJA'D ME

HyperNeutrino
źródło
Ninja'd you. ;)
totallyhuman
1

Python, 31 bytes

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

Yet another Python solution.

Sadly, this one has the same length to HyperNeutrino's answer.

tsh
źródło
1

Retina, 10 bytes

O#`
O^#-2`

Try it online!

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

This leaves the list with the 2nd highest element first and the highest element last which is never correctly sorted

PunPun1000
źródło
1

Ruby, 18 bytes

Submitted on mobile. Please don't kill me for problems.

->a{a.sort.rotate}
dkudriavtsev
źródło
1

Pyth, 5 bytes

.>SQ1

Explanation

SQ - sort input list

.>SQ1 - rotate input list cyclicaly by 1

Karan Elangovan
źródło
1

Proton, 19 bytes

a=>sorted(a)[1to,0]

Try it online!

-2 bytes indirectly thanks to xnor

Not yet working on TIO; waiting for a pull.

HyperNeutrino
źródło
1

Python 3, 28 bytes

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

Try it online!

a.sort() sorts a in place and returns None. None can be used as a slicing index and is the same as omitting that index.

Business Cat
źródło
1

PHP, 44 bytes

requires PHP 5.4 or later for short array syntax.

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

sort arguments, replace 0-th argument with removed last argument, print.
Run with -nr or try it online.


The 0-th argument is the script file name, "-" if you call PHP with -r. "-" is compared to the other arguments as a string, and since ord("-")==45, it is smaller than any number. The numbers themselves, although strings, are compared as numbers: "12" > "2".

php -nr '<code>' 3 4 2 5 1 and sort($a=&$argv) lead to $a=["-","1","2","3","4","5"]
[array_pop($a)]+$a is [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"],
which results in [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].

Titus
źródło
Can you explain why [array_pop($a)]+$a doesn't overwrite the 0th index of $a? For example: $a=[1,2,3,4,5], array_pop($a) = 5, $a=[1,2,3,4]. If you do [5]+[1,2,3,4], shouldn't it end up being [5,2,3,4] because both arrays have a 0th index? I'm confused because the PHP manual says "The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored."
jstnthms
@jstnthms The + operator does not append, it merges (without reordering the indexes; but that doesn´t matter here). The important point is that $a points to $argv and $argv[0] contains the script´s file name, the arguments start at index 1. I extended the description. Thanks for the question.
Titus
1

Julia, 23 bytes

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

Slightly shorter than, but equivalent to f(x)=circshift(sort(x),1). I wish I could makeamethod based on select that was more, compact but I can not

Lyndon White
źródło