Zuverlässig gebrochene Sortierung

23

Bei einer Liste positiver Ganzzahlen mit mindestens drei verschiedenen Einträgen geben Sie eine Permutation dieser Liste aus, die nicht in aufsteigender oder absteigender Reihenfolge sortiert ist.

Beispiele

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

Vielen Dank an @Arnauld und @NoOneIsHere für den Titel!

Fehler
quelle
Wird die Eingabe immer sortiert?
13.
Muss die Sortierung "zuverlässig" sein, wenn eine bestimmte Menge von Einträgen gegeben ist und immer die gleiche Permutation wie die Ausgabe erzeugt? Oder muss es nur "zuverlässig" sein, dass die Ausgabe nicht sortiert wird?
Wildcard
Es muss nur die Spezifikationen erfüllen.
Fehler
Wäre ein verschachteltes Array als Ausgabe zulässig? zB [2,[1,3]].
Shaggy
Nein, es sollte ein einzelnes Array / eine einzelne Liste sein.
Fehler

Antworten:

14

JavaScript (ES6), 39 34 Bytes

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

Sortieren Sie das Array in aufsteigender Reihenfolge, platzieren Sie das letzte Element und verwenden Sie es als erstes Element eines neuen Arrays. Zerlegen Sie dann die verbleibenden Elemente des ursprünglichen Arrays in das neue Array (in JS beide sortund popändern Sie das ursprüngliche Array).


Probier es aus

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>

Zottelig
quelle
Warum kannst du es nicht einfach tun a.sort()?
Geokavel
1
@geokavel: Weil die sortMethode von JS lexikografisch sortiert.
Shaggy
3
Also weil es schon unzuverlässig kaputt ist? = D
jpmc26
7

Gelee , 3 Bytes

Ṣṙ1

Probieren Sie es online!

Erik der Outgolfer
quelle
Ṣṙ-funktioniert auch (ich wollte es nur sagen, Sie wussten wahrscheinlich: P)
HyperNeutrino
@HyperNeutrino Ja, das funktioniert auch, das gleiche bytecount: p
Erik the Outgolfer
In welcher Kodierung sind Ṣṙ1nur drei Bytes? In UTF-8 sind es 7 Bytes.
Heinrich5991
2
@ heinrich5991 Jelly verwendet eine benutzerdefinierte Codepage .
Cole
Ich habe das Gefühl, dass jeder, der Jelly verwendet, eine Browser-Erweiterung haben muss, die eine Schaltfläche hinzufügt, um automatisch den Kommentar "Jelly verwendet eine benutzerdefinierte Codepage" zu posten.
12. Mai,
6

Japt , 3 Bytes

n é

Probier es aus

Sortiert ( n) das Array und dreht es ( é) um ein Element nach rechts.

Zottelig
quelle
5

Python 3 , 31 Bytes

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

Probieren Sie es online!

-1 Byte dank xnor

HyperNeutrino
quelle
... wie habe ich diese grundsätzliche Logik nicht gesehen. >.>
totalhuman
@totallyhuman lol alle 3 meiner Antworten machen genau das gleiche. aber ha: P Auch ich habe Ihre PR für iOS zusammengeführt -> MacOS: P
HyperNeutrino
Ja, ich habe meine Filiale bemerkt und gelöscht. : P
totalhuman
Wenn Sie das minam Ende setzen, wird ein Byte gespeichert.
13.
5

APL, 9 Bytes

{1⌽⍵[⍋⍵]}

Probieren Sie es online!

Wie?

⍵[⍋⍵] - Liste sortieren

1⌽ - um 1 drehen

Uriel
quelle
Funktioniert auch in GNU und ngn!
Zacharý
@ Zacharý denke, ich werde nur den Dyalog entfernen ...
Uriel
5

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

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

Fordert zur Eingabe im Format auf {1,2,3,4}.

TI-Basic ist eine Token-Sprache . Alle hier verwendeten Token bestehen aus einem Byte.

Erläuterung:

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
quelle
5

Pyth , 7 5 4 Bytes

.P1S

