Dropsort , conçu par David Morgan-Mar, est un exemple d'un "algorithme de tri" à temps linéaire qui produit une liste qui est en fait triée, mais ne contient que certains des éléments d'origine. Tout élément qui n’est pas au moins aussi grand que le maximum des éléments qui le précèdent est simplement supprimé de la liste et supprimé.
Dans cette tâche, vous recevrez une liste d'entiers en entrée (STDIN ou argument de fonction, vous devez prendre en charge au moins la plage des entiers signés 8 bits.) Votre tâche consiste à les triper, puis à afficher les éléments restants dans ordre.
Vous pouvez supposer que la liste est non vide.
C'est du code golf, donc le programme le plus court gagne.
Cas de test
Input Output
1 2 5 4 3 7 1 2 5 7
10 -1 12 10 12
-7 -8 -5 0 -1 1 -7 -5 0 1
9 8 7 6 5 9
10 13 17 21 10 13 17 21
10 10 10 9 10 10 10 10 10
Classement
var QUESTION_ID=61808,OVERRIDE_USER=39022;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code-golf
array-manipulation
sorting
SuperJedi224
la source
la source
highest < current
? Ouhighest <= current
?highest (so far)<=current
.Réponses:
APL, 9 octets
Il s'agit d'un train de fonctions monadique avec diagramme:
La version non-train est
Cela vérifie fondamentalement si chaque élément est égal au maximum courant.
Notez que la solution J de Martin Büttner a la même longueur et a été publiée en premier.
la source
J,
109 octetsVersion de travail de mon idée CJam (en moins d'octets). Par exemple:
Explication
Tout d'abord, nous obtenons le maximum de chaque préfixe, avec:
(Ici,
>.
l’opérateur maximum, le/
replie dans une liste et\
obtient tous les préfixes de l’entrée.)Ensuite, nous comparons la liste initiale avec ces maxima d'égalité:
Et enfin, nous sélectionnons tous les éléments pour lesquels cette liste de résultats booléens a donné un
1
:la source
Haskell, 28 ans
Une fonction anonyme. Appelez ça comme
Équivalent à la récursion
Traduit itérativement, nous parcourons les éléments et, pour chacun d'entre eux, nous supprimons ceux qui sont plus petits que ceux-ci du reste de la liste sur laquelle nous parcourons. Merci à Antisthenes pour un octet enregistré avec
(x<)
.la source
foldr(\x->(x:).filter(>=x))[]
, cela s'avère être de la même longueur.x:
vous oblige à ajouter l'opérateur de points. Oh bien ...O(n^2)
bien. beaucoup de comparaisons inutiles. ;-(Python 2, 49
la source
max(a)
JavaScript (ES6), 29
Utilisation abusive de la conversion de type standard en javascript, d'un tableau à un autre:
la source
Octave,
2719 octetsla source
Pyth, 12 octets
Vérifiez tous les cas de test à la fois.
Comment ça fonctionne
la source
Brachylog , 5 octets
Essayez-le en ligne!
Gelée , 5 octets
Essayez-le en ligne!
Explication
C’est une situation rare: j’utilise un algorithme que personne n’utilise jusqu’à présent (pour autant que je sache, rapidement) et qui aboutit en quelque sorte à la même longueur dans deux langues de golf très différentes, avec une syntaxe et une syntaxe très différentes. jeux intégrés, avec une correspondance 1 à 1 entre les programmes (les commandes sont même dans le même ordre!). Il semblait donc plus logique de les combiner - en un sens, il s’agit du même programme, et je l’ai écrit dans les deux langues pour voir quelle version était plus courte - que de les soumettre séparément.
L'idée de base ici est que le dropsort d'une liste est sa sous-séquence avec l'inverse lexicographiquement maximum. Bizarrement, ni Brachylog ni Jelly n’ont la capacité de trouver le maximum par une fonction particulière (Jelly a pour fonction de renvoyer tous les maxima d’une fonction particulière, mais cela renverrait une liste de singleton contenant le résultat plutôt que le résultat lui-même, et n’est même pas plus court que de le faire de cette façon). Au lieu de cela, nous générons toutes les sous-séquences possibles, trions par inversion, prenons la dernière.
La raison pour laquelle "inverse lexicographiquement maximum" fonctionne est que la sortie choisie doit se terminer (et donc son inverse doit commencer) par le nombre le plus élevé dans la liste des entrées (il est facile de voir que la sortie du système de dropsort se terminera toujours par cela), et ne contient plus rien après ça (parce que prendre des sous-séquences préserve l’ordre). Répétez inductivement et nous nous retrouvons avec la définition de dropsort.
la source
Mathematica, 26 octets
la source
DeleteDuplicates
ne ressemble pas à elle retournerait{10, 10, 10, 10}
pour l' entrée{10, 10, 10, 9, 10}
DeleteDuplicates
avec deux arguments semble être un simple filtre.R,
2926 octetsCela crée un objet fonction qui accepte un vecteur
x
et revientx
après la suppression de tous les éléments dont la taille est au moins égale au maximum cumuléx
.3 octets sauvés grâce à flodel!
la source
K, 11 octets
En action:
la source
{x@&~<':x}
est un octet plus court.3 4 2 2 5
.{x@&~<':x}/
, mais c'est la même longueur.Java, 82 octets
Voici une boucle de sortie simple. Il maintient juste le maximum
m
et compare chaque élément.la source
a->{int m=a[0]...
Perl, 33 octets
Code de 32 octets +
-p
Si des espaces supplémentaires sont acceptables dans la sortie, vous pouvez supprimer 31 octets en supprimant
et
?
. Accepte une chaîne (ou un nombre de chaînes séparées par une nouvelle ligne) viaSTDIN
:la source
Python 3, 67
Jolie force brute. Changé en une fonction, parce que j'ai raté que c'était une réponse valide.
Version non-golfée:
la source
Haskell,
3837 octetsEnregistré 1 octet grâce à JArkinstall .
la source
$
à un octet entier!f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s
(Point-virgule utilisé parce que les commentaires n'autorisent pas les retours à la ligne)C # -
6864 ou132127 caractèresWhere
dans ce cas, effectue une itération dans la liste et évalue l'expression booléenne pour chaque élémentv
à l'indexi
de la liste. Si l'expression est évaluée à true, l'élément est ajouté au résultat. Le seul véritable truc pour l'expression booléenne est que C # court-circuite ou évalue dès qu'une condition est vraie. Cela empêche l'IndexOutOfRangeException
exception et conserve le premier élément de la liste.Si les entrées et les sorties doivent être des chaînes (je ne saurais le dire, je laisserai donc à l'OP le soin de décider.)
Décompresser un peu donne:
Dans ce cas, la deuxième ligne de la fonction utilise exactement la même logique que ci-dessus. Le
Select
saisit les éléments de la liste et les convertit enint
. L'appel àToList
1 force l'évaluation de la sélection et la transformevar
en aList<int>
au moment de la compilation, de sorte qu'elleWhere
fonctionne sur un ensemble d'entiers.Essayez-le sur C # Pad
Merci à VisualMelon pour avoir aidé à couper 4 octets et 5 octets respectivement. :)
1 liste de tutu?
la source
int[]f(int[]b)
, et vous pouvez utiliseri<1
plutôt quei==0
de raccourcir un peu cette vérification. Pour la version chaîne, vous pouvez également supprimer les crochets autour d'un seul argument dans un lambda (par exemple,(d)=>int.Parse(d)
peut êtred=>int.Parse(d)
. Je ne compte également que 67 octets, et non 68 dans votre original;)CJam, 15 octets
Essayez-le en ligne dans l' interprète CJam .
Comment ça fonctionne
la source
PowerShell , 32 octets
Essayez-le en ligne!
Moins joué au golf:
la source
C: 73 octets
ou
C: 49 octets
(Si l'en- tête de douane créé pour les compétitions codegolf est autorisé)
Je ne peux toujours pas battre CJam, mais au moins, cela permet de battre quelques autres langues.
la source
Burlesque, 13 octets
Solution de 11 octets qui réussit les tests:
Essayez en ligne ici .
Explication:
Cependant, cette version ne fonctionne qu'en utilisant le fait qu'il n'y a pas deux plus petits nombres entre deux nombres. Sinon, utilisez la version ci-dessous (qui est 13B):
Versions plus anciennes:
Essayez en ligne ici. Explication:
Si vous laissiez tomber également des nombres égaux, vous pourriez utiliser avec juste
.>
au lieu d'utilisercm
. En outre, si les listes ne contiennent que des nombres positifs que vous pouvez utiliser0
ou au-1
lieu deJ-]
.la source
Minkolang 0.9 , 18 octets
Essayez-le ici.
Explication
la source
Ruby,
4137 caractèresÉchantillon échantillon:
la source
-[p]
est plus court que.compact
NARS2000 APL, 13 octets
NARS2000 est un interpréteur APL gratuit pour Windows. il comprend des fonctionnalités multiset accessibles avec l'
⍦
opérateur.C'est un fork monadique qui prend l'intersection multiset (
⍦∩
) de l'entrée (+
) * et la liste des maximums en cours d'exécution (⌈\
).Comme il
⍦
ne s'agit pas d'un caractère APL standard dans les codages APL hérités d'un octet, nous devons utiliser UTF-8, les⍦∩⌈
caractères étant alors de trois octets. J'ai choisi+
au lieu de⊢
sauvegarder deux octets.NARS2000 prend en charge les fourches, qui peuvent être intégrées à des trains sans parenthèses, mais contrairement à Dyalog, elles ne permettent pas l'affectation d'une fonction sans placer la fonction entre parenthèses.
*
+
est conjugué techniquement complexe, mais l'entrée est réelle.la source
> <> avec l'option -v,
3631 + 2 = 33 octetsEntrez la liste sur la pile avec -v afin que le premier élément de la liste se trouve en haut de la pile. Il imprimera la liste des objets avec un espace de fin.
Essai :
Edit: 5 octets sauvegardés grâce à Fongoid
la source
:&\o" "&n:~& <
que ligne 2 en tant que~ >l?!;:&:&(?!^
Python,
1029994 +56 nouvelles lignes sans fichier =107105100 octets(J'ai utilisé des tabulations pour l'indentation)
Pas le meilleur sur le marché, mais c'est mon premier coup au code de golf. Impossible de trouver un moyen de trier la liste en ligne sans se heurter à des bogues liés à la suppression, j'ai donc déplacé les éléments commandés vers une liste temporaire.
EDIT: list.append () est plus court que la façon laide
r + = [i] était plus court que list.append (); merci njzk2 !
la source
Scala:
232126120 octetsla source
List[Int]
ne répond pas aux exigences, vous devez obtenir l'entrée via STDIN ou sous forme d'argument. De plus, cela gonfle votre réponse ... Pourquoi ne pas simplement l'avoirdef dropSort(s:Seq[Int]):Seq[Int]
?Scala, 54 octets
Ungolfed:
la source
Lisp minuscule, 107 octets
( Cette langue n’a été publiée qu’après cette question. Cette réponse est donc hors compétition. Elle n’a eu aucune chance de gagner. La langue a ensuite évolué pour avoir plus de versions que celles que j’avais utilisées ici, mais je reste avec le la version que j’avais initialement mise en oeuvre en 2015. Cette réponse fonctionne toujours avec le plus récent interpréteur officiel , bien qu’elle donne quelques avertissements car je définis un paramètre
a
qui masque la nouvelle constructiona
(pour l’ajout). Merci à DLosc pour le lien TIO. )(d r(q((m a)(i a(i(l(h a)m)(r m(t a))(c(h a)(r(h a)(t a))))()))))(d ds(q((b)(i b(c(h b)(r(h b)(t b)))()))))
Ceci définit une fonction
ds
(et sa fonction d'assistance récursiver
) qui trie son argument, qui doit être une liste d'entiers.r
n’est pas une fonction récursive, donc pour les très longues listes, cela peut entraîner un débordement de pile.Ungolfed:
Voici quelques exemples d'utilisation (avec les cas de test de la question):
(Ouais, ce
-7
n'est pas un littéral entier, nous devons donc définir une fonction pour les représenter.) Résultat:la source
r
, je suppose ..)ds
? Je suppose que cela pourrait être fait, permettrait d'économiser un autre octet. Je suppose que j'ai choisids
comme abréviation de drop sort.(d ds
les éléments correspondants)
à la fin. D'autres golfs sont possibles si vous souhaitez utiliser mon interprète actuel , mais si vous souhaitez vous en tenir aux spécifications de la question initiale, c'est très bien aussi. :)Gelée, 5 octets
Notez que le défi est antérieur à la création de Jelly.
Essayez-le en ligne!
Comment ça fonctionne
la source
Mathematica, 27 octets
la source