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ł!


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>


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!


Ṣṙ-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





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





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

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.


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

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

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])

c(sort(x<-scan())[-1],min(x)) is 29 bytes using essentially the same idea as yours.
Giuseppe




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


1

Ruby, 18 bytes

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

->a{a.sort.rotate}






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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.