Probieren Sie es online!

-1 Byte dank FryAmTheEggman

Niemand ist hier
quelle
Sie können ein Byte speichern, indem Sie Permutationen verwenden: pyth.herokuapp.com/…
FryAmTheEggman
@FryAmTheEggman danke, ich werde es aktualisieren, wenn ich an einen Computer komme.
NoOneIsHere
3

Netzhaut , 21 Bytes

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

Probieren Sie es online! Sortieren und drehen Sie wie gewohnt. Zumindest gibt es diesmal keine einheitliche Bekehrung.

Neil
quelle
3

Java 8, 68 37 Bytes

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

-31 Bytes dank @Nevay (Java 8 hatte eine List#sort(Comparator)Methode vergessen ..)

Ändert die Eingabe ArrayList, anstatt eine neue zurückzugeben.

Erläuterung:

Probieren Sie es hier aus.

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
quelle
Sie können l->{l.sort(null);java.util.Collections.rotate(l,1);}damit 16 Bytes sparen.
Nevay
2
Alternativ können Sie l->{l.sort(null);l.add(l.remove(0));}31 Bytes speichern (erfordert die Verwendung einer Liste mit nicht fester Größe).
Nevay
@Nevay nett, aber ... die Klammern sind ein bisschen abweichend in Bezug auf die Dokumentation: die Realität ist, dass die optionalen Operationen addund removeimplementiert werden müssen; Über eine Liste mit fester Größe wird nichts gesagt ... Kevin Cruijssen, da es in den vorherigen Kommentaren viel bessere Alternativen gibt, warte ich auf eine Bearbeitung, bevor ich +1 gebe.
Olivier Grégoire
3

Haskell, 36 37 Bytes

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

Verwenden Sie Ansichtsmuster, um den Anfang einer sortierten Version der Eingabeliste abzugleichen, und hängen Sie dann das erste Element der Liste an den Ende der verbleibenden Liste an.

Ansichtsmuster sind es nicht wert. Sortieren Sie die Liste, nehmen Sie den Kopf ab und hängen Sie ihn an das Ende an. In diesem Fall stellt sich heraus, dass die kompakt getippte naive Lösung die beste ist.

typedrat
quelle
1
Willkommen bei PPCG! Tolle Idee, Ansichtsmuster zu verwenden, die ich vorher nicht kannte. Leider sind sie in Standard-Haskell nicht aktiviert, sodass Sie pro Site-Regeln die Bytes für das Befehlszeilen-Flag angeben müssen -XViewPatterns. Diese zu zählen ist der Standardweg, der f(a:b)=b++[a];f.sortkürzer ist.
Laikoni
Ich dachte irgendwie nicht über die Flagge nach, die gebraucht wurde. Ich nehme an, ich benutze sie so oft, dass ich vergessen habe, dass ich sie in meinen Cabal-Dateien aktiviert habe und dass sie nicht Teil der Sprache sind.
Typedrat
2

Perl 6 ,  43  19 Bytes

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

Versuch es

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

Versuch es

Beachten Sie, dass [1..*,0]dies dazu führen würde ((2,3),1), also .flatgibt es etwas, in das Sie es verwandeln können(2,3,1)

Brad Gilbert b2gills
quelle
2

Mathematica, 18 Bytes

RotateLeft@Sort@#&

Probieren Sie es online!

J42161217
quelle
4
Kürzere:RotateLeft@*Sort
JungHwan Min
2

Ly , 7 Bytes

&nasprl

Probieren Sie es online!

Ach, die Sorte zu ruinieren ist so teuer!

Erläuterung:

&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
Textlich
quelle
2

R 33, 32 29 Bytes

Übernimmt die Eingabe von stdin. Sortiert die Liste und verschiebt dann das erste Element an das Ende, um sicherzustellen, dass es nicht mehr sortiert ist. Drei Bytes wegen Giuseppe gespeichert.

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

Eine andere Implementierung, gleiche Byteanzahl:

c((x<-sort(scan()))[-1],x[1])
rturnbull
quelle
c(sort(x<-scan())[-1],min(x))ist 29 Bytes mit im Wesentlichen der gleichen Idee wie bei Ihnen.
Giuseppe
1

Ohm , 2 Bytes

S╜

Probieren Sie es online!

Ich denke, das ist anders als bei totalhuman, um eine neue Antwort zu schreiben. Ich hoffe, es macht Ihnen nichts aus: P EDIT : Verdammt, Sie haben mich nicht erwischt

HyperNeutrino
quelle
Ninja, du. ;)
totalhuman
1

