Je souhaite supprimer la première instance de la valeur la plus basse du tableau.
[...] #=> [2,3,1,2,3]
Mais mon code supprime toutes les instances de la valeur la plus basse du tableau. Je veux un résultat tel que:
arr = [1,2,3,1,2,3]
arr.reject {|i| i == arr.min}
#=> [2,3,2,3]
Quelle est la solution la plus élégante à ce problème?
3 Réponses :
À première vue, voici quelques options:
arr.delete_at arr.index(arr.min) || 0
arr.delete_at(arr.each_with_index.min[1]) # or arr.delete_at(arr.each_with_index.min.pop) # or arr.delete_at(arr.each_with_index.min.last)
La première est moins code et plus lisible mais fait deux passages dans la liste au lieu de une. J'ai des doutes quant à savoir si une autre construction dépassera l'option n ° 1 en élégance, aussi moche que cela puisse être (ou pas?).
Notez que les deux choix plantent sur un tableau vide. Voici une version plus sûre:
arr.delete_at(arr.index(arr.min)) # or less readable but still valid arr.delete_at arr.index arr.min
J'apprécierais votre réponse mais je n'ai pas assez de félicitations pour le faire! Merci de prendre le temps de répondre. J'ai aussi trouvé une bonne solution sur Code Kata `` `` arr.reject.with_index {| _, i | i == arr.index (arr.min)} `` Gracieuseté de 'Instu': codewars.com / users / Insti
Merci! Le problème avec cette solution est que les appels imbriqués .index / .min détruisent la complexité temporelle (O (n ^ 2)), mais agréable à regarder quand même.
Juste par curiosité:
[1,2,3,1,2,3].tap { |a| a.delete_at a.each_with_index.min.last }
#â [2, 3, 1, 2, 3]
Vous pouvez utiliser Enumerable # drop_ while à cet effet
arr = [1,2,3,1,2,3]
arr.drop_while { |i| i == arr.min }
#=> [2, 3, 1, 2, 3]
Ce code supprime les occurrences de la valeur minimale depuis le début, par ex. [1,1,2] devient [2] tandis que [2,1,1] reste inchangé.
arr [0 ... min_index] + arr [min_index + 1 ..- 1]L'ordre est-il important? Sinon,
arr.sort.drop (1)peut s'en occuper.