Inspiré par une question sur Stack Overflow. Le titre ici est entièrement de ma faute.
Le défi
Étant donné une liste d'entiers positifs contenant au moins deux entrées, remplacez chaque nombre par le minimum de toutes les entrées qui l'excluent.
Cas de test
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Règles
L'algorithme devrait théoriquement fonctionner pour toute taille d'entrée (supérieure à un) et toutes valeurs (nombres entiers positifs). Il est accepté si le programme est limité par le temps, la mémoire ou les types de données et ne fonctionne donc que pour les nombres jusqu'à une valeur donnée ou pour la taille d'entrée jusqu'à une valeur donnée.
Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les échappatoires standard sont interdites.
La saisie peut être prise par n'importe quel moyen raisonnable ; et avec n'importe quel format. Idem pour la sortie. Les formats d'entrée et de sortie peuvent être différents.
Le code le plus court en octets gagne.
la source
[4 3 2 2 5]
sortir?[4 3 2 2 5]
la sortie serait[2 2 2 2 2]
(c'est similaire au deuxième cas de test)Réponses:
Gelée ,
965 octetsEssayez-le en ligne!
Vérifiez tous à la fois!(légèrement modifié)
Je suis à peu près sûr que Dennis pourra jouer au golf.
Comment ça marche
L'algorithme est plutôt compliqué. Observons ce que cela fait
[4,2,2,5]
.Tout d'abord, nous utilisons
J
pour obtenir[1,2,3,4]
. Notez que Jelly utilise 1-indexing.Ensuite, on voit
ṙ
. Il faut deux arguments: un tableau et un entier. Il fait pivoter le tableau vers la gauche d'une quantité spécifiée par l'entier. Ici,ṙ
on verrait[4,2,2,5]
à sa gauche et[1,2,3,4]
à sa droite (on trouvera plus de détails sur la façon dont cela fonctionne dans le tutoriel). ). En Jelly, les commandes sont implicitement vectorisées. Par conséquent, cette commande sera exécutée sur chaque élément individuel à droite, c'est pourquoi nous créerions un tableau 2D:Par conséquent,
[4,2,2,5]ṙ[1,2,3,4]
devient[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
ce qui devient:Notez que les éléments d'origine se trouvent sur la dernière ligne, car dans cette ligne, nous avons effectué une rotation vers la gauche d'un montant égal à la longueur du tableau. C'est pourquoi nous utilisons
Ṗ
ensuite pour supprimer cette ligne, de sorte que les colonnes constituent les collections de les éléments du tableau qui ne sont pas à l'index actuel:L'opération suivante
«/
, est également assez compliquée. Tout d'abord,«
renvoie le minimum des deux nombres qu'il voit à sa gauche et à sa droite. Par exemple,5«3
retourne3
. Maintenant, si les deux arguments sont des tableaux, alors cela vectoriserait comme je l’ai dit plus haut. Qu'est-ce que cela signifie que[1,5,2,3]«[4,1,5,2]
cela deviendrait[1«4,5«1,2«5,3«2]
ce qui est[1,1,2,2]
. Now,/
isreduce
, ce qui signifie que nous effectuons l'opération sur chaque ligne jusqu'à la fin. Par exemple,[1,2,3,4]+/
deviendrait((1+2)+3)+4
, qui est la somme du tableau[1,2,3,4]
.Donc, si nous appliquons
«/
au tableau 2D que nous venons d'obtenir, nous obtiendrions:qui, du fait de la vectorisation, équivaudrait à:
qui calcule le minimum de chaque tableau sans l'élément à l'index.
la source
Python 2 , 41 octets
Essayez-le en ligne!
Pour chaque élément,
x
nous vérifions six==min(l)
. Si ce n'est pas le cas, il estFalse
traité comme0
s'il était utilisé comme un index de liste ensorted(l)
donnant le plus petit élément. Dans le cas contraire, il estTrue
aka1
, donnant le deuxième plus petit élément, puisque cet élément lui - même est le plus petit et doit être ignorée.la source
False
se convertir0
et deTrue
se convertir1
sont vraiment refroidir et devrait être vanté d'avoir ^ W ^ WexplainedGelée , 5 octets
Essayez-le en ligne!
Comment?
la source
Haskell ,
424139 octetsMODIFIER:
f
prend une liste d'entiers (ou n'importe quelOrd
type) et retourne une liste.Essayez-le en ligne!
f
récursive en faisant tourner la liste.x
est le premier élément de la liste ety
le reste. Comme la récursion est infinie, la liste des résultats doit être coupée:fst<$>zip...y
c'est une façon plus courte de diretake(length y)...
.la source
@
et retourner les listes pour être compressé:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Octave, 26 octets
Une approche similaire à celle utilisée dans cette réponse , qui se trouve être la même chose que ceci .
Je ne suis pas vraiment fan de simplement porter d'autres réponses, c'est pourquoi j'aimerais souligner que j'avais une idée similaire avant de voir les autres.
Explication:
Jonathan Allan a déjà fourni une bonne explication pour le code Jelly, il couvre donc le bit Octave et explique pourquoi cela fonctionne (et ne fonctionnerait pas dans MATLAB).
Cela ne fonctionne pas dans MATLAB, car les assignations en ligne et l'indexation directe ne fonctionnent pas.
sort(x)(1)
donne une erreur dans MATLAB, pas le premier élément du vecteur trié.la source
Haskell, 41 octets
Exemple d'utilisation:
([]#) [4,3,2,5]
->[2,2,3,2]
. Essayez-le en ligne!Commencez avec un accumulateur vide
a
et parcourez la liste des entrées. L'élément suivant dans la liste de sortie est le minimum de l'accumulateura
et tout sauf le premier élément de la liste d'entrée (->c
) suivi d'un appel récursif avec le premier élémentb
ajouté à l'accumulateur etc
. Arrêtez-vous lorsque vous atteignez la fin de la liste de saisie.la source
JavaScript (ES6),
5046 octetsEdit: 4 octets enregistrés grâce à @Arnauld.
la source
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
pour 43 octets.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
pour 46.Brachylog ,
1312 octetsEssayez-le en ligne!
Sauvegardé d'un octet grâce à @ ais523.
Explication
Nous exploitons le fait que l'
⊇
uniformise les sous-ensembles du plus grand au plus petit. Par exemple pour[1,2,3]
les sous - ensembles que nous recevons sont dans cet ordre:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Nous pouvons voir que les sous
[1,2], [1,3], [2,3]
- ensembles sont ceux dont nous voulons le minimum, mais sont dans l'ordre inverse de la liste d'entrée (d'où le↔
). Nous pouvons sélectionner ces sous-ensembles uniquement en recherchant les premierslength(Input) + 1
sous-ensembles, qui les contiendront tous + la liste complète en premier. Nous supprimons toute cette liste avecb
.la source
En fait , 13 octets
Utilise la même technique que xnor a également découverte .
Essayez-le en ligne!
Explication:
la source
R,
4631 octetsimplémente la solution de Stewie Griffin dans R, hélas, mon idée originale est 50% plus longue! lit toujours la liste à partir de stdin, mais renvoie maintenant un vecteur numérique beaucoup plus lisible.
Essayez-le en ligne!
ancienne implémentation:
lit dans la liste de stdin. Un index négatif
l[-x]
exclut l'élément de la liste etmatch(l,l)
renvoie l'index de la première occurrence de chaque élément de la liste. Retourne une liste.la source
Python 2, 51 octets
Je sais qu'il existe déjà une meilleure solution Python, mais je souhaite toujours publier la mienne.
Essayez-le en ligne
la source
Mathematica 34 octets
la source
PowerShell ,
6859 octetsEssayez-le en ligne!
Je suis assez confiant que cela peut être raccourci, je vais continuer à le regarder
la source
C, 85 octets
Le premier argument est le tableau d'entiers en entrée. Le deuxième argument est le tableau entier en sortie. Le troisième argument est le nombre d'éléments pour les deux tableaux.
Voir le travail en ligne .
la source
Perl 6 ,
26 2419 octets26
Notez que c'est
∖
U + 2216 pas\
U + 5CL'essayer
L'essayer
24
L'essayer
19
L'essayer
26
J'ai utilisé les opérateurs unicode "fantaisistes" plutôt que les équivalents ascii, car ils auraient eu besoin d'un espace devant eux pour ne pas être analysés dans le cadre de l'
.Bag
appel de méthode.24
19
(Les golfs de 24 et 19 octets ont été inspirés par une implémentation de Jelly )
la source
Clojure,
36816271 octetsLe plus récent (ne devrait pas vraiment les soumettre rapidement):
Essayez-le en ligne .
En outre, celui-ci ayant un bogue (62 octets), zipmap produit une carte non ordonnée afin que cela ne produise pas la séquence correcte sur des entrées plus volumineuses.
v
n'est pas réellement utilisé pour quoi que ce soit mais c'est plus court quei (keys c)
.Précédent à 81 octets:
Essayez-le en ligne .
Essayez-le en ligne .
Oh putain l'original (36 octets) ne fonctionne pas lorsque le nombre minimum est répété, les
[4 2 2 5]
résultats en[2 4 4 2]
tant que les deux2
s sont supprimés :(#{i}
est l'ensemble qui contient seulementi
, il retourne la véritéi
et la fausseté pour les autres, ce qui signifie que le minimum est calculé à partir de tous les autres nombres de la liste d'entrée.Essayez-le en ligne .
la source
Pyth,
87 octets-1 octet grâce à @isaacg
Essayez le!
la source
d
fin - elle est implicitement remplie.PHP, 72 octets
Version en ligne
la source
PHP, 47 octets
la source
Scala, 37 octets
l
est une collection de Int.Cas de test:
Cela peut probablement encore être joué au golf, je ne pouvais pas trouver un moyen plus court pour supprimer un élément d'une liste que
l diff Seq(l(i))
la source
C #, 36 octets
Prend les éléments (i) et recherche la valeur minimale dans les éléments sans l'élément en cours.
C’est un peu triste de constater que d’autres tentatives ne fonctionnent pas, car nous travaillons avec des types primitifs et nous n’avons donc pas de listes avec des références permettant de comparer les éléments.
la source
PowerShell ,
4938 octets-11 octets grâce à mazzy
Essayez-le en ligne!
Amélioration de la belle réponse de Sinusoid . Enregistre 10 octets en utilisant une sortie explicite au lieu de construire un tableau. Indexe dans le tableau trié vers le point 0 (c'est-à-dire la plus petite valeur) ou le point 1 si la condition est vraie.
la source
Perl 5, 43 bytes
Equivalent to the Python solution. Perl's
sort
unfortunately has the wrong default for numbers (requiring an explicit comparator), andmin
isn't built-in, but it almost makes up for it bysub
being shorter thanlambda
,map$_,
being shorter thanx for x in
, and the implicitness of return and args lists.la source
Ruby, 30 bytes
For each element, sort the array, remove the current element and grab the first element of the remaining array.
It's an anonymous function that can be used like this:
la source
CJam, 15 bytes
Essentially a translation of xnor's algorithm into CJam.
This is an unnamed block that takes an array from the stack and leaves the result on the stack.
Explanation:
la source
05AB1E, 5 bytes
Port of @xnor's Python 2 answer.
Try it online or verify all test cases.
Explanation:
la source
Java 8, 119 bytes
Port of @xnor's Python 2 answer.
Modifies the input-array instead of returning a new one to save bytes.
Try it online.
Explanation:
la source
APL (Dyalog Extended), 7 bytes
Port of xnor's Python 2 answer. Requires
⎕IO←0
:Try it online!
Explanation:
la source
Haskell, 76 bytes
This is considerably longer than the earlier Haskell entries, but it's the first that only performs a linear number of comparisons and a linear amount of additional work.
Try it online!
Explanation
!
takes two arguments: a running minimum and a nonempty list. It returns the minimum value in the list and the result of processing the given list using the running minimum.la source
MathGolf,
97 bytesTry it online!
Explanation
Basically a port of Kevin Cruijssen's 05AB1E answer, but I lose 2 bytes thanks to having to do things explicitly.
la source