2
votes

Comment supprimer une seule valeur d'un tableau dans Ruby?

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?


2 commentaires

arr [0 ... min_index] + arr [min_index + 1 ..- 1]


L'ordre est-il important? Sinon, arr.sort.drop (1) peut s'en occuper.


3 Réponses :


3
votes

À 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    


2 commentaires

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.



1
votes

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]


0 commentaires

1
votes

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]


1 commentaires

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é.