Driftsort ist eine einfache Möglichkeit, ein Array zu "sortieren". Es funktioniert, indem die Elemente im Array "verschoben" oder "gedreht" werden, bis das Array sortiert ist oder bis das Array nicht mehr sortiert werden kann.
Lassen Sie uns zwei Beispiele durchgehen. Betrachten Sie zunächst das Array [10, 2, 3, 4, 7]
. Da das Array nicht sortiert ist, drehen wir es einmal. (Dies kann in beide Richtungen geschehen, solange die Richtung gleich bleibt.) Dann wird das Array:
[7, 10, 2, 3, 4]
Dies ist nicht sortiert, so dass wir erneut drehen.
[4, 7, 10, 2, 3]
Und wieder:
[3, 4, 7, 10, 2]
Und ein letztes Mal:
[2, 3, 4, 7, 10]
Und es ist sortiert! Das Array [10, 2, 3, 4, 7]
ist also driftsortierbar. Hier sind zur Verdeutlichung alle Rotationen des Arrays:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
Betrachten Sie nun das Array [5, 3, 9, 2, 6, 7]
. Schauen Sie sich die Rotationen an:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
Keines dieser Arrays ist sortiert, sodass das Array [5, 3, 9, 2, 6, 7]
nicht driftsortierbar ist.
Zielsetzung Wenn ein nicht leeres Array / eine Liste von Ganzzahlen als Eingabe für ein Programm / eine Funktion verwendet wird, implementieren Sie eine Driftsortierung für die Eingabe und geben Sie sie aus, oder geben Sie einen Falsey - Wert aus ( oder ein leeres Array / eine leere Liste) aus, wenn keine Driftsortierung möglich ist. Die Ganzzahlen sind an Ihre Sprachen max / min gebunden, aber dies muss mindestens 255 für das Maximum und 0 für das Minimum sein.
Sie können integrierte Sortiermethoden verwenden, jedoch keine integrierten, die die Herausforderung lösen.
Dies ist ein Code-Golf , also das kürzeste Programm in Bytes.
Testfälle
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
sorted(l)
eine zusammenhängende Unterliste vonl+l
.shiftsort
?shift
Operation führen, mit der das erste Element eines Arrays entfernt wird.Antworten:
Gelee , 6 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Ruby, 33
a.any?
Feuert bis zu einmal für jedes Element im Array ab, außer es stoppt (und gibt true zurück), sobald das Array in einen sortierten Zustand geändert wurde. In diesem Fall geben wir das mutierte Array zurück. Andernfalls geben wir den zurückgegebenen falschen Wertany?
zurück.quelle
Python 2, 51 Bytes
Rotiert nicht. Sortiert stattdessen die Liste und prüft, ob das Original driftsortierbar ist, indem überprüft wird, ob höchstens eine Abnahme unter aufeinanderfolgenden Elementen der zyklisierten Liste vorliegt. Die Zählung erfolgt,
<3
weilmap
die kürzere Liste mitNone
am Ende aufgefüllt wird und eine falsche Abnahme hinzugefügt wird.quelle
[1, 3, 2, 4]
Es gibt nur eine Abnahme unter aufeinanderfolgenden Elementen, aber es ist nicht driftsortierbar.<3
you also<3
, dass man die Liste nicht präzise drehen muss.Pyth, 9 Bytes
Erläuterung:
Probieren Sie es hier aus!
Oder benutze eine Testsuite!
quelle
.:
. Kombinationen würden nicht zusammenhängende Elemente enthalten.Matlab,
614741 BytesDanke @Suever für -6 Bytes!
Wenn
strfind([a,a],sort(a))
versucht wird, den sortierten Eingabevektor als 'Teilzeichenfolge' der unsortierten zu finden, wurde dieser an sich selbst angehängt. Wenn wahr, ist die Eingabe driftsortierbar und wir erhalten einen Vektor der Länge 2, wenn nicht, erhalten wir einen leeren Vektor.min
transformiert dies einfach in eine Zahl / einen leeren Vektor. Wenn Sie den sortierten Vektor zu 0 hinzufügen, wird er nur angezeigt, und wenn Sie ihn einem leeren Vektor hinzufügen, wird ein Fehler ausgegeben.quelle
[2, 3]
keinen sublist des Sein[12, 34]
?strfind
direkt mit Zahlen gearbeitet werden kann, nicht nur mit Zeichen (auch wenn das nicht dokumentiert ist). Wenn die Zahlen als Zeichen interpretiert würden, wären sie beschränkt auf65535
(versuchen Sie es zum Beispiel+char(1e5)
)Julia,
716652 BytesDies ist eine anonyme Funktion, die ein Array akzeptiert und ein Array oder einen Booleschen Wert zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Für ein Eingabearray x erstellen wir die Menge aller Rotationen von x und prüfen, ob die sortierte Version x ein Element dieser Liste ist. Wenn dies der Fall ist, geben wir x sortiert zurück, andernfalls geben wir false zurück.
19 Bytes gespart dank Dennis!
quelle
Pip , 15 + 1 =
17 -16 BytesPuh, die anderen Golfsprachen blasen das aus dem Wasser. Da ich es aber schon geschrieben habe ...
Nimmt Eingaben als durch Leerzeichen getrennte Befehlszeilenargumente an. Benötigt
-p
oder ein anderes Array-Formatierungs-Flag, um das Ergebnis leserlich und nicht verkettet anzuzeigen. Der falsche Fall gibt eine leere Zeichenfolge aus, die anhand der nachgestellten Zeilenumbrüche sichtbar ist.quelle
JavaScript (ES6),
727065 BytesKehrt
0
bei einem Fehler zurück. Vorherige858380-Byte-Version verhinderte den Aufruf vonsort
:Bearbeiten: 2 Bytes durch Initialisieren
c
auf-1
anstelle von gespeichert0
. 5 Bytes gespart durch Umschalten vonreduce
aufmap
, seufz ...quelle
[10, 2, 3, 4, 7]
.[1]
,[0, 0, 0, 0, 0, 0, 0]
und[75, 230, 30, 42, 50]
.sort
Versehen, das den dritten Testfehler verursacht hat. Die anderen beiden Testfehler wurden durch übermäßiges Golfen verursacht. Ich habe auf die vorherige Version zurückgegriffen.05AB1E , 12 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Schneemann 1.0.2 , 27 Bytes
Dies ist eine Unterroutine, die Eingaben von und Ausgaben für den aktuellen Permavar übernimmt.
Probieren Sie es online!
quelle
MATL,
1312109 BytesDieselbe Idee wie bei der Antwort von @ flawr, bei der wir hijack
strfind
(Xf
) verwenden, um die sortierte Version der Eingabe innerhalb der Verkettung von zwei Kopien der Eingabe zu finden.Probieren Sie es online!
Erläuterung
quelle
g
? Oder ersetzenng
durcha
n
dan
könnte> 1. aufa
jeden Fall funktioniert. Ich dachte, es gäbe einen besseren Weg. Vielen Dank!Julia, 33 Bytes
Probieren Sie es online!
Wie es funktioniert
Dies verkettet das Array x mit sich selbst und zählt die Anzahl der Paare, die nicht in Ordnung sind, dh die Anzahl der zusammenhängenden Unterarrays [a, b], für die b - a <0 ist . Wenn C die Anzahl der Paare von ungeordneten x selbst und t ist 1 , wenn x ‚s letzte Element größer ist als seine erste ist,
sum
kehrt 2c + t .Das Array x ist driftsortierbar iff (c, t) = (1, 0) ( x muss auf den kleineren Wert des einzigen ungeordneten Paares gedreht werden), (c, t) = (0, 1) ( x ist sortiert) oder (c, t) = (0, 0) ( x ist sortiert und alle seine Elemente sind gleich), was wahr ist, wenn 2c + t <3 ist .
quelle
Javascript ES6,
484543 ZeichenPrüfung:
quelle
(x+[,x])
und ein weiteres Byte verwenden, indem Sie~
anstatt1+
in Ihrer Bedingung verwenden.Brachylog , 39 Bytes
Ich muss wirklich ein optionales Argument hinzufügen
$( - circular permute left
um mehr als einmal zu permutieren ... das wären 13 Bytes gewesen. Dies wird warten, nachdem ein stabiler neuer Transpiler in Prolog implementiert wurde.Erläuterung
quelle
Ruby, 47 Bytes
Rekursive Funktion. Gibt zurück,
nil
wenn das Eingabearray nicht driftsortiert werden kann.quelle
CJam,
1713 BytesVielen Dank an Dennis für das Speichern von 4 Bytes.
Ein unbenannter Block (Funktion), der eine Liste aufnimmt und zurückgibt.
Testsuite.
Erläuterung
Dies basiert im Wesentlichen auf der Beobachtung von xnor, dass die sortierte Liste doppelt so groß ist wie die ursprüngliche Liste, wenn ihre Drift sortierbar ist:
quelle
C ++ 14, 242 Zeichen
Wenn ich die Ausgabe nicht leer lassen kann, 252 Zeichen http://ideone.com/HAzJ5V
Ungolfed-Version http://ideone.com/Dsbs8W
PS: Basierend auf der Idee von @ MichelfrancisBustillos .
quelle
Java 7, 207 Bytes
Ausführlicher Versuch hier
quelle
Java 175
druckt die Ausgabe als durch Leerzeichen getrennte Werte aus oder druckt
f
für einen falschen Wert.Durchläuft alle Kombinationen des Arrays von Ganzzahlen, bis die gültige Sequenz gefunden wird oder die Kombinationen ausgehen. Das Array wird nicht geändert, sondern die driftsortierte Sequenz wird als durch Leerzeichen getrennte Zeichenfolge gespeichert.
etwas besser lesbar:
versuche es online
quelle
C 105 Bytes
Dies akzeptiert die Eingabe-Ganzzahlen als separate Befehlszeilenargumente und gibt die Ausgabeliste als eine Ganzzahl pro Zeile aus.
Wenn die Liste nicht driftsortierbar ist, wird das Programm aufgrund einer Gleitkomma-Ausnahme vorzeitig beendet, sodass die leere Ausgabe eine leere Liste darstellt.
Nachprüfung
quelle
Rubin, 28
Gibt entweder das sortierte Array oder
nil
(was ein falscher Wert ist) zurück, wenn die Eingabe nicht driftsortierbar ist.quelle
Python, 53 Bytes
Wenn Sie dies testen möchten, gehen Sie zu https://www.repl.it/languages/python3 und fügen Sie Folgendes ein:
Wie es funktioniert:
s
ist eine Variable, die diesorted
Python-Funktion speichert, die Listen sortiertN
ist die Hauptfunktions(x)
wird multipliziert mit, ob die Liste driftsortierbar ist oder nichtstr(s(x))[1:-1]in str(x+x)
(dank @xnor)[1,2,3,4]*false
zu einer leeren Liste kommt[]
[1,2,3,4]*true
führt zu[1,2,3,4]
quelle
lambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)
44 Byte verkürzen .Python, 83 Bytes
Dies wurde durch die anderen Python-Antworten beschämt, aber ich könnte es genauso gut posten. Ich mag das wirklich nicht
Teil. Gibt es eine schnellere Möglichkeit, die Liste zu durchlaufen?
quelle
l.append(l.pop(0))or g==l for _ in l
spart aber ein Byte gegenüber dem range-len Ansatz. Die Verwendung von alambda
würde 14 zusätzliche Bytes einsparen.MATLAB / Octave, 118 Bytes
quelle
input('')
. Vermeiden Sie auch unnötige Leerzeichen und Klammern! Und Sie können wieder einige Bytes verlieren, indem Sie zuerst definierenf=@issorted
.PowerShell v2 +,
87 bis80 ByteDurchläuft die Eingabeliste
$a
und überprüft jedes paarweise Element (einschließlich des letzten und des ersten), um festzustellen, ob es mehr als ein abnehmendes Paar gibt. Wenn das bestimmte Paar abnimmt, dekrementieren wir$c
. Gibt entweder die sortierte Liste oder ein einzelnes Element0
basierend auf dem Wert von aus$c
am Ende aus. Wenn mehr als ein "schlechtes" Paar vorhanden ist, ist++$c
es immer noch negativ, andernfalls ist es zumindest0
so, dass das zweite Element des Pseudoternärs ausgewählt wird ($a|sort
).Ich sehe, dass xnor etwas Ähnliches getan hat , aber ich habe es unabhängig erfunden .
quelle
Faktor 47 Bytes
Verbinden Sie die Sequenz mit sich selbst und prüfen Sie, ob die sortierte Wiedergabe des Originals eine Teilsequenz ist.
quelle
dup dup append \\ natural sort \\ dip subseq?
Passt sogar zum 4-4-3-Muster :)C ++, 313
359370BytesEin großes Dankeschön an @Qwertiy, dass sie das zum Laufen gebracht und mir einige großartige Golfmethoden beigebracht haben!
Golf gespielt:
Ungolfed:
quelle
using namespace std;
ist 20 Zeichen, wennstd::
6 mal 30 istbool s = False;
- warum nicht=0
? Sie können fallen lassenreturn 0;
. Warum stehen hier Klammern!s&&(c<=v.size())
?std::
undreturn 0;
) sind aus dem Programmierunterricht zur Gewohnheit geworden. Ich muss wirklich anfangen, meine Programme besser zu überprüfen.True
undFalse
statttrue
undfalse
. ideone.com/kVTI25 - Ihre Version, ideone.com/y8s44A - repariert und vorbereitet für die Golfversion .True
undFalse
ist aus Python. Ich wusste nicht mal, dass du so etwas schreiben kannstif
!Mathcad, TBD
In Mathcad ist 0 (Skalar) == false.
Die (äquivalente) Byteanzahl ist TBD, bis eine Zählmethode vereinbart wurde. Ca. 52 Byte bei Verwendung einer Byte = Operator / Symbol-Tastaturäquivalenz.
quelle
Mathematica
55 50 6158 BytesMit 3 Bytes gespart dank Martin Büttner.
Meine früheren Versuche haben den gesamten Testfall nicht bestanden. Ich musste hinzufügen
Union
, um Wiederholungen in der Liste zu vermeiden, die der Reihe nach eingegeben wurden.Tests
Erläuterung
Drehen Sie die Eingabeliste mit der rechten Maustaste von 1 zu
n
Mal, wobein
die Länge der Eingabeliste angegeben ist. Wenn die sortierte Eingabeliste zu den rotierten Ausgabelisten gehört, geben Sie sie zurück. Andernfalls geben Sie eine leere Liste zurück.quelle
@@
und/@
auf leeren Listen vertauscht .Join@@
sollte noch kürzer sein alsFlatten@
wenn.PHP, 98 Bytes
1
Gibt ein if driftsortable aus, sonst nichtsquelle