На первый взгляд, вот несколько вариантов:
arr.delete_at(arr.index(arr.min))
# or less readable but still valid
arr.delete_at arr.index arr.min
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)
Первый код меньше и более читабелен, но делает два прохода по списку вместо одного. У меня есть сомнения относительно того, превзойдет ли любая другая конструкция элегантность первого варианта, какой бы ужасной она ни была (или не может быть?).
Обратите внимание, что оба варианта аварийно завершают работу на пустом массиве. Вот более безопасная версия:
arr.delete_at arr.index(arr.min) || 0