Comme décrit dans cette question :
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é.
Pour utiliser l' un de leurs cas de test, une entrée de {1, 2, 5, 4, 3, 7}
rendements {1, 2, 5, 7}
, comme 4
et 3
sont à la fois retranchée parce qu'elle est inférieure à la valeur précédemment « trié », 5
.
Nous ne voulons pas de "tri" des algorithmes, nous voulons qu'ils soient la vraie affaire. Par conséquent, je veux que vous écriviez un programme qui, étant donné une liste de numéros, produit une liste de listes DropSorted (comme un algorithme de tri complet, nous aurions besoin de fusionner ces listes, mais la fusion de deux listes triées a été fait avant, et vous demander de le refaire, c'est à peu près poser deux questions, cette question est donc précisément l'étape de "fractionnement" de notre liste déroulante complète).
La disposition et le contenu de nos listes sont toutefois cruciaux. La sortie de votre programme doit être équivalente à la sortie d'un DropSort, suivi d'un DropSort des valeurs ignorées, et ainsi de suite jusqu'à ce que vous n'ayez plus qu'une liste de chaînes triées. Encore une fois, en empruntant la suite de tests existante (et en ajoutant deux autres):
Input -> Output
{1, 2, 5, 4, 3, 7} -> {{1, 2, 5, 7}, {4}, {3}}
{10, -1, 12} -> {{10, 12}, {-1}}
{-7, -8, -5, 0, -1, 1} -> {{-7, -5, 0, 1}, {-8, -1}}
{9, 8, 7, 6, 5} -> {{9}, {8}, {7}, {6}, {5}}
{10, 13, 17, 21} -> {{10, 13, 17, 21}}
{10, 10, 10, 9, 10} -> {{10, 10, 10, 10}, {9}} //Note equivalent values aren't dropped
{5, 4, 3, 8, 7, 6} -> {{5, 8}, {4, 7}, {3, 6}}
{0, 2, 5, 4, 0, 7} -> {{0, 2, 5, 7}, {4}, {0}}
Vous pouvez supposer que l'entrée est non vide.
C'est code-golf , donc les règles standard s'appliquent!
[5, 4, 3, 8, 7, 6] -> [5, 8], [4,3,7,6]
?{3,4,5,3,4,5,3,4,5}
aboutir à{{3,4,5,5,5},{3,4,4},{3}}
?Réponses:
MATL ,
15109 octets5 octets en dehors de l'idée de @beaker du maximum cumulatif
L'entrée est un vecteur de ligne numérique, au format
[1, 2, 5, 4, 3, 7]
(les virgules sont facultatives). La sortie contient des listes séparées par des lignes, les numéros de chaque liste étant séparés par des espaces.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Étant donné un tableau, le code sélectionne chaque entrée égale au maximum cumulatif jusqu’à cette entrée.
Par exemple, étant donné
le code sélectionne les première, deuxième, troisième et sixième entrées:
Ensuite, le processus est répété sur le sous-réseau formé par les entrées restantes (dans l'ordre d'origine):
Cela doit être fait jusqu'à ce que le sous-tableau des entrées restantes soit vide. Une limite supérieure sur le nombre requis d'itérations est la taille d'entrée. Les dernières itérations peuvent ne pas être nécessaires. Dans ce cas, ils opèrent sur un tableau vide, produisant des tableaux supplémentaires vides.
A la fin, la pile contient les tableaux requis et éventuellement plusieurs tableaux vides, qui ne sont pas affichés du tout.
la source
Haskell,
67 5958 octetsExplication: À partir d'une liste de listes (déjà triées) et d'une valeur
x
, l'!
opérateur placex
à la fin de la première liste dont le dernier élément est inférieur ou égal àx
. Si cette liste n'existe pas, elle[x]
est placée à la fin.Essayez-le en ligne.
la source
Coque , 10 octets
Essayez-le en ligne!
Ceci est une combinaison de mon autre réponse Husk et de la réponse Haskell de xnor . Le duplicata
ü<
semble maladroit, mais je ne sais pas comment m'en débarrasser ...Explication
La fonction se
ü<
traduit parnubBy(>)
en Haskell. Il parcourt une liste de gauche à droite en conservant les éléments pour lesquels aucun élément précédemment conservé n’est strictement supérieur. En d'autres termes, il effectue un dropsort. Les éléments restants sont obtenus en prenant la différence de liste de la liste originale et le résultat deü<
.la source
Haskell , 50 octets
Essayez-le en ligne!
la source
\\
fonction: (Coque , 16 octets
Essayez-le en ligne!
Explication
Cette première ligne est la fonction principale et la seconde est une fonction d'assistance d'ordre supérieur (elle prend une fonction en tant qu'argument et renvoie une nouvelle fonction). Il est accessible par l'indice
₁
. L'idée est que₁≤
effectue des dropsort et₁>
donne les éléments restants.Dans la fonction principale, nous itérons la fonction restants
₁>
et appliquons la fonction dropsort₁≤
aux résultats.la source
Python 3 ,
131 112 10395 octetsMerci beaucoup @M. Xcoder pour un fracassant 19 octets !!
Merci beaucoup @ovs pour un nombre incroyable de 17 octets!
Essayez-le en ligne!
Explication:
la source
if-else
peut être effondré dans[m,d][i<m[-1]]+=[i]
.[m,d]
truc mais ça ne marchait pas ...(len(d)>0)
estbool(d)
, parce que les listes sont vides falsy en Python. +1, bonne solution!i,
est juste un raccourci pour(i,)
, qui est un tuple contenanta
.a,*x = x or [0]
est la décompression étendue de python3 . Voici un article SO utile sur ce sujet avec quelques exemples.Haskell ,
11310710292 octetsEssayez-le en ligne!
Cela semble vraiment long.
Explication
!
effectue le tri sélectif sur une liste pendant la#
collecte des rognages.g
puis à plusieurs reprises#
jusqu'à ce que la liste soit vide en enregistrant les résultats dans une liste.la source
head a
para!!0
enregistre un octet.APL, 27 octets
Explication:
⍵≡⍬:⍬
: si l'entrée est vide, retourne la liste videX←⍵≥⌈\⍵
: tous les nombres supérieurs ou égaux au maximum courant(⊂X/⍵)
: la liste de ces numéros,∇⍵/⍨~X
: suivi du résultat de l'exécution de cette fonction sur les nombres restantsla source
{⍵≡⍬:⍬⋄(⊂⍵~r),∇r←⍵/⍨⍵<⌈\⍵}
. Morten s'inquiète du manque de réponse à ses courriels. Est-ce que tout va bien?JavaScript (ES6), 64 octets
Ungolfed:
Afficher l'extrait de code
la source
?!
s'agissait d'un nouvel opérateur sophistiqué ...?!
(i,n,o=[])=>[i.filter(a=>(n||a)<=a?(n=a,1):!o.push([a])),...o]
Apparemment, les grands esprits pensent (en quelque sorte) pareils. Malheureusement, je n'arrive pas à supprimer davantage d'octets ... Remarquez simplement que vous pouvez supprimerf=
votre code, et peut-être que mon code pourrait vous donner quelques idées sur la façon de jouer encore plus au vôtre.f=
de mon code, car il est récursif. Votre approche est intéressante, mais elle ne semble pas fonctionner pour quelques cas de test. Par exemple, il retourne[[5,8],[4],[3],[7],[6]]
pour l'avant-dernier cas.R , 61 octets
Essayez-le en ligne!
Fonction récursive.
sum(x|1)
est un raccourci pourlength(x)
, donc cette récursion sera exécutée jusqu'à ce qu'ellex
soit vide.cummax
prend le maximum cumulatif dex
, qui est ensuite comparé àx
nouveau. Cela produit un vecteur booléen de longueurx
, où tous les TRUE correspondent à des valeurs triées. Nous utilisons que de prendre un sous - ensemblex
etprint
il. La fonction est ensuite rappelée le reste dex
.la source
Java 8,
182179177 octets-3 octets grâce à @Nevay .
-2 octets en utilisant
Stack
au lieu deVector
.Explication:
Essayez ici.
la source
try{}catch{}
au lieu de cocherl.size()
pour sauvegarder certains?0
et supprimer les crochets de la boucle for externel->{List r=new Vector(),t;for(int p,i,x;l.size()>0;)for(p=l.get(0),r.add(t=new Vector()),i=0;i<l.size();p=x)if((x=l.get(i++))>=p)t.add(l.remove(--i));return r;}
(-3 octets).C #,
188203 octetsLe nombre d'octets comprend +18 pour:
Essayez-le en ligne!
la source
C ++ 14,
118108 octetsUtilisation de l'algorithme de la réponse Haskell de w0lf .
En tant que lambda générique non nommé. Le premier paramètre est un conteneur des valeurs à abandonner (comme
vector<int>
) et le second paramètre nécessite un conteneur vide compatible de conteneurs (commevector<vector<int>>
) pour la valeur de retour via référence.Dans la première version du programme, il y avait
R.clear;()
comme première déclaration, de sorte que le conteneur de conteneurs n'avait pas besoin d'être vide. Peter Cordes pensait que cela pourrait figurer dans la spécification, supprimant ainsi 10 octets.Essayez-le en ligne!
Ungolfed:
la source
R.clear()
, et demander simplement à l'appelant de commencer avec un conteneur vide.Python 2 , 88 octets
-4 octets grâce à Arnold Palmer
Essayez-le en ligne!
Solution similaire à haskell de @ w0lf [réponse] [1]
Cas d'utilisation rare pour la
for-else
constructionParcourez les listes triées
for l in r
(vides au début).Si element (from input)
i
est plus grand que le dernier élément de la listel[-1]
, ajoutez un élément à la listel+=[i]
, break.Si aucune liste n'a été acceptée, ajouter une nouvelle liste avec cet elemens
r+=[[i]]
la source
R, travail en cours (89, mais échec)
Garder du travail ici, parce que je me
%in%
suis laissé aller dans un coin en utilisant (il échoue sur les entrées en double, en particulier le dernier cas de test), et je dois aller faire autre chose maintenant, mais ceci est ici si quelqu'un veut en tirer parti:Ungolfed:
la source
z=function(x)"if"(sum(x|1),{a=x[(i=x>=cummax(x))] c(list(a),z(x[!i]))},NULL)
works]
andc
is a newline (or semicolon)"if"
before, but I'm pretty new to R golfing. You should post as your own answer, and I can take mine down. I like what you did with thei
index, to get around the%in%
problem.cummax
!JavaScript (ES6),
717068 bytesPretty simple, just iterates the array, looks for the first inner array whose last value is
<=
to the next value to drop, if none exists, append a new inner array with the next value to the output, otherwise append the next value to the first found inner array that matches the condition.Updates
Thanks to Neil, saved three bytes converting
(...,o)
to...&&o
and re-organizing the callback tomap()
to be more compact.la source
&&o
is a byte shorter than(,o)
.[...b].pop()
, but I think(o.find(b=>[...b].pop()<=n)||(n=[n],o)).push(n)
saves you a byte or two.Japt, 29 bytes
Test it online!
la source
C (gcc),
176175173 bytesTry it online!
Somewhat readable version:
la source
PHP,
911039685 bytes(Edited to add 12 chars of
print_r($r);
to meet requirement to output)(Edited to remove 7 bytes when allowing PHP Errors)
(Edited to remove 11 bytes when golfing the assignment further)
Given input
$a
, it produces result$r
Pretty:
The pseudo-recursive outer loop initializes the keep
$b
and discard$d
arrays to empty, then does a basic drop sort loop, finally setting the discards as the new input and adding the keeps to the result$r
la source
PHP,
102 bytes, 98 bytesTry it online!
-4 bytes, thanks to @Umbrella
Explanation
The function takes the input list as an array.
$s
, which will become the finally returned list of lists, is declared static. This extends its scope to all calls of this function, allowing the function to be called recursively without having to pass this result list as an argument or to return it.Loop through each value in the list.
Is it less than the biggest current list member?
Yes, put it on list
$f
for further sorting.No, put it on list
$l
.Push list
$l
onto the list of lists.If there's anything in list
$f
, send it round again for further sorting.Return the list of lists.
la source
<?php function d($a){return$r;}
, you heartily crushed me. Aside, I just realized we both forgot to output.$v<max($l)?$f[]=$v:$l[]=$v;
with${$v<max($l)?f:l}[]=$v;
-- at least, it works in my tests.Sage, 102 bytes
Very similar to @Dead Possum's answer.
Appends each member
x
ofw
to the first list ina
{list of lists} withx
greater than it's last element.if none, appends
[x]
toa
.I would really like it if
exists
returneda
if nothing was found! Also trying to apply @officialaimm's one-line idea ...Question: If I removed my code from the function, I'd have to assign
w
to input right? So would it save bytes?la source
Ocaml,
6962 bytesExplanation:
la source
APL,
1008883797857567776 bytes-0 bytes thanks to Kritixi Lithos...
Try it online!
There's got to be some better way to do this (There is). Any tips are very greatly appreciated and welcome.
How?
(Note, some of this explanation might be wrong, as I forgot how this worked)
la source
{⍬≢⍴⍵}
can become(⍬≢⍴)
{(⍵/⍨~E),⊂⍵/⍨E←(⍬≡⍴)¨⍵}
? It seems to be separated from everything else[[1,2,5,7],[4],3]
, instead of the required[[1,2,5,7],[4],[3]]
.(,¨)
Jelly, 26 bytes
This is the same method as marinus' APL answer.
Try it online!.
la source
JavaScript (Node.js),
125109106 bytes-
1618 bytes from Zacharý-1 by removing
{
and}
by changing the incrementer to include the "set last to the current"Basically, asks is the current item greater than the last item, add to the first list. Otherwise, add to the second.
Found out during this that comparing any number to
NaN
will always resultfalse
. Interesting!Explanation:
Try it online!
la source
var
?x
.