Remarque: cette question a été sérieusement modifiée depuis que je l'ai postée pour la première fois ici. Les règles ont été déplacées ici , lisez-les avant de poster toute réponse pour comprendre le but de cette opération. Ce fut la première question créée dans la catégorie code-trolling .
Imaginez un utilisateur paresseux sur Stack Overflow pose la question suivante:
J'ai besoin d'un programme où l'utilisateur entre un tableau de doubles et le programme sort le tableau trié. Pourriez-vous s'il vous plaît donner le code?
Comment pouvez-vous créer un morceau de code qui va traîner cet utilisateur? Créez un morceau de code qui paraîtra utile pour un programmeur inexpérimenté mais qui est totalement inutile en pratique.
Le gagnant est la réponse la plus votée, sauf si la réponse n’est pas éligible (pour les conditions d’éligibilité, consultez la description de la balise wiki de code-trolling ). Si la réponse précédemment la plus votée est battue à l'avenir dans le nombre de votes positifs après son acceptation, la nouvelle meilleure réponse est acceptée et la précédente est refusée. En cas d'égalité, je choisirai le vainqueur à volonté parmi ceux à égalité ou j'attendrai un peu plus.
Les réponses sans code ne sont pas éligibles. Ils pourraient être amusants et obtenir des votes positifs, mais ils ne seront pas acceptés.
Les règles peuvent être trouvées à la description de la balise .
Remarque: il s'agit d'une question à la traîne de code . S'il vous plaît ne prenez pas la question et / ou les réponses au sérieux. Plus d'informations ici .
la source
Réponses:
Parfois, la communauté ici n'aime pas aider à faire ses devoirs. C'est pourquoi vous obtenez tant de réponses à la blague. Mais j'aime aider. Voici une solution complète en 'C' (puisque je suppose que vous voulez apprendre la "programmation", pas le "script" avec Java ou Ruby). J'ai inclus de nombreux conseils que j'aurais aimé connaître lors de mon premier apprentissage
la source
1st, 2th, 3th, 4th...
et l'opérateur downto - techniques de programmation C très avancées.sscanf(input, "%5s", &input[0])
, sinon il pourrait y avoir des bogues de dépassement lors de l'analyse de l'entrée. Et l'entrée doit être déclaréechar input[sizeof(int)+1]
, pour assurer la compatibilité ascendante avec les systèmes 64 bits.i==1?"st":"th"
hahaha ...La voici en java. C'est une tricherie totale, inacceptable et non corrigible car cela crée une base de données MySQL, y insère le numéro, effectue une sélection avec une clause ORDER BY et affiche les numéros donnés par MySQL. En fait, c'est MySQL qui fait le tri, pas le programme.
la source
C # - Il n'y a pas de mort comparable à l'overkill
Tout d’abord, cher GiMmEtHaCoDeZ, essayons de décomposer votre tâche:
Comme "Diviser et conquérir" est une stratégie très importante lorsque vous travaillez avec des problèmes logiciels, abordons-les un à la fois.
1. lecture
Un autre problème important dans le logiciel est la polyvalence. Comme il n’est pas spécifié comment l’utilisateur entrera les chiffres, cela peut se faire via la console, via un fichier, via un service Web, etc. Peut-être même une méthode à laquelle nous ne pouvons pas penser pour le moment. Il est donc important que notre solution puisse prendre en charge différents types de saisie. Le moyen le plus simple d'y parvenir consiste à extraire la partie importante d'une interface, disons
où
DoubleArrayReaderType
est une énumération donnée avecIl est également important de rendre le logiciel testable à partir de la base, de sorte qu'une implémentation de l'interface sera
Ensuite, la question logique est de savoir comment nous saurons charger
IDoubleArrayReader
le code approprié . C'est facile tant que nous utilisons une usine simple:Notez que, comme nous utilisons la réflexion pour charger tous les lecteurs actifs, toutes les extensions futures seront automatiquement disponibles. Maintenant, dans le corps principal du code externe, nous ne faisons que:
2. Traitement (tri)
Nous devons maintenant traiter, c'est-à-dire trier les nombres que nous avons acquis. Notez que les étapes sont complètement indépendantes les unes des autres, donc, pour le sous-système de tri, la façon dont les nombres ont été entrés n'a pas d'importance. De plus, le comportement de tri est également sujet à modification, par exemple, nous pourrions avoir besoin de mettre en place un algorithme de tri plus efficace. Alors, naturellement, nous allons extraire le comportement de traitement demandé dans une interface:
Et le comportement de tri implémentera simplement l'interface:
Bien entendu, nous aurons besoin d’une usine pour charger et gérer les instances de traitement.
3. Écrire la sortie
Il n’ya pas grand chose à dire ici, car c’est un processus qui reflète l’entrée. En fait, nous pourrions combiner les usines de lecture et d’écriture en une seule
DoubleArrayInputOutputFactory
, comme ceci:Mettre tous ensemble
Enfin, notre programme principal utilisera simplement toute cette génialité que nous avons déjà construite. Le code sera donc simplement:
où, par exemple, nous pourrions définir
reader
,writer
et enprocessor
utilisantla source
Une interprétation encore plus littérale:
c'est-à-dire, "le tableau" trié.
la source
sort.sh
et appeler en tant quesh sort.sh "an array of doubles"
"an array of doubles"
peut être passé au script en tant qu'argument de ligne de commande.Perl
Parmi toutes les choses que j'ai faites pour CodeGolf.SE, cela a probablement pris le plus de temps, au moins quelques heures.
L'entrée est de la forme
[2,4,5,7,7,3]
et la sortie est de la forme[2,3,4,5,7,7]
.Je n'ai pas le temps de t'expliquer maintenant ... reviens plus tard.Quoi qu'il en soit, il y a quelque chose appelé un tableau anonyme en Perl. C'est un tableau, mais il n'a pas de nom. Ce que nous savons, cependant, est une référence (emplacement mémoire) qui pointe vers elle. Une série de nombres entre crochets crée un tableau anonyme, auquel il renvoie une référence.
Cette réponse est construite à partir d’une série de tableaux anonymes, dont les références sont stockées dans
@_
. L'entrée est transformée en tableau anonyme. Nous créons ensuite d'autres tableaux anonymes, dont chaque élément est une référence à un élément du tableau précédent. Au lieu de trier les éléments du tableau, nous trions les pointeurs sur les éléments de ce tableau. Nous créons également un nouveau tableau pour chaque étape (et plus) de l'opération de tri.la source
$_
c'est une chaîne vide à cet endroit. J'ai enregistré la sortie souhaitée dans$\
le séparateur d'enregistrement de sortie.Python
Donne à l'utilisateur un tableau trié en supprimant tous les éléments non triés du tableau en entrée.
L'algorithme parcourt la liste en ajoutant uniquement chaque élément s'il ne rend pas la liste non triée. Ainsi, le résultat est une liste triée, mais pas une liste contenant tous les éléments de la liste originale. Si l'op vérifie simplement si la liste est triée, il ne remarquera peut-être pas qu'il manque des valeurs dans la sortie.
la source
sys.stdin.read()
une faute de frappe ou fait-il partie de la vraie réponse à la traîne? Il serait certainement frustrant pour le PO de donner le tableau en entrée et de continuer à attendre le résultat ...O(n)
algorithme de tri. Agréable.Bash, 54 caractères
Beaucoup de réponses utilisant des langages lents et inefficaces comme C et Python ... accélérons un peu les choses en offrant une solution dans la mère de tous les langages de script: Bash.
Je sais ce que vous pensez - Bash ne peut même pas gérer l'arithmétique en virgule flottante, alors comment va-t-il trier, n'est-ce pas? Eh bien, voici ma mise en œuvre du puissant algorithme SleepSort:
Le programme est fourni avec une entrée en tant qu'argument de ligne de commande. Échantillon échantillon:
Cela a également l’avantage d’être peut-être le plus court des algorithmes de travail présentés ici. C'est vrai - une puissante ligne de bash , utilisant uniquement les commandes intégrées bash et n'appelant aucun fichier binaire externe (c'est-à-dire, si vous ne comptez pas la sortie purement facultative et détaillée). Contrairement aux bogosorts, son runtime est déterministe.
Conseil: Une optimisation efficace consiste à diviser les nombres saisis par un facteur avant le tri. L'implémentation est laissée au lecteur.
Modifier:
Version de golf 54 caractères réduite avec moins de jolies impressions:
la source
/proc/cpuinfo
.JavaScript a une
sort()
fonction intégrée, vous pouvez l'utiliser comme ceci:... oh, j'ai complètement oublié de mentionner, cela trie par ordre lexicographique, c'est à dire
10 < 9
et9 < -100
. C'est probablement ce que vous attendez de toute façon.la source
(jPL) Langage de programmation jQuery
Vous devez utiliser jQuery pour cela. Une solution simple à ce problème est la suivante:
la source
$
, les tableaux en utilisanta
et les résultats dewindow.prompt
asp
.C
Cette solution combine la concision et l’accès au système d'exploitation fourni par C avec les puissants composants logiciels réutilisables de GNU / Linux:
la source
#!/usr/bin/sort
.Rubis
Assez explicite.
Ou demander que l’entrée soit réellement "un tableau de doubles":
Ne pas utiliser
gets.chomp
pour plus de méchanceté. Également utiliser regex après le trailing jusqu'à, ce que je ne savais même pas que vous pouviez faire (merci Jan Dvorak) pour confondre OP encore plus!la source
an array of doubles
.gets
au lieu degets.chomp
).Python3.3
La pêche à la traîne consiste à fournir une solution parfaitement opérationnelle qui fait exactement ce que le PO voulait, mais d'une manière qui:
En résumé, cette réponse augmenterait considérablement la frustration de l'étudiant qui se moquait de leurs demandes avec des réponses parfaitement valables d'un certain point de vue.
(Ne lisez pas si vous considérez comme un défi la compréhension du code ci-dessus)
Je dois ajouter que la pêche à la traîne est également accrue par le fait que l’algorithme de tri mis en œuvre est en réalité
la source
C - Style de codage lent, difficile à utiliser et inacceptable
L'algorithme de tri lui-même est connu sous le nom de slowsort et présente une complexité de cas optimale (simplexité) d'environ n ^ (log n / 2) . L'algorithme a été publié par Andrei Broder et Jorge Stolfi dans leur excellent article intitulé "Algorithmes pessimaux et analyse de la simplexité", que je recommande vivement pour des rires amusants ET des pistes de réflexion.
Cependant, le tri lui-même est inutile, nous avons donc besoin d'un moyen pour l'utilisateur de saisir les données qu'il souhaite trier. L'analyse des doublons est pénible, alors pourquoi ne pas les entrer octet par octet.
Pour prouver que cela fonctionne:
Au final nous avons:
la source
Ruby, le mal Bogosort! (Bonus: bogosort par entrée utilisateur)
Le "diable" se tord:
.map &:to_f
ajoutant à la deuxième ligne, mais OP peut ne pas savoir quechomp
si le dernier numéro a une fin de ligne mystérieuse à la finstrip
il y a donc des espaces blancs mystérieux autour des nombres si les caractères sont séparés par des virgules (ex. L'espace1.5, 2
)Ou, que diriez-vous de bogosorting par l' utilisateur ?! >: D
la source
COBOL
Sûr! "Même un singe peut faire ça!"
Voici un programme COBOL simple qui triera l’entrée pour vous. Lisez les commentaires pour voir à quel point c'est extensible et trivial. Le véritable avantage de ce logiciel réside dans le fait qu’il s’agit d’un mécanisme éprouvé qui ne repose pas sur des langages nouveaux et relativement peu testés, tels que Java et tous les langages Web ou de Microsoft. Il compile très efficacement et les procédures de ce type sont utilisées par les sociétés financières les plus prospères de Fortune500 et par d’autres leaders du secteur. Ce code a été révisé par de nombreux experts et est reconnu comme étant un excellent mécanisme de tri.
la source
OP n'a jamais dit COMMENT les trier ... ou quelle était sa définition des doubles. En supposant que le type de données soit
double
interprété comme un doublon . Utiliser JavaScript ici.Résultat: ordre alternatif
[4, 11, 4, 9, 5, 7, 6, 7]
la source
PHP
Voici une implémentation complète avec gestion des erreurs. C'est le plus rapide pour tous
array of doubles
.la source
La permutation suivante en C ++ fonctionne en renvoyant true lorsque le tableau est trié et false sinon (après permutation). Donc, vous êtes censé trier le tableau et l'utiliser ensuite dans un do-while comme ci-dessus (ainsi, le cercle complet sera renvoyé au tableau).
la source
next_permutation
pour ma réponse, mais c'est beaucoup plus propre que ce que j'avais en tête.[solution par mauvaise direction ponctuelle]
Veuillez lire la norme correspondante, IEC 60559: 1989, Spécification pour l’arithmétique binaire en virgule flottante pour les systèmes à microprocesseur , que vous pouvez acheter ici . Dans la note de bas de page relative au §5.10 Détails du prédicat totalOrder , il est noté que:
Nous voyons donc qu'il est impossible d'écrire du code pour trier les doublons. C'est une question piège. Ha, ha, très intelligent! S'il vous plaît dites à votre professeur que j'apprécie beaucoup son cours.
[edit: rien ne m'oblige à ne pas supposer que le problème demande un ordre total]
la source
Un JavaScript maléfique:
OP, je ne veux pas tout vous donner, alors je vous laisse comprendre comment obtenir vous-même les commentaires de l'utilisateur (indice: utilisation
prompt
).Une fois que vous avez cela, voici une fonction dans laquelle vous pouvez passer votre tableau pour le trier. Vous devez simplement fournir le tableau, la valeur la plus basse du tableau et un incrément:
Voici un violon pour le voir en action avec l'exemple de saisie utilisateur [1.5, -3.5, 12, 10, -19.5].
Remarque: en plus d'être peu performant, complexe et non extensible au problème à résoudre, cela sera particulièrement frustrant si le PO ne connaît pas le calcul en virgule flottante. Par exemple, si l'entrée utilisateur est
[8.1, 5, -.8, 2.3, 5.6, 17.9]
et que le PO choisit les valeurs simples (ieminimumVal=-.8
etincrement=.1
), le programme sera exécuté à tout jamais. Sur une note connexe, je suis actuellement l'heureux propriétaire de 2 onglets de navigateur qui ne fonctionnent pas à cause de ce problème :)Note II: Je me sentais dégoûtant même en écrivant le code ci-dessus.
Remarque III: MWA HAHAHAHA!
la source
Voici une réponse que j'aime bien pour Java:
Aucune explication, confond le PO , mais fonctionne et obtiendra des votes positifs de programmeurs plus expérimentés.
Une autre réponse similaire :
Indiquant indirectement au PO de faire ses propres recherches tout en lui donnant une réponse correcte et vague. Sans autre recherche, le PO reste confus . J'aime aussi le fait que le lien pointe vers une documentation plus ancienne.
la source
Algorithme génétique / méthode de Monte Carlo pour le problème de tri en JAVA
Le problème du tri est connu de l’informatique depuis longtemps et de nombreuses bonnes solutions ont été trouvées. Au cours des dernières années, la bio-informatique a beaucoup progressé et il a été démontré que la résolution des problèmes par la biologie était très utile pour résoudre des problèmes difficiles. Cet algorithme de tri utilise le meilleur de ces idées pour les utiliser afin de résoudre le problème de tri. l'idée est plutôt simple. Vous commencez avec un tableau non ordonné et découvrez comment le tri est déjà effectué. Vous lui attribuez une note de "tri" puis permutez le tableau avec une composante aléatoire - comme en biologie où il n’est pas clair à quoi ressembleront les enfants, même si vous savez tout sur les parents! C'est la partie algorithme génétique. Vous créez la progéniture de ce tableau pour ainsi dire. Ensuite, vous voyez si la progéniture est mieux triée que le parent (ou survie du plus apte!). Si tel est le cas, vous continuez avec ce nouveau tableau comme point de départ pour construire la permutation suivante et ainsi de suite jusqu'à ce que le tableau soit entièrement trié. La bonne chose à propos de cette approche est que cela prend plus court, si le tableau est déjà un peu trié depuis le début!
Suppléments
la source
Python
Trie le tableau (liste) par la somme des 3 ème et 5 ème places décimales.
la source
lambda x:
et en le remplaçant parx
. Pourtant, un codeur débutant ne le saura jamais, alors bravo!C ++
Cela fonctionne ... finalement.
Voici mon algorithme de tri:
Voici le programme complet:
la source
Ici, régalez vos yeux:
Ce morceau de code affiche le tableau et demande à l'utilisateur d'entrer le plus petit double du tableau. Il ajoute ensuite le nombre à la liste des nombres triés, supprime le double du tableau et affiche les autres numéros.
* Mauvaise interprétation: point faible, mais le PO ne s'attend pas exactement à ce que le programme demande à l'utilisateur de l'aider à trier.
* Triche: l'utilisateur est celui qui fait le tri.
* Performances: chaque numéro de la baie de disques requiert un aller-retour sur un serveur et oblige l'utilisateur à rechercher manuellement le plus petit nombre. La performance ne peut pas être pire.
* Inacceptable: je pense avoir couvert ça. Et bonne chance pour le réutiliser. Dans le pire des cas, l'utilisateur pourrait se débarrasser de 90% du code et effectuer une boucle répétitive pour trouver les plus petites valeurs et les supprimer à chaque fois, ce qui lui donnerait l'un des algorithmes de tri les moins efficaces.
* Créatif et diabolique: tu me le dis.
la source
Javascript Intelligent Design Sort
la source
Python - req. #1
Ce code triera les doubles dans l'ordre lexicographique plutôt que dans l'ordre croissant, en créant un arbre de préfixes de chiffres, puis en effectuant une itération récursive.
Cela fonctionne dans le
n log n
temps et est en fait un moyen intelligent de conserver une liste triée sinon, mais malheureusement pour le PO, il fait complètement la mauvaise chose.la source
2, 1, 3, 8, 5
.Trie le tableau des doubles. En Java:
Par exemple:
[0.0, 1.5, 123]
va de la représentation binaire non triée de
011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000
à l'élégant trié
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111
la source
Edit par kealiste, je suppose que c'est mieux si commenté pour rendre la division sembler plausible. Dans Rebol ...
En jouant sur l’idée qu’ils ne savent pas vraiment ce qu’est un doublon, ils pourraient croire qu’une liste de doublons n’est qu’un tas de chiffres multipliés par deux.
la source
Délibérément mal comprendre la question:
En utilisant une approche récursive:
Il est garanti que le tableau trié sera sorti à un moment donné, pour tout type de données du tableau, même tout type d'ordre de tri et même tout type de séparateur pour l'entrée, ce qui rend cette approche extrêmement flexible. Son principal inconvénient est qu’il est un peu lent pour les tableaux de grande taille, mais vous pouvez le résoudre facilement avec le multithreading.
la source