Hinweis: Diese Frage wurde stark bearbeitet, seit ich sie zum ersten Mal hier gepostet habe. Die Regeln wurden hierher verschoben . Lesen Sie sie, bevor Sie eine Antwort veröffentlichen, um den Zweck zu verstehen. Dies war die erste Frage, die in der Kategorie Code-Trolling erstellt wurde .
Stellen Sie sich einen faulen Benutzer bei Stack Overflow vor, der diese Frage stellt:
Ich brauche ein Programm, in dem der Benutzer ein Array von Doubles eingibt und das Programm das Array sortiert ausgibt. Könnten Sie bitte den Code angeben?
Wie können Sie einen Code erstellen, der diesen Benutzer trollt? Erstellen Sie einen Code, der für einen unerfahrenen Programmierer nützlich erscheint, in der Praxis jedoch völlig unbrauchbar ist.
Der Gewinner ist die am besten bewertete Antwort, es sei denn, die Antwort ist aus irgendeinem Grund nicht geeignet (Informationen zu den Teilnahmebedingungen finden Sie in der Beschreibung des Code-Trolling im Tag-Wiki ). Wenn die zuvor am häufigsten gewählte Antwort in Zukunft in Bezug auf die Anzahl der Stimmen nach dem Akzeptieren geschlagen wird, wird die neue beste Antwort akzeptiert und die vorherige Antwort wird nicht akzeptiert. Im Falle eines Unentschieden wähle ich den Gewinner nach Belieben aus den Unentschieden aus oder warte einfach ein bisschen länger.
Antworten ohne Code sind nicht zulässig. Sie mögen Spaß machen und ein paar Gegenstimmen bekommen, aber sie werden nicht akzeptiert.
Regeln finden Sie unter Tag-Beschreibung .
Hinweis: Dies ist eine Code-Trolling- Frage. Bitte nehmen Sie die Frage und / oder die Antworten nicht ernst. Mehr Infos hier .
quelle
Antworten:
Manchmal hilft die Gemeinde hier nicht gerne bei den Hausaufgaben. Deshalb bekommen Sie so viele Scherzantworten. Aber ich helfe gerne. Hier ist eine vollständige Lösung in 'C' (da ich davon ausgehe, dass Sie "Programmieren" lernen möchten, nicht "Skripten" mit Java oder Ruby). Ich habe viele Tipps beigefügt, von denen ich mir wünschte, ich hätte sie gewusst, als ich zum ersten Mal lernte
quelle
1st, 2th, 3th, 4th...
und für den Downto-Operator - sehr fortschrittliche C-Programmiertechniken.sscanf(input, "%5s", &input[0])
, da es sonst zu Überlauffehlern beim Parsen der Eingabe kommen kann. Die Eingabe sollte deklariert werdenchar input[sizeof(int)+1]
, um die Abwärtskompatibilität mit 64-Bit-Systemen zu gewährleisten.i==1?"st":"th"
hahaha ...Hier ist es in Java. Es ist ein völliger Betrug, inakzeptabel und unfixierbar, da es eine MySQL-Datenbank erstellt, die Nummer dort einfügt, eine Auswahl mit einer ORDER BY-Klausel vornimmt und die von MySQL angegebenen Nummern ausgibt. Tatsächlich ist es MySQL, das die Sortierung durchführt, nicht das Programm.
quelle
Es gibt keinen Kill wie Overkill
Zuallererst, lieber GiMmEtHaCoDeZ, versuchen wir, Ihre Aufgabe aufzuschlüsseln:
Da "Teilen und Erobern" eine sehr wichtige Strategie bei der Arbeit mit Softwareproblemen ist, können Sie diese nacheinander angehen
1. Lesen
Ein weiteres wichtiges Thema in der Software ist die Vielseitigkeit. Da nicht festgelegt ist, wie der Benutzer die Zahlen eingibt, kann dies über die Konsole, über eine Datei, über einen Webdienst usw. geschehen. Daher ist es wichtig, dass unsere Lösung verschiedene Eingabetypen unterstützt. Der einfachste Weg, dies zu erreichen, besteht darin, den wichtigen Teil einer Schnittstelle zu extrahieren
Wo
DoubleArrayReaderType
ist eine Aufzählung gegeben mitEs ist auch wichtig, die Software von Grund auf testbar zu machen, damit eine Implementierung der Schnittstelle möglich ist
Als nächstes ist die logische Frage, wie wir das entsprechende
IDoubleArrayReader
in den Code laden können . Das ist einfach, solange wir eine einfache Fabrik benutzen:Beachten Sie, dass wir Reflection verwenden, um alle aktiven Reader zu laden, sodass zukünftige Erweiterungen automatisch verfügbar sind. Im Hauptteil unseres Codes tun wir Folgendes:
2. Bearbeitung (Sortierung)
Nun müssen wir die erhaltenen Zahlen verarbeiten, dh sortieren. Beachten Sie, dass die Schritte völlig unabhängig voneinander sind, sodass es für das Sortiersubsystem unerheblich ist, wie die Zahlen eingegeben wurden. Darüber hinaus kann sich das Sortierverhalten ändern, z. B. müssen wir möglicherweise einen effizienteren Sortieralgorithmus eingeben. Daher extrahieren wir natürlich das angeforderte Verarbeitungsverhalten in einer Schnittstelle:
Und das Sortierverhalten implementiert nur die Schnittstelle:
Natürlich benötigen wir eine Factory, um die Verarbeitungsinstanzen zu laden und zu verwalten.
3. Schreiben Sie die Ausgabe
Hier gibt es nicht viel zu sagen, da dies ein Prozess ist, der die Eingabe widerspiegelt. Tatsächlich könnten wir die Lese- und Schreibfabriken in einer einzigen kombinieren
DoubleArrayInputOutputFactory
:Alles zusammen
Schließlich wird unser Hauptprogramm nur all diese beeindruckenden Eigenschaften nutzen, die wir bereits erstellt haben. Der Code wird also einfach sein:
wo, zum Beispiel könnten wir definieren
reader
,writer
undprocessor
mitquelle
Noch wörtlichere Interpretation:
das heißt, "das Array" sortiert.
quelle
sort.sh
und anrufen alssh sort.sh "an array of doubles"
"an array of doubles"
kann als Befehlszeilenargument an das Skript übergeben werden.Perl
Von all den Dingen, die ich für CodeGolf.SE gemacht habe, hat dies wahrscheinlich die meiste Zeit in Anspruch genommen, zumindest ein paar Stunden.
Eingabe ist von der Form
[2,4,5,7,7,3]
und Ausgabe ist von der Form[2,3,4,5,7,7]
.Ich habe jetzt keine Zeit zu erklären ... komme später wieder.Jedenfalls gibt es in Perl so etwas wie ein anonymes Array. Es ist ein Array, aber es hat keinen Namen. Was wir jedoch wissen, ist eine Referenz (Speicherstelle), die darauf verweist. Eine Reihe von Zahlen in eckigen Klammern erstellt ein anonymes Array und gibt einen Verweis darauf zurück.
Diese Antwort basiert auf einer Reihe anonymer Arrays, in denen Verweise gespeichert sind
@_
. Die Eingabe wird in ein anonymes Array umgewandelt. Anschließend erstellen wir andere anonyme Arrays, von denen jedes Element auf ein Element im vorherigen Array verweist. Anstatt die Elemente im Array zu sortieren, sortieren wir die Zeiger auf die Elemente in diesem Array. Außerdem erstellen wir ein neues Array für jeden Schritt (und mehr) in der Sortieroperation.quelle
$_
an dieser Stelle eigentlich eine leere Zeichenfolge. Ich habe meine gewünschte Ausgabe in gespeichert$\
, dem Trennzeichen für Ausgabedatensätze.Python
Gibt dem Benutzer ein sortiertes Array, indem alle nicht sortierten Elemente aus dem Eingabearray entfernt werden.
Der Algorithmus geht die Liste nur durch und fügt jedes Element hinzu, wenn die Liste dadurch nicht unsortiert wird. Die Ausgabe ist also eine sortierte Liste, nur keine, die alle Elemente der ursprünglichen Liste enthält. Wenn der op nur prüft, ob die Liste in sortierter Reihenfolge ist, bemerkt er möglicherweise nicht, dass in der Ausgabe Werte fehlen.
quelle
sys.stdin.read()
einen Tippfehler oder um einen Teil der echten Trolling-Antwort? Sicherlich würde es das OP frustrieren, das Array als Eingabe zu geben und weiterhin auf das Ergebnis zu warten ...O(n)
Sortieralgorithmus. Nett.Bash, 54 Zeichen
Viele Antworten in langsamen, ineffizienten Sprachen wie C und Python ... lassen Sie uns die Sache etwas beschleunigen, indem wir eine Lösung für alle Skriptsprachen anbieten: Bash.
Ich weiß, was Sie denken - Bash kann nicht einmal mit Fließkomma-Arithmetik umgehen, also wie wird es sortiert, richtig? Nun, siehe, meine Implementierung des mächtigen SleepSort-Algorithmus:
Das Programm erhält Eingaben als Kommandozeilenargumente. Probelauf:
Dies hat auch den Vorteil, dass es vielleicht der kürzeste aller hier vorgestellten Arbeitsalgorithmen ist. Das ist richtig - eine mächtige Bash-Zeile , die nur Bash-Builtins verwendet und keine externen Binärdateien aufruft (das heißt, wenn Sie die rein optionale ausführliche Ausgabe nicht mitzählen). Im Gegensatz zu den Bogosorten ist die Laufzeit deterministisch.
Tipp: Eine effektive Optimierung besteht darin, die eingegebenen Zahlen vor dem Sortieren durch einen Faktor zu teilen. Die Umsetzung bleibt dem Leser überlassen.
Bearbeiten:
Verkürzte 54-Zeichen-Golfversion mit weniger hübschem Druck:
quelle
/proc/cpuinfo
.JavaScript hat eine eingebaute
sort()
Funktion, die Sie folgendermaßen verwenden können:... oh, ganz vergessen zu erwähnen, es sortiert in lexikographischer Reihenfolge, dh
10 < 9
und9 < -100
. Wahrscheinlich ist es das, was Sie sowieso erwarten.quelle
(jPL) jQuery-Programmiersprache
Sie müssen dafür jQuery verwenden. Eine einfache Lösung für dieses Problem ist die folgende:
quelle
$
, Arrays mita
und Ergebnisse vonwindow.prompt
as gekennzeichnet sindp
.C
Diese Lösung kombiniert die Prägnanz und den Zugriff auf Betriebssystemebene von C mit den leistungsstarken, wiederverwendbaren Softwarekomponenten in GNU / Linux:
quelle
#!/usr/bin/sort
.Rubin
Ziemlich selbsterklärend.
Oder erfordern, dass die Eingabe tatsächlich "ein Array von Doubles" ist:
Nicht
gets.chomp
für zusätzliches Übel verwenden. Auch mit Regex nach dem Schleppen bis, was ich nicht einmal wusste, dass Sie tun können (danke Jan Dvorak), um OP noch mehr zu verwirren!quelle
an array of doubles
.gets
anstelle von verwendengets.chomp
).Python3.3
Das Trolling besteht darin, eine perfekt funktionierende Lösung bereitzustellen, die genau das tut, was das OP beabsichtigt hat, aber auf eine Art und Weise, die:
Zusammenfassend lässt sich sagen, dass diese Antwort die Frustration des Schülers über die Verspottung seiner Anfragen mit unter bestimmten Gesichtspunkten zutreffenden Antworten erheblich erhöhen würde.
(Lesen Sie nicht, wenn Sie eine Herausforderung in Betracht ziehen, den obigen Code zu verstehen.)
Ich muss hinzufügen, dass das Trolling auch durch die Tatsache erhöht wird, dass der implementierte Sortieralgorithmus tatsächlich ist
quelle
C - Langsamer, schwer zu verwendender, inakzeptabler Codierungsstil
Der Sortieralgorithmus selbst ist als langsame Sortierung bekannt und weist eine Best-Case-Komplexität (Einfachheit) von etwa n ^ (log n / 2) auf . Der Algorithmus wurde von Andrei Broder und Jorge Stolfi in ihrem großartigen Aufsatz "Pessimal Algorithms and Simplexity Analysis" veröffentlicht, den ich für gute Lacher und Denkanstöße sehr empfehle.
Die Sortierung selbst ist jedoch unbrauchbar. Daher benötigen wir eine Möglichkeit für den Benutzer, die Daten einzugeben, die sortiert werden sollen. Das Parsen von Doubles ist schmerzhaft. Warum also nicht byteweise eingeben?
Um zu beweisen, dass es funktioniert:
Am Ende haben wir:
quelle
Rubin, böser Bogosort! (Bonus: Bogosort durch Benutzereingabe)
Die "bösen" Wendungen:
.map &:to_f
an die zweite Zeile angehängt behoben werden , aber OP weiß das möglicherweise nichtchomp
Wenn die letzte Nummer nicht verwendet wird , wird am Ende eine mysteriöse Zeile eingefügtstrip
Wird diese Option nicht verwendet , werden Zahlen mit einem mysteriösen Leerzeichen um Kommas herum eingegeben (z. B. das Leerzeichen in1.5, 2
).Oder wie wäre es mit einer Fehlsortierung durch Benutzereingaben ?! >: D
quelle
COBOL
Sicher! "Sogar ein Affe kann das!"
Hier ist ein einfaches COBOL-Programm , das die Eingabe für Sie sortiert. Lesen Sie die Kommentare, um genau zu sehen, wie trivial und erweiterbar es ist. Die wirklichen Vorteile davon sind, dass es sich um einen bewährten Mechanismus handelt, der nicht auf neuen und relativ ungetesteten Sprachen wie Java und irgendetwas Web-basiertem oder von Microsoft basiert. Es lässt sich sehr effektiv kompilieren und Verfahren wie dieses werden von den erfolgreichsten Finanzunternehmen der Fortune500 und anderen Branchenführern eingesetzt. Dieser Code wurde von vielen Experten überprüft und gilt als ausgezeichneter Sortiermechanismus.
quelle
OP hat nie gesagt, wie man sie sortiert ... oder was seine Definition von Doppeln ist. Datentyp annehmen,
double
aber als Duplikat interpretieren . Verwenden Sie hier JavaScript.Ergebnis: abwechselnde Reihenfolge
[4, 11, 4, 9, 5, 7, 6, 7]
quelle
PHP
Hier ist eine vollständige Implementierung mit Fehlerbehandlung. Es ist das schnellste für alle
array of doubles
.quelle
Bei der nächsten Permutation in C ++ wird true zurückgegeben, wenn das Array sortiert ist, andernfalls false (nachdem es permutiert hat). Sie sollten also das Array sortieren und es dann in einer Übung wie oben verwenden (damit ein vollständiger Kreis zurück zum sortierten Array entsteht).
quelle
next_permutation
für meine Antwort zu verwenden, aber das ist viel sauberer, als ich es mir vorgestellt habe.[Lösung durch pünktliche Fehlleitung]
Bitte lesen Sie die entsprechende Norm, IEC 60559: 1989 Spezifikation für binäre Gleitkomma-Arithmetik für Mikroprozessorsysteme , die Sie hier erwerben können . In der Fußnote zu §5.10 Details des totalOrder-Prädikats wird Folgendes angegeben:
Wir sehen also, dass es unmöglich ist, Code zu schreiben, um Doppelte zu sortieren. Es ist eine Trickfrage. Ha, ha, sehr schlau! Bitte sagen Sie Ihrem Professor, dass ich seinen Kurs sehr genieße.
[edit: nichts setzt voraus, dass ich nicht annehme, dass das Problem eine Gesamtbestellung erfordert]
quelle
Ein böses JavaScript:
OP, ich möchte Ihnen nicht alles geben, also überlasse ich Ihnen, wie Sie selbst Eingaben vom Benutzer erhalten (Hinweis: Verwenden
prompt
).Sobald Sie das haben, ist hier eine Funktion, in die Sie Ihr Array übergeben können, um es zu sortieren. Sie müssen nur das Array, den niedrigsten Wert im Array und ein Inkrement angeben:
Hier ist eine kleine Übung, um es anhand der Benutzereingaben [1.5, -3.5, 12, 10, -19.5] in Aktion zu sehen.
Hinweis: Abgesehen davon, dass das vorliegende Problem eine schlechte Leistung, Komplexität und Erweiterbarkeit aufweist, ist dies besonders frustrierend, wenn das OP keine Kenntnisse über Gleitkomma-Mathematik besitzt. Wenn beispielsweise die Benutzereingabe lautet
[8.1, 5, -.8, 2.3, 5.6, 17.9]
und das OP die einfachen Werte (dhminimumVal=-.8
undincrement=.1
) auswählt , wird das Programm für immer ausgeführt. In diesem Zusammenhang bin ich derzeit der stolze Besitzer von 2 nicht funktionierenden Browser-Registerkarten aufgrund dieses Problems :)Anmerkung II: Ich fand es ekelhaft, den obigen Code zu schreiben.
Anmerkung III: MWA HAHAHAHA!
quelle
Hier ist eine tatsächliche Antwort , die ich für Java mag:
Keine Erklärung, verwirrt das OP , funktioniert aber und wird von erfahreneren Programmierern positiv bewertet.
Eine andere ähnliche Antwort :
Fordern Sie das OP indirekt auf, seine eigenen Nachforschungen anzustellen, und geben Sie ihm eine vage richtige Antwort. Ohne weitere Nachforschungen ist das OP immer noch verwirrt . Mir gefällt auch, dass der Link auf ältere Dokumentationen verweist.
quelle
Genetischer Algorithmus / Monte-Carlo-Methode für das Sortierproblem in JAVA
Das Sortierproblem ist der Informatik seit langem bekannt und es wurden viele gute Lösungen gefunden. In den letzten Jahren wurden große Fortschritte im Bereich Biocomputing erzielt, und die Untersuchung, wie die Biologie Probleme löst, hat sich als große Hilfe bei der Lösung schwerer Probleme erwiesen. Dieser Sortieralgorithmus verwendet die besten dieser Ideen, um das Sortierproblem zu lösen. Die Idee ist ziemlich einfach. Sie beginnen mit einem ungeordneten Array und finden heraus, wie sortiert dieses bereits ist. Sie geben ihm eine Bewertung seiner "Sortierbarkeit" und verteilen dann eine zufällige Komponente auf das Array - genau wie in der Biologie, wo es nicht klar ist, wie die Kinder aussehen werden, selbst wenn Sie alles über die Eltern wissen! Dies ist der genetische Algorithmus-Teil. Sie erschaffen sozusagen die Nachkommen dieses Arrays. Dann sehen Sie, ob die Nachkommen besser sortiert sind als die Eltern (auch bekannt als Überleben der Stärkeren!). Wenn dies der Fall ist, fahren Sie mit diesem neuen Array als Ausgangspunkt fort, um die nächste Permutation usw. zu erstellen, bis das Array vollständig sortiert ist. Das Coole an diesem Ansatz ist, dass es kürzer dauert, wenn das Array bereits von Anfang an ein bisschen sortiert ist!
Extras
quelle
Python
Sortiert die Array (Liste) durch die Summe der 3 rd und 5 th Dezimalstellen.
quelle
lambda x:
und durch ersetzt wirdx
. Trotzdem würde ein Anfänger-Programmierer das nie erfahren, also ein dickes Lob!C ++
Das funktioniert ... irgendwann.
Hier ist mein Sortieralgorithmus:
Hier ist das vollständige Programm:
quelle
Hier, genieße deine Augen:
Dieser Code zeigt das Array an und fordert den Benutzer auf, das kleinste Double des Arrays einzugeben. Anschließend wird die Nummer zur Liste der sortierten Nummern hinzugefügt, das Double aus dem Array entfernt und die verbleibenden Array-Nummern angezeigt.
* Fehlinterpretation: Schwachstelle, aber das OP erwartet nicht genau, dass das Programm den Benutzer auffordert, beim Sortieren zu helfen.
* Schummeln: Der Benutzer ist derjenige, der die eigentliche Sortierung vornimmt.
* Leistung: Für jede Nummer des Arrays ist ein Server-Roundtrip erforderlich, und der Benutzer muss die kleinste Nummer manuell ermitteln. Die Leistung kann nicht viel schlechter werden.
* Inakzeptabel: Ich denke, ich habe das abgedeckt. Und viel Glück bei der Wiederverwendung. Im schlimmsten Fall könnte der Benutzer 90% des Codes loswerden und wiederholt durchlaufen, um die kleinsten Werte zu finden und sie jedes Mal zu entfernen, was ihm einen der am wenigsten effizienten Sortieralgorithmen geben würde.
* Kreativ und böse: du sagst es mir.
quelle
Javascript Intelligent Design Sort
quelle
Python - req. # 1
Dieser Code sortiert die Doppelseiten in lexikographischer Reihenfolge, anstatt die numerische Reihenfolge zu erhöhen, indem er einen Präfixbaum von Ziffern erstellt und diese dann rekursiv durchläuft.
Es funktioniert
n log n
pünktlich und ist in der Tat eine clevere Möglichkeit, eine sortierte Liste zu führen, aber leider ist es für das OP völlig falsch.quelle
2, 1, 3, 8, 5
.Sortiert das Array von Doubles. In Java:
Zum Beispiel:
[0.0, 1.5, 123]
geht aus der unsortierten binären Darstellung von
011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000
zu den elegant sortierten
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111
quelle
Edit per @kealist, ich denke, es ist besser, wenn kommentiert, um die Kluft plausibel erscheinen zu lassen. In Rebol ...
Man spielt die Idee ab, dass sie nicht wirklich wissen, was ein Double ist, und könnte glauben, dass eine Liste von Double nur eine Reihe von Zahlen ist, die mit zwei multipliziert werden.
quelle
Absichtliches Missverständnis der Frage:
Verwenden eines rekursiven Ansatzes:
Das sortierte Array wird garantiert irgendwann ausgegeben, für jeden Datentyp im Array, sogar für jede Sortierreihenfolge und sogar für jede Art von Trennzeichen für die Eingabe, was diesen Ansatz äußerst flexibel macht. Der Hauptnachteil ist, dass es für große Arrays etwas langsam ist, aber Sie können das mit Multithreading leicht lösen.
quelle