Python, 31 Bytes

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

Noch eine andere Python-Lösung.

Leider hat dieser die gleiche Länge wie die Antwort von HyperNeutrino .

tsh
quelle
1

Retina , 10 Bytes

O#`
O^#-2`

Probieren Sie es online!

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

Dies hinterlässt die Liste mit dem zweithöchsten Element zuerst und dem höchsten Element zuletzt, die nie richtig sortiert sind

PunPun1000
quelle
1

Ruby, 18 Bytes

Eingereicht auf dem Handy. Bitte töte mich nicht für Probleme.

->a{a.sort.rotate}
dkudriavtsev
quelle
1

Pyth, 5 Bytes

.>SQ1

Erläuterung

SQ - Eingabeliste sortieren

.>SQ1 - Eingabeliste zyklisch um 1 drehen

Karan Elangovan
quelle
1

Python 3 , 28 Bytes

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

Probieren Sie es online!

a.sort()sortiert aan Ort und Stelle und kehrt zurück None. Nonekann als Slicing-Index verwendet werden und entspricht dem Weglassen dieses Index.

Geschäfts-Katze
quelle
1

PHP, 44 Bytes

erfordert PHP 5.4 oder neuer für kurze Array-Syntax.

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

Argumente sortieren, 0. Argument durch entferntes letztes Argument ersetzen, drucken.
Laufen Sie mit -nroder versuchen Sie es online .


Das 0-te Argument ist der Name der Skriptdatei, "-"wenn Sie PHP mit aufrufen -r. "-"wird als Zeichenfolge mit den anderen Argumenten verglichen und ord("-")==45ist daher kleiner als eine beliebige Zahl. Die Zahlen selbst, obwohl Strings als Zahlen verglichen: "12" > "2".

php -nr '<code>' 3 4 2 5 1und sort($a=&$argv)führen zu $a=["-","1","2","3","4","5"]
[array_pop($a)]+$aist [0=>"5"]+[0=>"-",1=>"1",2=>"2",3=>"3",4=>"4"],
was ergibt [0=>"5",1=>"1",2=>"2",3=>"3",4=>"4"].

Titus
quelle
Können Sie erklären, warum [array_pop ($ a)] + $ a den 0. Index von $ a nicht überschreibt? Zum Beispiel: $ a = [1,2,3,4,5], array_pop ($ a) = 5, $ a = [1,2,3,4]. Wenn Sie [5] + [1,2,3,4] tun, sollte es nicht am Ende [5,2,3,4] lauten, weil beide Arrays einen 0. Index haben? Ich bin verwirrt, weil im PHP-Handbuch steht: "Der Operator + gibt das an das linke Array angehängte rechte Array zurück. Bei Schlüsseln, die in beiden Arrays vorhanden sind, werden die Elemente aus dem linken Array verwendet und das übereinstimmende Array Elemente aus dem rechten Array werden ignoriert. "
Jstnthms
@jstnthms Der +Operator hängt nicht an, er führt zusammen (ohne die Indizes neu zu ordnen; das ist hier aber egal). Der wichtige Punkt ist, dass $aer auf den Dateinamen des Skripts verweist $argvund diesen $argv[0]enthält. Die Argumente beginnen bei Index 1. Ich habe die Beschreibung erweitert. Danke für die Frage.
Titus
1

Julia, 23 Bytes

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

Etwas kürzer als, aber gleichwertig mit f(x)=circshift(sort(x),1). Ich wünschte, ich könnte die Methode, die darauf basiert select, kompakter machen, aber ich kann nicht

Lyndon White
quelle