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!


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>


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!


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



5

Python 3 , 31 Bytes

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

Probieren Sie es online!

-1 Byte dank xnor


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

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





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

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.


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)



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

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

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




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


1

Ruby, 18 Bytes

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

->a{a.sort.rotate}

1

Pyth, 5 Bytes

.>SQ1

Erläuterung

SQ - Eingabeliste sortieren

.>SQ1 - Eingabeliste zyklisch um 1 drehen






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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.